是否有一种方法将所有jar文件包含在类路径的目录中?

我正在尝试java -classpath lib/*.jar:。program,它不能找到在这些罐子里的类文件。我是否需要将每个jar文件分别添加到类路径中?


当前回答

您需要分别添加它们。或者,如果确实需要指定一个目录,可以将所有内容解jar到一个目录中,并将其添加到类路径中。但是,我不推荐这种方法,因为您可能会在类路径版本控制和不可管理性方面出现奇怪的问题。

其他回答

致相关人士:

我在Windows MSYS/MinGW shell下发现了这种奇怪的行为。

工作原理:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

不工作:

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options

我很确定通配符没有被shell扩展,因为例如。

$ echo './*'
./*

(我也用另一个程序试过,而不是内置的echo,结果是一样的。)

我相信是javac试图展开它,无论参数中是否有分号,它的行为都是不同的。首先,它可能试图展开所有看起来像路径的参数。只有这样,它才会解析它们,-cp只接受以下标记。(注意com.comsol.aco_1.0.0.jar是该目录中的第二个JAR。)这都是猜测。

这是

$ javac -version
javac 1.7.0

以适合多个jar和当前目录的类文件的方式设置类路径。

CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH

如果您确实需要动态指定所有的.jar文件,您可以使用shell脚本或Apache Ant。有一个名为commons Launcher的公共项目,基本上可以让你将启动脚本指定为蚂蚁构建文件(如果你明白我的意思)。

然后,你可以指定如下内容:

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

在启动构建文件中,该文件将使用正确的类路径启动应用程序。

在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

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

你可以试试java -Djava.ext.dirs=jarDirectory http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html

运行java时用于外部jar的目录