2011-04-25 63 views
5

我正在尝试使用Java进行一些测试。我有两个目录rootroot/lib。我有一个root/lib/Test.java文件和一个root/Foo.java文件。我可以javac lib/Test.java编译两者结合,然后javac -classpath lib Foo.java,并得到:如何为两个目录设置java -classpath?

root/ 
Foo.java 
Foo.class 
lib/ 
    Test.java 
    Test.class 

这里是他们的样子:

class Foo { 
    static public void main(String[] argv) { 
    System.out.println(Test.test()); 
    } 
} 

class Test { 
    public static int test() { 
    return 2; 
    } 
} 

如何运行它们,所以它们一起工作无需添加导入语句?我曾尝试java -classpath ".;lib" Foo但我只是得到java.lang.NoClassDefFoundError: Foo

Lala: jeena$ cd root 
Lala:root jeena$ java -classpath ".;lib" Foo 
Exception in thread "main" java.lang.NoClassDefFoundError: Foo 
Caused by: java.lang.ClassNotFoundException: Foo 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 

回答

7

这表明你在根的父母是:

的javac -classpath根/ lib目录Foo.java

这意味着你的根是:

的java -classpath “LIB” 富

哪个目录ectory你实际上是从哪里工作的?也许绝对路径对你更容易?

另外,什么操作系统?例如,在Linux上,您的路径分隔符将是:而不是;

+0

这是Linux和OS X我正在尝试它。我其实是在根内,也许我应该稍微改写一下这个问题。 – Jeena 2011-04-25 19:10:08

+0

呵呵!好吧,现在我明白了,我应该使用“:”而不是“;”非常感谢你! – Jeena 2011-04-25 19:15:00

1

我不知道实际的问题是什么 - 如果你使用的是Windows,并且既不使用类使用特定的软件包名称(例如,他们在未命名的软件包,您不应该使用它),那么“java -classpath。; lib Foo”应该能够加载并运行Foo,而不会出现问题。

如果它们不在同一个包中(你没有显示),那么只要Test是公共的,你可以通过使用“packageName.goes.here.Test.test( )“。

+0

他们只是普通的java文件,没有包,我试图在Linux和OS X上执行'java -classpath“。; lib”Foo',并且都得到了NoClassDefFoundError。我在这里上传了带有文件结构的文件:http://jeena.net/t/java-test.zip – Jeena 2011-04-25 19:05:48

+0

(当我在没有引号的情况下使用它时; lib然后shell变得疯狂,因为它认为lib是接下来的命令,它不是。) – Jeena 2011-04-25 19:07:22

+0

@Jeena您正在使用错误的路径分隔符,正如我所解释的。 – 2011-04-25 19:07:56