将类添加到包

时间:2016-03-23 12:32:00

标签: java packages

我正在学习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();
    }
}

非常感谢任何帮助。

2 个答案:

答案 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)

您需要设置两个位置的类路径,因为您有两个不同位置的类文件:

  1. / home / username / apps /(此位置提供test.class)
  2. / home / username / apps / src / bin(pack.Hello.class和pack.Goodbye.class在此位置可用)
  3. 您可以使用javac命令的-cp选项来完成此操作。您需要在多个类路径之间放置分号,如下所示:

    java -cp .;./bin test