2015-01-13 11 views
5

Ich habe ein Maven-Projekt, das Spring verwendet, um einen JSON-Webdienst auszuführen. Das Projekt läuft in NetBeans einwandfrei. Es wird in eine JAR-Datei kompiliert und die JAR-Datei läuft in einer Ubuntu-VM einwandfrei. Wenn ich versuche, die JAR-Datei in Windows auszuführen, erhalte ich den folgenden Fehler.Spring Maven-Projekt commons-Protokollierung LogFactory NoClassDefFoundError

java -jar myjar.jar --server.port = 8000

java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53) 
     at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 
     at org.springframework.core.io.support.SpringFactoriesLoader.<clinit>(SpringFactoriesLoader.java:58) 
     at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:368) 
     at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:359) 
     at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:230) 
     at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:206) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:961) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:950) 
     at com.baselayer.dal.core.Application.main(Application.java:20) 
     ... 6 more 
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     ... 14 more 

Ich habe einen ganzen Tag damit verbringen, um dies herauszufinden, ohne Erfolg.

Kann jemand Licht abgeben?

Dies ist mein pom.xml unten.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.baselayer</groupId> 
    <artifactId>dal</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>Baselayer Core DAL</name> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.0.RELEASE</version> 
    </parent> 


    <properties> 
     <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
        <compilerArguments> 
         <endorseddirs>${endorsed.dir}</endorseddirs> 
        </compilerArguments> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin>  
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.6</version> 
       <executions> 
        <execution> 
         <phase>validate</phase> 
         <goals> 
          <goal>copy</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${endorsed.dir}</outputDirectory> 
          <silent>true</silent> 
          <artifactItems> 
           <artifactItem> 
            <groupId>javax</groupId> 
            <artifactId>javaee-endorsed-api</artifactId> 
            <version>7.0</version> 
            <type>jar</type> 
           </artifactItem> 
          </artifactItems> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies>   
     <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.1.1</version> 
      <scope>provided</scope> 
     </dependency>  
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-redis</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-cassandra</artifactId> 
      <exclusions> 
       <exclusion> 
        <artifactId>antlr</artifactId> 
        <groupId>org.antlr</groupId> 
       </exclusion> 
       <exclusion> 
        <artifactId>metrics-core</artifactId> 
        <groupId>com.yammer.metrics</groupId> 
       </exclusion> 
       <exclusion> 
        <artifactId>liquibase-core</artifactId> 
        <groupId>org.liquibase</groupId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>com.datastax.cassandra</groupId> 
      <artifactId>cassandra-driver-mapping</artifactId> 
      <version>2.1.2</version> 
      <type>jar</type> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-rest</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
     </dependency> 
     <dependency> 
       <groupId>org.codehaus.jackson</groupId> 
       <artifactId>jackson-core-asl</artifactId> 
       <version>1.9.2</version> 
       <type>jar</type> 
     </dependency>   
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-pool2</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>redis.clients</groupId> 
      <artifactId>jedis</artifactId> 
     </dependency> 
    </dependencies>  
</project> 
+0

Wenn ich den Inhalt der JAR-Datei entpacken und die MANIFEST.MF anzeigen, enthält es keinen Klassenpfad. Könnte das der Grund sein, warum es die Commons-Logging-Bibliothek nicht finden kann? – MNPHX

Antwort

1

Sie enthalten die folgenden auf Ihrer commons-logging Abhängigkeit:

<scope>provided</scope> 

Dies ist ein Befehl commons-logging zu verhindern, dass in Ihrem Glas eingeschlossen sind. Daher ist es nicht auf dem Klassenpfad.

+0

Ich entfernte die bereitgestellten aus der pom.xml und kompilierte die JAR-Datei, aber ich bekomme immer noch den gleichen Fehler. Ich habe "jar tf" in der neuen JAR-Datei und es zeigt, dass die Commons-Protokollierung-1.1.1.jar in meinem Jar enthalten ist. – MNPHX

+0

Da Spring Spring verwendet wird, sollten Sie eigentlich keine Protokollabhängigkeiten hinzufügen müssen. Tatsächlich scheinen Sie versucht zu haben, die Build-in-Commons-Logging-Abhängigkeiten mit einer niedrigeren Version zu überschreiben. Versuchen Sie, diese Abhängigkeit vollständig zu entfernen. – Steve

+0

Ich entfernte die Abhängigkeit, aber ich bekomme immer noch den gleichen Fehler. – MNPHX

10

Das Spring Framework verwendet die Apache Commons Logging API für die Protokollierung. In Spring Boot Eltern POM gibt es einen expliziten Ausschluss der Commons Logging-Bibliothek.

Dies bedeutet, dass es Ihnen überlassen ist, zur Laufzeit eine ausgewählte Commons Logging-Implementierung für Spring-Klassen bereitzustellen.

Sie können commons-logging zu Ihrem POM hinzufügen, ist die neueste Version 1.2 im Juli veröffentlicht 2014

<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging</artifactId> 
    <version>1.2</version> 
</dependency> 

Oder Sie können Apache Commons brücken Logging API SLF4J Api (siehe http://www.slf4j.org/legacy.html) mit dem jcl- over-slf4j.jar und fügen Sie dann eine SLF4L-Implementierung Ihrer Wahl hinzu. Beispiel:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-simple</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
</dependency> 
+1

mit jcl-über-slf4j löste mein Problem –

+0

jcl-über-slf4j ist Slf4j Brücke. Als Nächstes können Sie anstelle von slf4j-simple say, logback, das eine Implementierung ist, hinzufügen. Das obige slf4j-simple ist eine slf4j-Implementierung. –