2015-09-03 69 views
4

我在我的java應用程序中使用了log4j 2.3。我通過maven添加了依賴關係。
當運行在Eclipse中的一切程序正常工作,但是當我與Maven打包,並嘗試運行jar我收到以下錯誤:log4j2 java.lang.NoClassDefFoundError:org/apache/logging/log4j/LogManager

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache logging/log4j/LogManager 
    at main.myclass.<clinit>(myclass.java:11) 
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager 


    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 1 more 

爲什麼不能夠找到類,同時運行它從一個罐子?

添加log4j 1.2也沒有工作。該計劃在日食中運行良好,所以應該沒有缺失依賴。

+0

您可能有一個依賴性崩潰,其中一個依賴關係對log4j 1.x具有傳遞依賴性。使用'mvn dependency:tree'來找到罪魁禍首。另外,請參閱http://stackoverflow.com/questions/26338387/unexpected-exception-java-lang-noclassdeffounderror-org-apache-log4j-logmanage – Tobb

+0

您需要在類路徑中包含log4j jar。你如何執行你的應用程序? – Amila

+0

有沒有辦法在eclipse中執行'mvn dependency:tree'?我沒有安裝用於命令行的maven,只是在eclipse中使用它。我在我的pom.xml中添加了log4j-cire(2.3)和log4j-api(2.3)作爲依賴項。我使用'java -har myApplication.jar'在命令行中運行它。 – Pabi

回答

8

當您從命令行運行應用程序jar時,相關jar在運行時不可用。您需要將這兩個插件中的任何一個包含到pom.xml中,以便在運行時提供您的依賴關係。

使用:行家遮陽簾插件

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.4.1</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
       <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
        <mainClass>org.sonatype.haven.HavenCli</mainClass> 
       </transformer> 
       </transformers> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 

使用:Maven的依賴,插件

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.8</version> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

當你將執行mvn package就會產生超級JAR /或依賴關係複製到輸出目錄。我會更喜歡maven-shade-plugin來生成一個jar將所有依賴關係。

+0

非常感謝,像'maven-shade-plugin'中的cahrm一樣工作。 – Pabi

+0

@Pabi ..很高興幫助你。 – Garry

+0

我有完全相同的問題,maven-shade-plugin不適合我。我使用maven-shaden-plugin,一旦它創建jar包,我用java -jar myapp.jar執行我的應用程序,並且繼續收到相同的錯誤。我究竟做錯了什麼? – user1624552