2015-01-13 93 views
5

我有一个使用Spring运行json web服务的Maven项目。该项目在NetBeans中运行良好。它被编译成一个jar文件,并且这个jar文件在Ubuntu VM中运行良好。但是,当我尝试在Windows中运行该jar文件时,出现以下错误。Spring Maven项目commons-logging LogFactory NoClassDefFoundError

Java的罐子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 

我花了一整天试图弄清楚这一点,但没有成功。

任何人都可以摆脱任何光线?

这是我下面的pom.xml。

<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

如果我提取jar文件的内容并查看MANIFEST.MF,它不包含类路径。这可能是为什么它找不到公用记录库? – MNPHX

回答

1

你包括你的commons-logging依赖以下:

<scope>provided</scope> 

这是为了防止commons-logging被包含在您的广口瓶中的指令。因此它不在类路径上。

+0

我从pom.xml中删除了提供的,并重新编译了jar文件,但我仍然得到相同的错误。我在新的jar文件上做了“jar tf”,它显示了commons-logging-1.1.1.jar包含在我的jar文件中。 – MNPHX

+0

您正在使用Spring Boot,因此您实际上不需要添加任何日志记录依赖关系。事实上,你似乎试图用较低的版本覆盖内置的公共日志记录依赖关系。尝试彻底删除该依赖项。 – Steve

+0

我删除了依赖项,但仍然收到相同的错误。 – MNPHX

10

Spring Framework使用Apache Commons Logging API进行日志记录。 在Spring Boot父级POM中,明确排除了Commons Logging库。

<exclusion> 
    <artifactId>commons-logging</artifactId> 
    <groupId>commons-logging</groupId> 
</exclusion> 

这意味着它将由您在运行时为Spring类提供一个选定的Commons Logging实现。

您可以添加共享记录你的POM,最新的版本是1.2,在7月发布的2014年

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

或者你可以弥合的Apache共享与jcl-记录API来SLF4J API(见http://www.slf4j.org/legacy.html) over-slf4j.jar,然后添加您选择的SLF4L实现。例如:

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

使用jcl-over-slf4j解决了我的问题 –

+0

jcl-over-slf4j是slf4j的桥梁。接下来,您可以添加say,logback,这是一个实现,而不是slf4j-simple。上面的slf4j-simple是一个slf4j实现。 –

相关问题