在Java类路径中的所有目录中包含一个目录
有没有办法在类路径中的目录中包含所有的jar文件?
我正在尝试java -classpath lib/*.jar:. my.package.Program
java -classpath lib/*.jar:. my.package.Program
,它无法找到当然在这些罐子里的类文件。 我是否需要分别将每个jar文件添加到类路径中?
使用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 $(echo lib/*.jar | tr ' ' ':')
(请注意,使用类路径与-jar
选项不兼容。另请参阅:使用命令提示符执行具有多个类路径库的jar文件)
了解通配符
从Classpath文档中:
类路径条目可以包含基本名称通配符*
,这被认为等同于指定扩展名为.jar
或.JAR
的目录中所有文件的列表。 例如,类路径条目foo/*
指定名为foo的目录中的所有JAR文件。 一个仅包含*
类路径条目展开为当前目录中所有jar文件的列表。
包含*
类路径条目与类文件不匹配。 要在单个目录foo中匹配类和JAR文件,请使用foo;foo/*
或foo/*;foo
。 选择的顺序确定是否在类和资源foo
中之前在JAR文件加载foo
,或反之亦然。
子目录不会被递归搜索。 例如, foo/*
只在foo
查找JAR文件,而不是在foo/bar
, foo/baz
等中
目录中的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
头文件中不受尊重。
在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
分隔符是冒号而不是分号。
我们通过部署包含清单 ( Manifest.mf
)文件的主 jar文件myapp.jar
来解决此问题,该文件指定了类路径以及其他所需的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上启动。
链接地址: http://www.djcxy.com/p/29657.html上一篇: Including all the jars in a directory within the Java classpath
下一篇: Is it best to Mavenize your project jar files or put them in WEB