我正在学习java包。我成功创建了一个包含单个.class文件Hello.class的包。现在我想将另一个类文件添加到同一个包中。我将新的java类命名为Goodbye.java,并通过
将其编译到同一目录“pack”中javac -d ./bin Goodbye.java
命令。 bin目录包含pack目录。 我通过
编译包含main函数的test.java文件javac -cp ./bin test.java
命令。编译工作正常。但是当我进入
java test
命令。我得到了
Hello, world
Exception in thread "main" java.lang.NoClassDefFoundError: pack/Goodbye
at test.main(test.java:9)
Caused by: java.lang.ClassNotFoundException: pack.Goodbye
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 1 more
有人可以解释我在这种情况下做错了什么吗?我正在研究ubuntu 14.04并在终端中做所有事情。
Hello.java和Goodbye.java文件都位于
中/home/username/apps/src
目录。对应的类文件在
中/home/username/apps/bin/pack
目录。包目录由
创建javac -d ./bin
命令。 Hello.java文件的内容
package pack;
public class Hello
{
public static void HelloMessage()
{
System.out.println("hello, world");
}
}
一切正常。为其相应的类文件加载 Goodbye.java文件的内容是
package pack;
public class Goodbye
{
public static void message()
{
System.out.println("bye");
}
}
导入软件包的test.java文件位于/ home / username / apps目录下。它有以下代码行
import pack.*;
public class test
{
public static void main(String args[])
{
Hello.HelloMessage();
Goodbye.message();
}
}
非常感谢任何帮助。
答案 0 :(得分:1)
我对您的类文件的理解类似于以下树:
/home/username/apps/bin
|
+-- pack
| |
| +--- Hello.class
| |
| +--- Goodbye.class
|
+-- test.class
然后转到/home/username/apps/bin
并致电
java -cp . test
使用-cp
添加当前目录以搜索类。这应该始终是您的包的根。然后参考你的主要课程。
BTW:根据Java naming conventions,班级名称应以大写字母开头,如Test
。
更新:更新了班级文件位置。
答案 1 :(得分:0)
您需要设置两个位置的类路径,因为您有两个不同位置的类文件:
您可以使用javac命令的-cp选项来完成此操作。您需要在多个类路径之间放置分号,如下所示:
java -cp .;./bin test