2017-02-07 7 views
1

Ich weiß wirklich nicht, was ist los mit meiner Spring-Konfiguration. Kannst du mir die Hand geben?Keep bekommen java.lang.NoClassDefFoundError im Frühjahr

Mein Code (vereinfachte Version):

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-Datei:

<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> 

Meine Ordnerstruktur:

Nachdem ich maven Paket es, wenn ich laufe das Glas Ich habe:

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) 

, in dem die Linie 10 die AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

Zusätzlich ist : Ich schreibe den Code, als ich ein Frühling Tutorial lernte: Spring Framework Tutorial 4: Database programming with JdbcTemplate

Und sein Quellcode ist: github Der einzige Unterschied mit dem Quellcode ist, dass ich die MainClass in der Pom-Datei hinzugefügt habe.

Vielen Dank!
Mit freundlichen Grüßen

Antwort

0

Der Grund, dass Sie bekommen das ist, weil die maven-jar-plugin hat eigentlich keine der JAR-Dateien zu enthalten, die in der POM-Datei standardmäßig referenziert werden.

Es gibt ein paar Möglichkeiten, die Sie aussortieren können, scheint this answer ziemlich umfassend.

Beachten Sie außerdem, dass Sie beim Verweisen auf die Hauptklasse im POM auf den vollqualifizierten Klassennamen (net.ubilife.spring.customerjdbc.App) verweisen müssen.

+0

Vielen Dank für Ihre Antwort! Aber die App ist im Stammordner. Ich habe gerade die Ordnerstruktur in meine Frage hochgeladen. – Spider

0

Der Grund dafür ist, dass Sie in Ihrem Jar nur Ihre Klassen ohne Abhängigkeiten haben. Um alle Abhängigkeiten in Ihrem Jar zu integrieren, müssen Sie ein Fettglas erstellen.

Ersetzen Sie Ihren Build-Block mit folgenden innerhalb 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> 

Nach mvn sauber Paket laufen Sie zwei Glas in Ihrem Zielverzeichnis erhalten wird, ist zunächst eine ohne Abhängigkeit und die zweite ist mit Abhängigkeiten. Führe das zweite Glas aus.

  1. CustomerJdbc-0.0.1-SNAPSHOT.jar
  2. CustomerJdbc-0.0.1-SNAPSHOT-jar-with-dependencies.jar
0

Sie können es auch mit Schatten führen Sie das Glas bauen mit den Abhängigkeiten.

Fügen Sie einfach "Schatten: Schatten" zu den Zielen hinzu.

Beispiel: mvn sauber installieren Schatten: Schatten

Verwandte Themen