我创建了一个包含所有已编译内容的jar文件。另外,我的ant构建脚本将所需的库复制到子文件夹“ libs”中。结构如下:
MyProgram.jar libs/
因此,当我现在尝试运行程序时,出现以下错误:
java -cp ".:/home/user/java/MyProgram/jar/libs" -jar MyProgram.jar java.lang.ClassNotFoundException: org.postgresql.Driver at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:186) at database.PostgresQL.getConnection(PostgresQL.java:38) at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:19) at main.Main.calculateCorrelationMatrix(Main.java:51) at main.Main.main(Main.java:28) java.lang.NullPointerException at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:25) at main.Main.calculateCorrelationMatrix(Main.java:51) at main.Main.main(Main.java:28)
为什么会这样?
你可以使用两种 -jar或者 -cp,你不能将二者结合起来。如果要将其他JAR放在类路径中,则应将它们放在主JAR的清单中,然后使用,java -jar或者将完整的类路径(包括主JAR及其依赖项)放入其中,-cp并在命令行上显式命名主类。
-jar
-cp
java -jar
java -cp 'MyProgram.jar:libs/*' main.Main
(我使用的dir/*语法告诉java命令将.jar特定目录中的所有文件添加到类路径中。请注意,*必须使用shell保护它们免受扩展,这就是为什么我使用了单引号。)
dir/*
java
.jar
*
你提到使用的是Ant,因此对于替代清单方法,可以在复制依赖<manifestclasspath>项之后但在构建JAR 之前使用ant的任务。
<manifestclasspath>
<manifestclasspath property="myprogram.manifest.classpath" jarfile="MyProgram.jar"> <classpath> <fileset dir="libs" includes="*.jar" /> </classpath> </manifestclasspath> <jar destfile="MyProgram.jar" basedir="classes"> <manifest> <attribute name="Main-Class" value="main.Main" /> <attribute name="Class-Path" value="${myprogram.manifest.classpath}" /> </manifest> </jar>
有了这个位置,java -jar MyProgram.jar它将可以正常工作,并且还将libs在类路径中包括所有JAR文件。