有没有一种方法可以在类路径中包含目录内的所有jar文件?
我正在尝试使用java -classpath lib/*.jar:. my.package.Program
,但它无法找到肯定在这些jar文件中的类文件。我需要单独将每个jar文件添加到类路径中吗?
有没有一种方法可以在类路径中包含目录内的所有jar文件?
我正在尝试使用java -classpath lib/*.jar:. my.package.Program
,但它无法找到肯定在这些jar文件中的类文件。我需要单独将每个jar文件添加到类路径中吗?
"
)*
,而不是*.jar
Unix
java -cp "Test.jar;lib/*" my.package.MainClass
这与Windows类似,但使用
java -cp "Test.jar:lib/*" my.package.MainClass
:
代替;
。如果您无法使用通配符,bash
允许使用以下语法(其中lib
是包含所有Java存档文件的目录):
(请注意,使用类路径与
java -cp "$(printf %s: lib/*.jar)"
-jar
选项不兼容。也请参阅:从命令提示符中执行带有多个classpath库的jar文件)
理解通配符
从 Classpath 文档中获悉:
要在单个目录 foo 中匹配类和 JAR 文件,可以使用类路径条目可以包含基本名称通配符字符
*
,它被视为等效于指定具有扩展名.jar
或.JAR
的目录中所有文件列表。例如,类路径条目foo/*
指定命名为foo的目录中的所有JAR文件。仅由*
组成的类路径条目会展开为当前目录中所有jar文件的列表。包含
*
的类路径条目不会匹配类文件。
foo;foo/*
或 foo/*;foo
。所选择的顺序决定了在加载foo
中的类和资源之前是先加载foo
中的 JAR 文件还是相反。
子目录不会递归搜索。例如,foo/*
只在 foo
中查找 JAR 文件,而不是在 foo/bar
、foo/baz
等子目录中查找。
在扩展类路径中枚举一个目录中的 JAR 文件的顺序未指定,可能因平台而异,甚至在同一台计算机上的同一时刻也可能不同。一个良好构造的应用程序不应依赖于任何特定的顺序。如果需要特定顺序,则可以显式枚举该类路径中的 JAR 文件。
通配符的扩展是在程序的 main 方法调用之前执行的,而不是在类加载过程本身中执行的。每个包含通配符的输入类路径元素都被替换为通过枚举命名目录中的 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
头中不会识别类路径通配符。
tr
显式地引用每个JAR是可行的! - Suprjava -classpath /jars/*:/anotherJarsDir/* com.test.MyClass
,没有引号,它可以正常工作。我想知道为什么Shell没有展开并报错? - yellavon~
in the -cp"。 - Sohail Si在 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
分隔符是冒号而不是分号。
*.jar
文件,只能识别*
。 - jamesmortensen:
和另一个平台上的 ;
的区别。 :) 我每年只会用命令行编译一次 Java,刚好足够让我记不住如何操作,但又经常到足以让我感到烦恼。 - jamesmortensenManifest.mf
)并指定其他必需的jar包的类路径的主 jar 文件myapp.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
NB:这是平台无关的——我们可以使用相同的jar文件在UNIX服务器或Windows PC上启动。
我在Ubuntu 10.04上使用java-sun 1.6.0_24解决方案,将所有jars文件放置在“lib”目录中:
java -cp .:lib/* my.main.Class
如果此命令失效,则可以尝试以下命令(将lib目录下的所有*.jar文件添加到classpath参数中):
java -cp $(for i in lib/*.jar ; do echo -n $i: ; done). my.main.Class
简短回答: java -classpath lib/*:. my.package.Program
Oracle提供了关于在类路径中使用通配符的文档,Java 6的文档这里和Java 7的文档这里,在理解类路径通配符的章节下。以下是要点的摘要:
通常情况下,要包含给定目录中的所有JAR文件,您可以使用通配符*
(不是*.jar
)。
通配符仅匹配JAR文件,而不是类文件;要获取目录中的所有类,只需将类路径条目结束于目录名称。
可以将上述两个选项组合在一起,以包括目录中的所有JAR和类文件,并应用通常的类路径优先规则。例如:-cp /classes;/jars/*
通配符将不会在子目录中搜索JAR文件。
如果使用CLASSPATH
系统属性或-cp
或-classpath
命令行标志,则上述要点是正确的。但是,如果使用Class-Path
JAR清单头(如使用ant构建文件时所做的那样),则不会使用通配符。
是的,我的第一个链接与得分最高的答案提供的链接相同(我无法超越),但该答案未提供太多解释。由于这些天在Stack Overflow上这种行为是不鼓励的,因此我认为我应该对其进行扩展。
Windows:
java -cp file.jar;dir/* my.app.ClassName
Linux:
java -cp file.jar:dir/* my.app.ClassName
提示:
- Windows 路径分隔符为 ;
- Linux 路径分隔符为 :
- 如果在 Windows 中,cp
参数不含空格,则 "引号" 是可选的
-Djava.ext.dirs=jarDirectory
,这是在运行Java时指定外部JAR文件目录的方法。有关详细信息,请参阅http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html。此外,该参数可用于指定运行中所需的外部JAR文件目录。-jar
之前加上-Djava.ext.dirs=
。 - Giovanni FunchalJVMJ9VM149E java.ext.dirs=/core/dev1/lib 不再受支持。请将所需的库/ jar 文件添加到类路径中。
- troyfolger正确的做法:
java -classpath "lib/*:." my.package.Program
错误的:
java -classpath "lib/a*.jar:." my.package.Program
java -classpath "lib/a*:." my.package.Program
java -classpath "lib/*.jar:." my.package.Program
java -classpath lib/*:. my.package.Program
如果您使用的是Java 6,则可以在类路径中使用通配符。
现在,在类路径定义中可以使用通配符:
javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java -d build/classes
jar:
后面的.
是错误的,但是...... 在 Unix 和 Windows 系统中,“当前目录”的标准符号是一个单点 (.)。 - KNUjava -classpath ".;lib/*" Program
。 - Evgeni Sergeev