在 Java 类路径中的目录中包含所有 jar

新手上路,请多包涵

有没有办法将所有 jar 文件包含在类路径的目录中?

我正在尝试 java -classpath lib/*.jar:. my.package.Program 并且它无法找到肯定在那些罐子中的类文件。我是否需要将每个 jar 文件分别添加到类路径中?

原文由 Chris Serra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 469
1 个回答

使用 Java 6 或更高版本,类路径选项支持通配符。请注意以下事项:

  • 使用直引号 ( " )
  • 使用 * ,而不是 *.jar

视窗

java -cp "Test.jar;lib/*" my.package.MainClass

Unix

java -cp "Test.jar:lib/*" my.package.MainClass

这类似于 Windows,但使用 : 而不是 ; 。如果不能使用通配符, bash 允许使用以下语法(其中 lib 是包含所有 Java 存档文件的目录):

java -cp "$(printf %s: lib/*.jar)"

(请注意,使用类路径与 -jar 选项不兼容。另请参阅: Execute jar file with multiple classpath libraries from command prompt

了解通配符

类路径 文档:

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

包含 * 的类路径条目将不匹配类文件。要匹配单个目录 foo 中的类和 JAR 文件,请使用 foo;foo/*foo/*;foo 。选择的顺序决定了 --- 中的类和资源是否在 foo foo 的 JAR 文件之前加载,反之亦然。

不递归搜索子目录。例如, foo/* foo/bar foo/baz foo 中寻找JAR文件。

一个目录中的 JAR 文件在扩展类路径中的枚举顺序未指定,并且可能因平台而异,甚至在同一台机器上也会不时变化。一个结构良好的应用程序不应该依赖于任何特定的顺序。如果需要特定顺序,则可以在类路径中显式枚举 JAR 文件。

通配符的扩展是在调用程序的 main 方法之前尽早完成的,而不是在类加载过程本身期间完成的。输入类路径中包含通配符的每个元素都将替换为通过枚举命名目录中的 JAR 文件生成的(可能为空)元素序列。 For example, if the directory foo contains a.jar , b.jar , and c.jar , then the class path foo/* 扩展为 foo/a.jar;foo/b.jar;foo/c.jar ,该字符串将是系统属性 java.class.path 的值。

CLASSPATH 环境变量与 -classpath (或 -cp )命令行选项没有任何区别。也就是说,在所有这些情况下都支持通配符。但是,类路径通配符在 Class-Path jar-manifest 标头中不受支持。

注意:由于 Java 8 中的一个已知错误,Windows 示例必须在带有尾随星号的条目前使用反斜杠: https ://bugs.openjdk.java.net/browse/JDK-8131329

原文由 basszero 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题