【问题标题】:Does java -jar option alter classpath optionsjava -jar 选项是否改变类路径选项
【发布时间】:2013-10-09 01:52:05
【问题描述】:

我有一个 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 属性。在第一种情况下,它列出了当前目录中的所有 jars,在第二种情况下,它只列出了 myjar.jar

我还修改了清单以将 Class-Path 元素与所有 jar 一起添加到其中。然后第二个命令起作用。但是在我的代码中,我试图加载一个在命令提示符处提供名称的 aribtrary 类,因此我希望类路径包含文件夹中的所有 jar。如何使第二个命令在这种情况下工作?

【问题讨论】:

  • 看看OneJar。这应该可以解决您的 CP 问题。
  • @flash:可能不会。他说他在编译时不知道额外的类路径(否则他可以将它添加到清单中)。
  • 听起来你必须使用自己的类加载器(根据你的环境添加东西)。
  • @Thilo,是的,我需要在运行时使用加载其他类。从下面的响应中,看起来我需要使用 URLClassLoader 自己进行一些类加载。
  • 另一种选择是使用批处理文件或其他类型的包装器(以便您可以使用通配符或程序化发现)。

标签: java classpath


【解决方案1】:

来自this

一个可执行的 JAR 必须引用它所依赖的所有其他 JAR 需要通过清单文件的 Class-Path 标头。这 环境变量 CLASSPATH 和在 如果使用了 -jar 选项,JVM 会忽略命令行。

【讨论】:

  • 谢谢!这是否意味着如果我想加载一个 jar 文件与我的 jar 文件位于同一位置的任意类(并且在我的清单中未提及),我需要使用 URLClassLoader 显式加载该 jar?
  • 好吧,您可以在清单类路径中添加类似 plugins/* 的内容。 jar 文件的文件夹将被修复,但应该拾取其中的所有 jar。
  • 或者可能不是:“但是,Class-Path jar-manifest 标头中不支持类路径通配符。” :-(
【解决方案2】:

您需要自己的类加载器来处理这个问题。 -jar 只尊重 Manifest 中的信息,不允许使用通配符。

您可能会发现可重载类的示例很有用:http://www.exampledepot.com/egs/java.lang/ReloadClass.html

【讨论】:

    【解决方案3】:

    Here 很好地讨论了这个问题。

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多