在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然后用它们分开它们;
卡尔