java - 使用附加类路径选项调用 "java -jar MyFile.jar"

标签 java jar classpath

我创建了一个包含所有编译内容的 jar 文件。此外,我的 ant 构建脚本将所需的库复制到子文件夹“库”中。结构如下:

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 的 list 中,然后使用 java -jar或者您将完整的类路径(包括主 JAR 及其依赖项)放入 -cp并在命令行显式命名主类

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

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

您提到您正在使用 Ant,因此对于替代 list 方法,您可以使用 ant 的 <manifestclasspath>任务之后复制依赖,但之前构建JAR。

<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 文件也是如此。

关于java - 使用附加类路径选项调用 "java -jar MyFile.jar",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15930782/

相关文章:

java - 如何从 Tomcat 应用程序的类路径中获取所有 jar?

java - Galileo 可以使用在 Helios 中创建的工作区/项目吗?

java - ThreeTen toZonedDateTime : Exceptions when built by Ant

java - 为什么我没有收到 NullPointerException

java - 带缓存的 EJB 服务定位器

java - jar 文件不显示(关闭太快)

java - 如何允许 gradle 插件访问项目依赖项中的类

java - 如何抑制javax.xml.transform.Transformer的Transformer添加的xml元素

java - JVM/编译器优化对象未使用的属性

java - 如何测试.jar版本?