2017-02-07 5 views
1

Springの設定が間違っているのは本当にわかりません。私に手を差し伸べてもらえますか?Springでjava.lang.NoClassDefFoundErrorを取得し続ける

マイコード(簡易版):

App.java:

public class App { 
public static void main(String[] args) { 
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class); 
    ctx.close(); 
} 

}

Config.java:

@Configuration 
@ComponentScan 
public class Config { 
    @Bean 
    public JdbcOperations jdbcTemplate(DataSource ds) { 
     return new JdbcTemplate(ds); 
    } 
} 

POMファイル:

<properties> 

    <!-- Generic properties --> 
    <java.version>1.6</java.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 

    <!-- Spring --> 
    <spring-framework.version>4.2.5.RELEASE</spring-framework.version> 

    <!-- Hibernate/JPA --> 
    <hibernate.version>4.2.1.Final</hibernate.version> 

    <!-- Logging --> 
    <logback.version>1.0.13</logback.version> 
    <slf4j.version>1.7.5</slf4j.version> 

    <!-- Test --> 
    <junit.version>4.11</junit.version> 

</properties> 

<dependencies> 
    <!-- Spring and Transactions --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${spring-framework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>${spring-framework.version}</version> 
    </dependency> 

    <!-- Logging with SLF4J & LogBack --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>${logback.version}</version> 
     <scope>runtime</scope> 
    </dependency> 

    <!-- Hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>${hibernate.version}</version> 
    </dependency> 


    <!-- Test Artifacts --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>${spring-framework.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>${junit.version}</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>4.2.5.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
     <version>1.4.185</version> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <!-- Build an executable JAR --> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>App</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

マイフォルダ構造:

私はパッケージにそれをMavenの後、私は私が得たjarファイルを実行する場合:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/annotation/AnnotationConfigApplicationContext 
     at App.main(App.java:10) 
Caused by: java.lang.ClassNotFoundException: org.springframework.context.annotation.AnnotationConfigApplicationContext 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

をライン10はまたAnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

あり、ここで: 私は春のチュートリアルを練習していたときにコードを書いています:Spring Framework Tutorial 4: Database programming with JdbcTemplate

彼のソースコードは:github ソースコードとの唯一の違いは、pomファイルにMainClassを追加したことです。

ありがとうございました!実際には、デフォルトではPOMファイルで参照されているJARファイルのいずれかが含まれていませんのmaven-jarファイル、プラグインので、あなたがそれを取得している
敬具

答えて

0

理由があります。

これを並べ替える方法はいくつかありますが、this answerは非常に包括的です。

また、POMのメインクラスを参照するときは、完全修飾クラス名(net.ubilife.spring.customerjdbc.App)で参照する必要があります。

+0

ありがとう: MVNきれいな日陰をインストール!しかし、アプリケーションはルートフォルダにあります。私はちょうど私の質問のフォルダ構造をアップロードしています。 – Spider

0

あなたのjarファイル内には、依存関係のないクラスしかありません。あなたのjarファイル内にすべての依存関係を含めるには、fat jarファイルを作成する必要があります。

はのpom.xml内で次のようにビルドブロックを交換してください:

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.4.1</version> 
       <configuration> 
        <!-- get all project dependencies --> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
        <!-- MainClass in mainfest make a executable jar --> 
        <archive> 
         <manifest> 
          <mainClass>App</mainClass> 
         </manifest> 
        </archive> 

       </configuration> 
       <executions> 
        <execution> 
         <id>make-assembly</id> 
         <!-- bind to the packaging phase --> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

MVNきれいなパッケージを実行した後、あなたが最初のものは、依存関係なしで2つ目は、依存関係にある、あなたのターゲットディレクトリ内の2つのJARを取得します。 2番目の瓶を動かしてください。

  1. CustomerJdbc-0.0.1-SNAPSHOT.jarに
  2. CustomerJdbc-0.0.1-SNAPSHOT-ジャーと-dependencies.jar
0

また、jarファイルを構築するためのシェードとそれを実行することができます依存関係を持つ。

「シェード:シェード」を目標に追加するだけです。

例:お返事するシェード

関連する問題