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

问题

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

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


#1 热门回答(958 赞)

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

  • 使用直引号(“)
  • 使用*,而不是* .jar
    Windows> java -cp“Test.jar; lib / *”my.package.MainClass
    Unix> java -cp“Test.jar:lib / *”my.package.MainClass

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

java -cp $(echo lib / *。jar | tr''':')

(请注意,使用类路径与-jar选项不兼容。另见:Execute jar file with multiple classpath libraries from command prompt)
了解通配符
来自Classpath文件:

类路径条目可以包含基本名称通配符*,它被认为等同于指定扩展名为.jar或.JAR的目录中所有文件的列表。例如,类路径条目foo / 指定名为foo的目录中的所有JAR文件。一个仅包含的类路径条目展开为当前目录中所有jar文件的列表。包含*的类路径条目与类文件不匹配。要在单个目录foo中匹配类和JAR文件,请使用foo; foo / *或foo / *; foo。选择的顺序确定foo中的类和资源是否在foo中的JAR文件之前加载,反之亦然。子目录不会被递归搜索。例如,foo / *仅在foo中查找JAR文件,而不是在foo / bar,foo / baz等中查找JAR文件。目录中的JAR文件在展开的类路径中枚举的顺序未指定,可能因此而异平台,甚至是同一台机器上的平台。构造良好的应用程序不应该依赖于任何特定的顺序。如果需要特定顺序,则可以在类路径中显式枚举JAR文件。在调用程序的主要方法之前,扩展通配符是在组装过程本身期间提前完成的,而不是延迟。包含通配符的输入类路径的每个元素都由枚举命名目录中的JAR文件生成的(可能为空)元素序列替换。例如,如果目录foo包含a.jar,b.jar和c.jar,则类路径foo / *将扩展为foo / a.jar; foo / b.jar; foo / c.jar,以及该字符串将是系统属性java.class.path的值。 CLASSPATH环境变量与-classpath(或-cp)命令行选项的处理方式不同。也就是说,通配符在所有这些情况下都很有用。但是,类路径通配符在Class-Path jar-manifest头文件中不受尊重。


#2 热门回答(198 赞)

在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

分隔符是冒号而不是分号。


#3 热门回答(59 赞)

我们通过部署amainjar文件myapp.jar来解决这个问题,该文件包含a清单(Manifest.mf)文件,该文件指定带有其他所需jar的类路径,然后将其与它一起部署。在这种情况下,您只需在运行代码时声明java -jar myapp.jar

因此,如果您将主jar部署到某个目录中,然后将依赖的jar放入其下的lib文件夹中,清单看起来像:

Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar

注意:这与平台无关 - 我们可以使用相同的jar在UNIX服务器或Windows PC上启动。