【问题标题】:absolute versus relative path names in jar manifestjar 清单中的绝对路径名与相对路径名
【发布时间】:2017-12-24 15:38:35
【问题描述】:

我想在固定位置引用一个 jar 文件以供多个可执行 jar 使用,而不是在每个可执行文件中包含该 jar。我有以下设置,效果很好

commons-math3-3.6.1.jar 存在于 testgradle 目录中。 TestGradle.jar 包含 main 方法,存在于目录 testgradle/build/libs

从我运行的 testgradle/build/libs:

java -jar TestGradle.jar

一切正常。 TestGradle.jar 中的清单包含:

Manifest-Version: 1.0
Class-Path: ../../commons-math3-3.6.1.jar
Main-Class: com.spgxyz.test.testg

但是我想使用绝对路径来处理 commons-math3-3.6.1.jar 以便像 TestGradle.jar 这样的可执行 jar 可以从它们所在的任何目录中使用它。但是,如果我将 TestGradle.jar 清单更改为包括完整路径:

Manifest-Version: 1.0
Class-Path: C:\Users\Admin\workspace\TestGradle\commons-math3-3.6.1.ja
 r
Main-Class: com.spgxyz.test.testg

然后是命令:

java -jar TestGradle.jar

从 testgradle/build/libs 运行产生:

Error: Could not find or load main class com.spgxyz.test.testg
Caused by: java.lang.ClassNotFoundException: com.spgxyz.test.testg

我尝试对清单进行各种编辑以尝试解决此问题,例如:

Manifest-Version: 1.0
Class-Path: . C:\Users\Admin\workspace\TestGradle\commons-math3-3.6.1.
 jar
Main-Class: com.spgxyz.test.testg

Manifest-Version: 1.0
Class-Path: TestGradle.jar C:\Users\Admin\workspace\TestGradle\commons
 -math3-3.6.1.jar
Main-Class: com.spgxyz.test.testg

这些都产生相同的错误。如果有人能对这里发生的事情有所了解,我将不胜感激。在 Windows 上运行。

【问题讨论】:

    标签: java jar


    【解决方案1】:

    Class-Path 属性被解释为一个 URL 列表,因此,要使用绝对路径(这里用 URL 表示),它应该以 schema 开头并使用正斜杠。

    尝试以下方法:

    Class-Path: file:///C:/Users/Admin/workspace/TestGradle/commons-math3-3.6.1.jar
    

    【讨论】:

    • Roman Puchkovskiy 发布的解决方案有效,但我想知道为什么在阅读了很多文章后,我没有找到任何可以让我找到该解决方案的东西。例如,在 Oracle documentation 中有几个地方存在绝对路径,例如c:\java\... 似乎被使用了。
    • 在您在此处发布链接的文档中,他们讨论了 文件路径(您将其提供给 -cp 命令行参数),并且文件路径可以包含反斜杠.但正如这里docs.oracle.com/javase/8/docs/technotes/guides/jar/… 所见,清单的Class-Path 元素包含URLs。 URL 有自己的规则,反斜杠在那里不好。另外,一开始的C:可能会被解释为URL协议,所以我们必须明确使用file:///
    • 请注意,该链接明确且反复声明 URL 必须是相对 URL。像这样的绝对 URL 可能碰巧有效,但不受官方支持。更好的解决方案是将 commons-math3-3.6.1.jar 复制到包含希望使用它的每个 .jar 的目录中,并将 Class-Path: commons-math3-3.6.1.jar 放入清单中。
    • 但是我提到的link 在类路径中清楚地重复使用了绝对路径,很容易看出这会导致混淆。例如here 它声明“清单可以定义一个 JAR 类路径,它进一步扩展了类路径......”这并没有立即表明清单中定义的类路径有一组不同的规则。
    • 它在此链接的底部显示:docs.oracle.com/javase/8/docs/technotes/guides/jar/…“目前,出于安全原因,URL 必须与 JAR 文件的代码库相关。”我怀疑您是否获得了绝对路径工作,不应假定它将继续工作或将在所有平台上工作。
    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2023-03-25
    相关资源
    最近更新 更多