我使用SLF4J记录器。 jar
文件放在../lib
目录中。应用程序是使用maven和Netbeans创建的。但是我想自己做所有自学。
应用程序是用命令编译的(当然,在分号后面没有空格 - 为了更好的可读性,我添加了它们):
javac -cp ../lib/poi-3.10-FINAL-20140208.jar;
../lib/slf4j-api-1.7.6.jar;
../lib/slf4j-log4j12-1.7.6.jar;
../lib/commons-io-1.4.jar
-d target/classes src\main\java\pl\alden\convertcosts\*.java
我可以用
运行它java -cp ../lib/poi-3.10-FINAL-20140208.jar;
../lib/slf4j-api-1.7.6.jar;
../lib/slf4j-log4j12-1.7.6.jar;
../lib/commons-io-1.4.jar;
../lib/log4j-1.2.17.jar;
target/classes
pl/alden/convertcosts/App
我知道我可以将所有jar文件设置为cl classpath
系统变量(Windows 7)。
我想将所有内容放入jar
并从此jar
运行它。要创建jar
我使用
jar cvfm convertcosts.jar manifest.mf -C target/classes/ .
我有适当的jar
:jar tf convertcosts.jar
给予
META-INF/
META-INF/MANIFEST.MF
.netbeans_automatic_build
log4j.properties
pl/
pl/alden/
pl/alden/convertcosts/
pl/alden/convertcosts/App.class
pl/alden/convertcosts/ConvertCostsException.class
...
现在我想从bat
文件运行应用程序:
set classpath=../lib/poi-3.10-FINAL-20140208.jar;
../lib/slf4j-api-1.7.6.jar;
../lib/slf4j-log4j12-1.7.6.jar;
../lib/commons-io-1.4.jar;
../lib/log4j-1.2.17.jar
java -jar convertcosts.jar
因此我有
Exception in thread "main" java.lang.NoClassDefFoundError:
org/slf4j/LoggerFactory
at pl.alden.convertcosts.App.<clinit>(App.java:10)
对我看来,主jar
文件看不到库jar
文件。
我应该改变什么?
答案 0 :(得分:0)
最好坚持使用显式命令行类路径定义:
java -cp ../lib/poi-3.10-FINAL-20140208.jar;
../lib/slf4j-api-1.7.6.jar;
../lib/slf4j-log4j12-1.7.6.jar;
../lib/commons-io-1.4.jar;
../lib/log4j-1.2.17.jar
-jar convertcosts.jar
定义classpath
或CLASSPATH
环境变量会产生系统范围的影响,您应该知道并非所有Java应用程序都需要在其类路径上使用这些特定的jar。如果你真的必须,那么在定义../lib/
的值时,至少要使用完整路径而不是CLASSPATH
。