我使用SLF4J记录器。jar
文件放置在../lib
目录下。应用程序是在Netbeans中使用maven创建的。但是我想自己做一切来自学。
应用程序是用命令编译的(当然分号后面没有空格——我添加它们是为了更好的可读性):
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 srcmainjavaplaldenconvertcosts*.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
文件。
我应该改变什么?
最好坚持使用显式命令行类路径定义:
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。如果您确实需要,那么在定义CLASSPATH
的值时,至少要使用完整路径而不是../lib/
。