Java:如何从命令行导入jar文件


73

我正在尝试使用Java从命令行(Windows)调用类(主方法)。
该类导入其他类(其他jar)。

我总是从我的主程序导入的类中获得“找不到类异常”。

这是我尝试过的:

  • 添加一个CLASSPATH env。var与所引用的lib所在的路径(不起作用)

  • java -jar myjar.jar从命令行调用“ ”时尝试了所有这些不同的参数:“ -classpath lib/”,“ -classpath ./lib/”,“ -classpath lib”,“ -cp lib/*”,“ -cp lib/\*”,“ -classpath lib/referenced-class.jar”,“ -classpath ./lib/referenced-class.jar”(lib是引用的jar所在的位置)

  • 我试图将所有引用的jar打包到我的主类所在的jar中...

  • 拥有了这些,我也试图与指定清单文件中的类: Class-path referenced-jar.jar我也尝试过Class-path lib/referenced-jar.jar

Answers:


117

-jar如果您碰巧知道要运行的主类的名称,则可以在不使用命令行参数的情况下运行它:

java -classpath .;myjar.jar;lib/referenced-class.jar my.package.MainClass

如果您使用的是Linux,则应使用“:”而不是“;”。在类路径中。


我一直搜寻以找出答案!
chotchki 2010年

9
为了清楚起见,jar必须显式地放在类路径中。指定/ lib目录效率低下。
cmcginty 2011年

12
非常感谢,我的第一个Scala“ hello world” jar仍然存在;-)记录-在Unix中,您使用“:”代替“;”,如果有更多lib jar,则只需添加更多jar文件名即可与“;” /“:”
greenoldman 2011年

非常感谢。真。
AndreiRînea13年

2
“如果您碰巧知道主类的名称”。您可以轻松地找到unzip -p the_jar.jar META-INF/MANIFEST.MF | grep Main-Class
Kuba,

59

如果您使用运行jar文件java -jar则忽略-classpath参数。您需要在jar的清单文件中设置类路径,如下所示:

Class-Path: jar1-name jar2-name directory-name/jar3-name

请参阅Java教程:将类添加到JAR文件的Classpath中

编辑:我看到您已经尝试在清单中设置类路径,但是您确定使用了正确的语法吗?如果您像显示的那样:在“ Class-Path”之后跳过“ ”,则将不起作用。


是的,我也尝试了“:”。我不知道为什么使用清单来指定那些根本不起作用。我问了同事,并与他们重新检查了一切。

最好奇的。我已经用这种方式做了很多年了,从来没有问题。您是否正确使用了Class-Path?我不知道这是否会有所作为...
Michael Myers

1
我觉得这是最好的答案。手动正确制作清单文件通常是一项艰巨的任务。我通常拆开罐子的包装,然后让蚂蚁再做一个。他的路径和资源名称可能超过72个字符,如果包装不正确,则会引起问题。
Daniel Nesbitt

如果您要处理要运行的第三方jar,我不会拒绝。请改用亚当的答案
Stefan Haberl 2014年

这应该是公认的答案。我想知道是否可以从目录添加所有jar。使用dir/*dir/*.jar无效。
Markos

13

尝试

java -cp "your_jar.jar:lib/referenced_jar.jar" com.your.main.Main

如果您使用的是Windows,则应使用;而不是:


3

您可以尝试在eclipse中将其导出为“ Runnable jar”。当我导出为“罐子”时,我也有问题,但是当我导出为“可运行的罐子”时,我从来没有问题。


我在导出窗口中没有看到“ Runnable jar”选项,只是一个JAR文件:(

您正在使用哪个版本的Eclipse?我有它在木卫三....这里screrenshot: bufka.ath.cx/dslr/Eclipse-Export.png 但我不知道,如果是默认设置与否。
cupakob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.