【问题标题】:How to use a wildcard in the classpath to add multiple jars? [duplicate]如何在类路径中使用通配符来添加多个 jar? [复制]
【发布时间】:2010-11-17 05:59:42
【问题描述】:

我一直在使用如此多的 3rd 方库(jar 文件),以至于我的 CLASSPATH 完全搞砸了,因为我必须包含我使用的每个 jar 文件的路径。

我一直想知道是否有一种方法可以使用通配符(*)运算符(如 *.jar)将所有 jar 文件包含在一个文件夹中。但它似乎不起作用。有没有其他方法可以缩短我电脑上目前看起来像一篇文章的 CLASSPATH ;)?。

【问题讨论】:

标签: java classpath wildcard


【解决方案1】:

发件人:http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html

类路径条目可以包含基本名称通配符*,这被认为等同于指定目录中所有扩展名为.jar 或.JAR 的文件的列表。例如,类路径条目foo/* 指定名为 foo 的目录中的所有 JAR 文件。仅由 * 组成的类路径条目将扩展为当前目录中所有 jar 文件的列表。

这应该在 Java6 中可以工作,不确定 Java5

(如果它似乎没有按预期工作,请尝试加引号。例如:"foo/*"

【讨论】:

  • TFM 说您不能在 Java 1.5 或更早版本中执行此操作。
  • 省时提示:放置“*”(带有双引号)而不是 * 以使其正常工作(至少在 Windows 上)。 :)
  • 只是为了扩展@Amos,对于 java 1.7、groovy 2.1.5 和 windowsXP,我不得不使用 -cp "./*"。
  • 常见的错误是放“foo/*.jar”,那是行不通的。仅适用于“foo/*”
  • 不适用于 windows 下的 java 8,但如果反斜杠位于星号而不是斜杠之前,则可以:请参阅 bugs.openjdk.java.net/browse/JDK-8131329
【解决方案2】:

这适用于 Windows:

java -cp "lib/*" %MAINCLASS%

%MAINCLASS% 当然是包含你的 main 方法的类。

或者:

java -cp "lib/*" -jar %MAINJAR%

%MAINJAR% 是通过其内部清单启动的 jar 文件。

【讨论】:

  • 我找不到工作的替代方案。 -jar 应该覆盖 -cp 并且似乎这样做,即使 Class-Path 不在 jar 清单中。如果您想包含工作目录和 lib,这似乎可行:java -cp ".\*;lib\*" %MAINCLASS%
  • 整个问题基于替代方法不起作用here
  • 另请注意:多个通配符可能出现在单个类路径声明中,并且可能与其他非通配符元素组合,例如java -cp "lib/*;lib2/*;lib3/specific.jar;config/
  • 请注意,将 jars 和其他文件(如 .class .properties .xml)添加到类路径是完全不同的野兽。下面添加了主类所在的 jar 和一些在执行期间从 cp java -cp .;*;"%JAVA_HOME%/jre/lib/"* com.some.package.ClassContainingMain 上的当前目录调用的属性文件。这 '*;'部分只处理当前目录中的 jars 和 '.;'部分负责所有其他需要的 .properties 文件等
  • 另一种选择是完全错误的。使用-jar 时,-cp 参数将被忽略。
【解决方案3】:

如果你的意思是你有一个名为 CLASSPATH 的环境变量,我会说那是你的错误。在我开发 Java 的任何机器上都没有这样的东西。 CLASSPATH 与特定项目紧密相关,不可能有一个适用于所有人的单一、正确的 CLASSPATH。

我使用 IDE 或 Ant 为每个项目设置 CLASSPATH。我做了很多 Web 开发,所以每个 WAR 和 EAR 都使用自己的 CLASSPATH。

IDE 和应用服务器会忽略它。你为什么拥有它?我建议删除它。

【讨论】:

    【解决方案4】:

    Java 6 中引入了基本名称通配符;即“foo/*”表示“foo”目录中的所有“.jar”文件。

    在不支持通配符类路径的早期 Java 版本中,我使用了一个 shell 包装脚本来组装一个类路径,方法是 'globbing' 一个模式并修改结果以在适当的点插入 ':' 字符。这在 BAT 文件中很难做到……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2014-03-02
      相关资源
      最近更新 更多