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

2022-08-31 03:57:37

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

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


答案 1

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

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

窗户

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

Unix

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

这与 Windows 类似,但使用 而不是 。如果不能使用通配符,则允许使用以下语法(包含所有 Java 归档文件的目录在哪里)::;bashlib

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

(请注意,使用类路径与该选项不兼容。另请参见:从命令提示符处使用多个类路径库执行 jar 文件-jar)

了解通配符

类路径文档中:

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

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

不以递归方式搜索子目录。例如,仅在 中查找 JAR 文件,而不是 在 、 等中查找。foo/*foofoo/barfoo/baz

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

通配符的扩展是在调用程序 main 方法之前的早期完成的,而不是在类加载过程本身的后期完成的。包含通配符的输入类路径中的每个元素都将替换为通过枚举命名目录中的 JAR 文件而生成的(可能为空的)元素序列。例如,如果目录包含 、 和 ,则类路径将扩展为 ,并且该字符串将是 system 属性的值。fooa.jarb.jarc.jarfoo/*foo/a.jar;foo/b.jar;foo/c.jarjava.class.path

环境变量的处理方式与 (或 ) 命令行选项没有任何不同。也就是说,通配符在所有这些情况下都得到尊重。但是,标头中不支持类路径通配符。CLASSPATH-classpath-cpClass-Path jar-manifest

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


答案 2

在Windows下,这工作原理:

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

这不起作用:

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

请注意 ,因此 * 通配符应单独使用*.jar


在 Linux 上,以下方法有效:

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

分隔符是冒号而不是分号


推荐