我希望在固定位置引用一个jar文件,以供多个可执行的jar文件使用,而不是在每个可执行文件中包含该jar。我有以下的设置,它可以正常工作:
commons-math3-3.6.1.jar 存在于 testgradle 目录下。TestGradle.jar 包含主方法,存在于 testgradle/build/libs 目录下。
从 testgradle/build/libs 目录下运行:
commons-math3-3.6.1.jar 存在于 testgradle 目录下。TestGradle.jar 包含主方法,存在于 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,以便可执行的jar文件,比如TestGradle.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上。
-cp
命令行参数),而文件路径可以包含反斜杠。但是正如在这里https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#classpath中所看到的那样,清单的`Class-Path`元素包含**URLs**。 URL有自己的规则,在那里反斜杠不好用。此外,开头的C:
可能会被解释为URL协议,因此我们必须明确使用file:///
。 - Roman Puchkovskiy