【推荐】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
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3143025