在Java项目中使用jar?

我正在尝试使用包含在名为hello的包中的jar文件(例如,名为Hello.jar)提供的项目中的公共方法/类。

package hello; public class Hello { public static void main(String[] args) { coucou(); } public static void coucou() { System.out.println("Hello there"); } } 

在一个名为Tool的单独项目中,我希望能够调用方法Hello.coucou()所以我写了这样的东西:

 import hello.*; public class Tool { public static void main(String[] args) { System.out.println("main program running"); Hello.coucou(); } } 

我使用以下命令编译Tool.java(在linux下):

 $ javac Tool.java -classpath .:./extern/: 

Hello.jar位于文件夹./extern

这似乎编译得很好但是当我启动它(即java工具)时,我得到了这个:

 main program running Exception in thread "main" java.lang.NoClassDefFoundError: hello/Hello at Tool.main(Tool.java:9) Caused by: java.lang.ClassNotFoundException: hello.Hello 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:323) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:268) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336) ... 1 more 

我是Java(C / C ++背景)的新手,我不明白我做错了什么。 有任何想法吗?

干杯大卫


编辑:我尝试在命令行的类路径中添加Hello.jar,但我仍然得到相同的错误:

 $ javac Tool.java -classpath .:./extern/Hello.jar: $ java Tool -classpath .:./extern/Hello.jar: main program running Exception in thread "main" java.lang.NoClassDefFoundError: hello/Hello at Tool.main(Tool.java:9) Caused by: java.lang.ClassNotFoundException: hello.Hello 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:323) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:268) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336) ... 1 more 

在运行时以及编译时,您需要类路径上的Hello.jar。

实际上诀窍是命令行中的参数顺序:

-cp(或-classpath)是最后设置的,然后它不起作用

 java Tool -cp .:extern/Hello.jar 

它必须首先像:

 java -cp .:extern/Hello.jar Tool 

Java使用动态后期绑定,因此在编译期间将JAR放在类路径中只是为了确保您的代码正确地使用它们的类,但它实际上并没有像C / C ++中的链接器那样将它们嵌入到代码中。 因此,您还需要在执行代码时设置类路径。

但是,这个:

 $ javac Tool.java -classpath .:./extern/: 

也不应该工作,因为JAR需要直接放入类路径,而不仅仅是它们所在的目录:

 $ javac Tool.java -classpath .:./extern/Hello.jar 

最后,您将代码放在默认的无名包中。 这可以搞错,但从长远来看会导致问题(首先,你不能在其他任何地方从默认包中导入类)。

运行Java时,您还必须添加jar文件(仅添加目录路径不起作用)。

请参阅类路径信息。

它应该是这样的:

 java -classpath /java/MyClasses/myclasses.jar utility.myapp.Cool 

启动时,您还需要在类路径中包含Hello.jar文件。

java -cp xxx.jar你好,其中xxx是你想要在你的类路径中拥有的jar,如果你想要多个jar然后用它们分开它们;

卡尔