用额外的类路径选项调用“java -jar MyFile.jar”

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

我创建了一个包含我所有编译过的东西的jar文件。另外我的ant build脚本将需要的库复制到一个子文件夹“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命令行中并明确命名主类

java -cp 'MyProgram.jar:libs/*' main.Main

(我使用的dir/*语法告诉java命令将.jar特定目录中的所有文件添加到类路径中,请注意,*必须通过shell来保护它们不被扩展,这就是我使用单引号的原因。)

您提到您使用Ant来替代清单方法,您可以在复制依赖关系之后但在构建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就可以正常工作,并且将所有libsJAR文件包括在类路径中。

用户回答回答于

当使用-jar选项时,-cp选项被忽略。设置类路径的唯一方法是使用jar中的清单文件。

使用-cp选项比较容易,将jar文件添加到该选项,然后显式调用主类。

另外,假设/ home / user / java / MyProgram / jar / libs文件夹包含jar文件(而不是类文件),这将不起作用。你不能指定一个jar文件的文件夹,但必须在类路径中分别指定每个jar文件(如果有大量的jar包,那么值得编写一个简单的shell脚本来为你做这件事)。

扫码关注云+社区