2017-02-07 6 views
1

Я действительно не знаю, что не так с моей конфигурацией 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); 
    } 
} 

ПОМ файла:

<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 пакет это, когда я бегу баночку я получил:

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 Единственная разница с исходным кодом заключается в том, что я добавил MainClass в файл pom.

Большое вам спасибо!
Искренне

ответ

0

Причина, по которой вы получаете это потому, что Maven-банка-плагин фактически не включает в себя какой-либо из баночки, на которые ссылаются в файле POM по умолчанию.

Есть несколько способов, которыми вы можете разобраться, this answer кажется довольно всеобъемлющим.

Также обратите внимание, что при ссылке на основной класс в POM вам необходимо ссылаться на это имя с полным классом (net.ubilife.spring.customerjdbc.App).

+0

Спасибо за ваш ответ! Но приложение находится в корневой папке. Я просто загрузил структуру папок в свой вопрос. – Spider

0

Причина в том, что внутри вашей банки есть только ваши классы без каких-либо зависимостей. Чтобы включить все зависимости в вашей банке, вам нужно создать толстую банку.

Замените блок сборки со следующими внутри 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> 

После запуска МВН чистый пакет, который вы получите два баночку внутри вашей целевой каталог, первая из них без зависимости и второй один с зависимостями. Запустите вторую банку.

  1. CustomerJdbc-0.0.1-SNAPSHOT.jar
  2. CustomerJdbc-0.0.1-SNAPSHOT-банку-с-dependencies.jar
0

Вы также можете запустить его с Shade, чтобы построить банку с зависимостями.

Просто добавьте «тень: тень» к воротам.

Пример: МВН чистой установки тени: тень