今天開發一個小工具,引用了Log4j,來記錄日志,在eclipse下運行,代碼正常,打包成jar放到doc命令行下運行報錯:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
? ? ? ? at miaogen.zeng.util.jdbc.Configuration.<init>(Configuration.java:20)
? ? ? ? at miaogen.zeng.util.jdbc.Configuration.getInstance(Configuration.java:37)
? ? ? ? at miaogen.zeng.service.index.main(index.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)
? ? ? ? ... 3 more
試了百度上各種方法。后來試了下導出 runable jar file試試。運行成功!
jar file和runable jar file 導出后的區別如下圖:
runable jar file:
jar file:
META-INF的文件區別
下文是轉載的解釋
直接運行 .class的方法 ? ? java ?-cp . ?com.network.Chat ?, 不用加.class后綴?
?? ?從eclipse中export 的jar file,僅僅是把.class打包了。所以執行這種jar file需要用 java -cp .;ch04.jar com.thnkjava.ch04, 如果你還應用到另外的lib庫,你必須在cp里說明,也就是 ?java -cp .;ch04.jar;lib01.jar;lib02.jar?com.thnkjava.ch04 來執行。事實上可以發現ch04.jar也在cp里面,說明ch04.jar就是lib庫,最后的參數指明了要被執行的類名。
?? ?如果從eclipse里export出的是 runnable jar file,那么個執行這個jar包的時候是不需要指明哪個類的,直接這樣執行 java -jar ch04.jar。原因就是jar包中的MANIFEST.MF內容不同。 runnable jar包中指明哪個類先執行,所以你可以用 java -jar ch04.jar來執行你想要執行的代碼,而不必指明具體哪個類。這個你可以打開 jar包查看MANIFEST.MF的區別,一目了然。
?? ? 生成runnable jar file時,有兩個選項,Extract required libraries into generated JAR 和 package?equired libraries into generated JAR。 前者是把你用到的.class 文件提取出來,后者則是把你所需要的所有jar包都打進一個包里。兩者的MANIFEST.MF文件內容也有所不同,這應該是eclipse造成的,IDE 做了自己的事情,具體就不研究了。