从一个 jar 文件访问另一个 jar 文件时出现问题

Problem accessing one jar file from another

我编写了一个 Java 程序,它使用来自 Apache PDFBox jar 应用程序的 类。我在目录中有编译的 类 和 PDFBox jar 文件。我可以 运行 成功:

java -cp .;pdfbox-app.jar Athena NPCGenerator -pdf

但是,当我启动自己的程序并尝试以类似方式在同一个地方 运行 时,失败了:

java -cp .;pdfbox-app.jar -jar Athena.jar NPCGenerator -pdf

错误信息:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/pdfbox/pdm
odel/PDDocument
        at CharacterPDF.writePDF(CharacterPDF.java:49)
        at NPCGenerator.printToPDF(NPCGenerator.java:302)
        at NPCGenerator.makeAllNPCs(NPCGenerator.java:278)
        at NPCGenerator.main(NPCGenerator.java:316)
        at Athena.runApp(Athena.java:88)
        at Athena.main(Athena.java:104)
Caused by: java.lang.ClassNotFoundException: org.apache.pdfbox.pdmodel.PDDocumen
t
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 6 more

我需要做什么来解决这个问题?

如果您使用 -jar 标志 java 它需要一个可执行的 jar。然后它将忽略命令行上的 class 路径并从 jars 清单中读取 class 路径。

您可以将 pdfbox-app.jar 与 main-class 属性一起添加到 Athena.jar 中的清单中。您甚至可以在清单中指定 jar 的相对或绝对路径。

Main-Class: Athena
Class-Path: pdfbox-app.jar

或者您不能使用 -jar 并通过命令行将 Athena.jar 添加到您的 class 路径。在这种情况下,您还需要在命令行上指定主要 class,因为在这种情况下 java 不会读取清单。

java -cp .;pdfbox-app.jar;Athena.jar Athena NPCGenerator -pdf