Java -jar选项是否会改变classpath选项?

6

我有一个jar文件,其中在清单中提到了主类。当我尝试使用以下命令执行jar文件时:

java -cp .;./* com.foo.MainClass

代码执行并且工作正常。
当我尝试使用以下命令执行jar文件时:
java -cp .;./* -jar myjar.jar

我在与myjar.jar相同的文件夹中有一些JAR文件,但我会收到class not found execptions异常。我希望-cp选项将这些JAR文件包含在类路径中。
我修改了我的代码以打印Java.class.path属性。在第一种情况下,它列出了当前目录中的所有JAR文件,而在第二种情况下,它只列出了myjar.jar。
我还修改了清单文件,向其中添加了Class-Path元素和所有JAR文件。然后第二个命令就起作用了。但是,在我的代码中,我正在尝试加载在命令提示符中提供的任意类名,因此我希望类路径包含文件夹中的所有JAR文件。如何使第二个命令在这种情况下起作用?

看一下OneJar。那应该可以解决你的类路径问题。 - flash
@flash:可能不行。他说他不知道编译时的额外类路径(否则他可以将其添加到清单中)。 - Thilo
1
听起来你需要使用自己的类加载器(根据你的环境添加回来的东西)。 - Thilo
@Thilo,没错,我需要在运行时加载其他类。从下面的回复来看,似乎我需要使用URLClassLoader自己进行一些类加载。 - mihirg
另一个选择是使用批处理文件或其他类型的包装器(以便您可以使用通配符或编程发现)。 - Thilo
3个回答

7

这里得知,可执行JAR文件必须通过清单文件的Class-Path头引用它所需的所有其他依赖JAR文件。如果使用-jar选项,则JVM会忽略环境变量CLASSPATH和命令行中指定的任何类路径。


谢谢!这是不是意味着如果我想加载一个任意的类,其JAR文件与我的JAR文件位于同一位置(并且未在我的清单中提到),我需要使用URLClassLoader显式地加载该JAR文件? - mihirg
你可以在你的清单类路径中添加类似于 plugins/* 的内容。这个文件夹用于存放 jar 文件,但是里面的所有 jar 文件都应该被识别。 - Thilo
或许并非如此:“然而,在Class-Path jar-manifest头中,类路径通配符不被认可。” :-( - Thilo

0

这里有一个关于这个问题的好讨论。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接