如何使用外部jar文件执行Java程序

3
我想使用guava运行我的程序。如果我使用javac进行编译,需要在我的项目中添加以下依赖项:
javac -cp myPackages/guava-13.0.jar MyScanner.java    

没有问题。

如果我尝试运行

java MyScanner -cp myPackages/guava-13.0.jar 

我在控制台上看到了以下输出:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Optional
at MyScanner.main(MyScanner.java:37)
Caused by: java.lang.ClassNotFoundException: com.google.common.base.Optional
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
... 1 more

您能告诉我如何使用外部jar文件执行程序吗?


你能展示一下你的jar文件的清单文件吗?它是否包含一个指向guava jar文件的class-path语句? - Hovercraft Full Of Eels
你尝试过使用 "java MyScanner -cp guava-13.0.jar" 吗? - JuanZe
3个回答

5

我认为您想要的是:

java -cp myPackages/guava-13.0.jar:. MyScanner

注意我在类路径中设置了两个值:'.'(当前目录)和 guava 的路径。你的问题在于你在指定主类 MyScanner 之后才指定了类路径选项。在主类之后指定的选项是程序的参数,而不是 Java 自身的参数。


非常感谢 :-) 这正是我运行程序所需要的。现在我不再遇到更多的ClassNotFound问题了。 - lennykey
没问题。通常在SO上,我们接受帮助我们解决问题的答案。您可以通过点击复选框来选择最适合解决您问题的答案。 - Amir Afghani

1

因为在你的类名后面的任何东西

java MyScanner -whatever is --after
               ^         ^  ^ 

这将是您类中主方法的参数以及类名之前的所有内容。

java --what -is -before MyScanner
     ^      ^   ^

这是与JVM相关的参数。-cp或-classpath必须是JVM参数,而不是您程序的参数。

它必须这样读取

java -cp myPackages/guava-13.0.jar MyScanner 

如果我尝试这个,我会得到以下错误:Exception in thread "main" java.lang.NoClassDefFoundError: MyScanner - lennykey

1

你应该尝试下面的事情

java -classpath myJar.jar my.package.Program

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接