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

帅比萌擦擦* 提交于 2019-12-14 16:45:38

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

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


#1楼

在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

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


#2楼

对我来说,这在Windows中有效。

java -cp "/lib/*;" sample

对于Linux

java -cp "/lib/*:" sample

我正在使用Java 6


#3楼

简短格式:如果您的主体位于jar中,则可能需要另外声明一个'-jar pathTo / yourJar / YourJarsName.jar使其正常工作(即使'YourJarsName.jar'在类路径中)(或表示要回答5年前提出的原始问题:您不需要显式地重新声明每个jar,但是看起来确实,即使使用java6,您也需要重新声明自己的jar ...)


长格式:(我已经明确指出了这一点,我希望即使是闯入Java的人也可以使用此功能)

就像这里的许多内容一样,我正在使用eclipse导出jar :(文件->导出->“可运行的JAR文件”)。 “库处理”蚀(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肯定是在破坏),但是在我正在使用的一个jar中,我发现本机代码与方便的“ jarinjar”技巧相冲突,当您选择该选项时,Eclipse会利用这些技巧。 即使意识到我需要opt3,然后找到这个StackOverflow条目,我仍然花了一些时间弄清楚如何在eclipse之外启动我的主程序,所以这对我有用,因为它对其他人有用...


如果您将jar命名为:“ fooBarTheJarFile.jar”,并且所有文件都设置为导出到目录:“ / 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位服务器VM)


#4楼

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

请查看此StackOverflow问题以获取更多信息。

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


#5楼

对于Windows,引号是必需的; 应该用作分隔符。 例如:

java -cp "target\\*;target\\dependency\\*" my.package.Main
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!