not - javac classpath




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

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

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


Windows
java -cp file.jar; dir / * my.app.ClassName

Linux
java -cp file.jar:dir / * my.app.ClassName

提醒:
- Windows路径分隔符是“ ;
- Linux路径分隔符是“
- 在Windows中,如果cp参数不包含空格,则“引号”是可选的


正确

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

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

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


使用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中的类和资源是否在foo中的JAR文件之前加载,反之亦然。

子目录不会被递归搜索。 例如, foo/*只在foo查找JAR文件,而不是在foo/barfoo/baz等中

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

在调用程序的主要方法之前,扩展通配符是在组装过程本身期间提前完成的,而不是延迟。 包含通配符的输入类路径的每个元素都被通过枚举指定目录中的JAR文件生成的(可能为空)元素序列替换。 例如,如果目录foo包含a.jarb.jarc.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

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


如果您在Eclipse或Netbeans之类的任何IDE之外开发和运行Java应用程序,以上所有解决方案都将非常有效。

如果您使用的是Windows 7并且使用Eclipse IDE进行Java开发,那么如果使用命令提示符来运行Eclipse中构建的类文件,则可能会遇到问题。

例如,您在Eclipse中的源代码具有以下包层次结构:edu.sjsu.myapp.Main.java

你有json.jar作为Main.java的外部依赖

当您尝试从Eclipse内部运行Main.java时,它将毫无问题地运行。

但是当你在Eclipse中编译Main.java之后使用命令提示符运行这个命令时,它会发出一些奇怪的错误,说“ClassNotDef Error blah blah”。

我假设你在源代码的工作目录中!

使用以下语法从命令提示符运行它:

  1. javac -cp “。; json.jar” Main.java

  2. java -cp “。; json.jar” edu.sjsu.myapp.Main

    [不要错过。 以上]

这是因为您已将Main.java放入包edu.sjsu.myapp中,java.exe将查找确切的模式。

希望能帮助到你 !!


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

然后,您可以指定如下所示的内容:

<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 "/lib/*;" sample

对于linux

java -cp "/lib/*:" sample

我正在使用Java 6


将一个jar文件想象为一个目录结构的根。 是的,你需要分开添加它们。


我在Ubuntu 10.04上使用java-sun 1.6.0_24在“lib”目录中包含所有jar的解决方案:

java -cp .:lib/* my.main.Class

如果失败了,下面的命令应该可以工作(将lib目录中的所有* .jar打印到classpath参数中)

java -cp $(for i in lib/*.jar ; do echo -n $i: ; done). my.main.Class

我知道如何单独做到这一点,例如:

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

希望有所帮助!


简短形式:如果你的main在一个jar文件中,你可能需要一个额外的'-jar pathTo / yourJar / YourJarsName.jar'来显式声明它(即使'YourJarsName.jar'在类路径中)(或者,表达回答了5年前提出的原始问题:你不需要明确地重新声明每个jar,但看起来,即使使用java6,你也需要重新声明自己的jar ......)

长形式:(我已经明确表示,我希望即使是java的入侵者也可以利用这一点)

像许多这里我使用Eclipse来导出罐子:(文件 - >导出 - >'可运行JAR文件')。 'Library handling'eclipse(Juno)提供了三种选择:

opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"

通常我会使用opt2(并且opt1绝对是打破的),但是我使用的其中一个罐子中的本机代码发现与使用方便的“jarinjar”技巧打破,当您选择该选项时,eclipse将利用它。 即使在意识到我需要opt3,然后找到这个入口之后,它仍然花了我一些时间来弄清楚如何在eclipse之外启动我的主体,所以这对我有用,因为它对其他人很有用......

如果您将jar命名为“fooBarTheJarFile.jar”,并且全部设置为导出到dir:“/ theFully / qualifiedPath / toYourChosenDir”。

(这意味着“导出目的地”字段将显示为'/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')

在完成后,您会发现eclipse,然后将所有库放入该导出目录中名为“fooBarTheJarFile_lib”的文件夹中,给出如下所示的内容:

/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar

然后,您可以从系统的任何地方启动:

java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain

(对于Java新手:'package.path_to.the_class_with.your_main'是声明的包路径,您可以在包含'main(String [] args)'的'TheClassWithYourMain.java'文件的顶部找到它。 。'你想从java之外运行)

需要注意的是:在声明的类路径中的jar列表中有'fooBarTheJarFile.jar'是不够的。 您需要显式声明'-jar',并重新声明该jar的位置。

例如这破坏:

 java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain

用相对路径重新说明:

cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   

(使用Java版本“1.6.0_27”;通过Ubuntu 12.04上的OpenJDK 64位服务器虚拟机)


简短的回答: java -classpath lib/*:. my.package.Program java -classpath lib/*:. my.package.Program

Oracle提供了有关在Java路径中使用通配符的文档, 这里是Java 6的文档, 这里是Java标准的 理解类路径通配符 。 (当我写这篇文章时,这两个页面包含相同的信息。)下面是亮点摘要:

  • 通常,要将所有JAR包含在给定的目录中,可以使用通配符*不是 *.jar )。

  • 通配符只匹配JAR,而不是类文件; 要获取目录中的所有类,只需结束目录名称处的类路径条目即可。

  • 上述两个选项可以结合使用,以包含目录中的所有JAR和类文件,并且适用通常的类路径优先规则。 例如-cp /classes;/jars/*

  • 通配符不会在子目录中搜索JAR。

  • 如果您使用CLASSPATH系统属性或-cp-classpath命令行标志,上述项目符号为真。 但是,如果您使用Class-Path JAR清单头文件(正如您使用ant构建文件所做的那样),通配符将不会被使用。

是的,我的第一个链接与得分最高的答案(我没有希望超车)中提供的第一个链接相同,但该答案没有提供超出链接的解释。 由于这种行为在堆栈溢出这些天discouraged ,我想我会扩展它。


请注意,Windows上的Java 7的通配符扩展已损坏。

看看这个问题了解更多信息。

解决方法是在通配符后面放一个分号。 java -cp "somewhere/*;"





classpath