2009-06-09 27 views
1

我正在尝试使用名为hello的包中包含的作为jar文件提供的项目(称为Hello.jar)的公共方法/分类。在Java项目中使用jar吗?

package hello; 

public class Hello 
{ 

public static void main(String[] args) 
{ 
    coucou(); 
} 

public static void coucou() 
{ 
    System.out.println("Hello there"); 
} 

} 

在被称为工具一个独立的项目,我希望能够调用的方法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 
+0

我希望分号分隔类路径而不是分号。 – Tom 2009-06-09 20:18:18

+1

Windows:分号Linux:冒号 – dm76 2009-06-10 08:50:02

回答

2

其实诀窍是在命令行参数的顺序:

是对-cp(或-classpath)是最后一组,那么它不工作

java Tool -cp .:extern/Hello.jar 

它必须是第一个像:

java -cp .:extern/Hello.jar Tool 

!!!

4

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

0

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

1

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

查看classpath的信息。

应该是这样的:

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

实际上,分号弄乱了事情,它确实应该是冒号。这个问题的诀窍是首先使用-classpath选项,即在Tool之前。 – dm76 2009-06-09 16:56:04

0

java命令xxx.jar你好xxx是你想在你的classpath,如果你想多个罐子,然后使用它们分开的罐子;

卡尔

1

Java使用动态后期绑定,在编译过程中所以把JAR在classpath中只需要确保你的代码是正确利用它的类,但它实际上并没有将它们嵌入到你的代码作为链接器在C/C++中。因此,您还需要在执行代码时设置类路径。

然而,这样的:

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

同样不应该工作,因为JAR文件需要直接放到classpath中,而不仅仅是他们生活在目录:

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

最后,你是将你的代码放在默认的无名包中。这对于鬼混来说是可以的,但是从长远来看会造成问题(一方面,你不能从任何其他地方将类从默认包导入)。

相关问题