使用其他类路径选项调用“java -jar MyFile.jar”

2022-08-31 09:48:32

我创建了一个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)

为什么会发生这种情况?


答案 1

使用 ,则不能将两者结合起来。如果你想在类路径上放置额外的 JAR,那么你应该把它们放在主 JAR 的清单中,然后使用,或者你把完整的类路径(包括主 JAR 及其依赖项)放进去,并在命令行上显式命名主类。-jar-cpjava -jar-cp

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

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

您提到您正在使用 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>

有了这个,将正常工作,并且还将包括类路径上的所有JAR文件。java -jar MyProgram.jarlibs


答案 2

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

只需使用该选项,将jar文件添加到该选项中,然后显式调用main类即可。-cp

此外,假设该文件夹包含jar文件(而不是类文件),这将不起作用。您不能指定 jar 文件的文件夹,但必须在类路径中单独指定每个 jar 文件(如果存在大量 jar,则值得编写一个简单的 shell 脚本来执行此操作)。/home/user/java/MyProgram/jar/libs


推荐