如何在包中运行Java类?

时间:2012-06-14 11:58:55

标签: java

我有两个java类,如下所示

App1没有包裹:

class App1 {
    public static void main(String[] args) {
        System.out.println("App1 hello world...");
    }
}
包中的

App2

package java.java.package1;    
class App2 {
    public static void main(String[] args) {
        System.out.println("App2 hello world...");
    }
}

我可以编译它们:

D:\javaTest>javac App1.java

D:\javaTest>javac App2.java

但是,我只能运行第一个:

D:\javaTest>java App1
App1 hello world...

D:\javaTest>java java.java.package1.App2

Exception in thread "main" java.lang.NoClassDefFoundError: java/java/package1/App2
Caused by: java.lang.ClassNotFoundException: java.java.package1.App2
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: java.java.package1.App2.  Program will exit.

如何运行App2

5 个答案:

答案 0 :(得分:22)

如果将 source 放在与包名称(D:\javaTest\java\java\package1\App1.java)匹配的适当目录层次结构中,并从层次结构的根目录(D:\javaTest)编译/运行,你不会有这个问题:

D:\javaTest>javac java\java\package1\App1.java

D:\javaTest>java java.java.package1.App1
App2 hello world...

您还可以使用-d选项进行编译,以便将类移动到这样的目录层次结构中:

javac -d . App2.java
java java.java.package1.App2

请注意,不应使用以java开头的包名称,并且更高版本的JDK将抛出SecurityException。有关详细信息,请参阅this question

答案 1 :(得分:1)

你必须放-d directory选项..因为

  

设置类文件的目标目录。如果一个班级是一个班级的一部分   包,       javac将类文件放在反映包名的子目录中,       根据需要创建目录。例如,如果指定-d c:\ myclasses       并且该类被称为com.mypackage.MyClass,然后调用类文件       C:\ myclasses \ COM \ mypackage中\ MyClass.class

答案 2 :(得分:0)

App2需要位于java / java / package1目录中。在java中,包名称和源代码的目录必须匹配。你没有收到编译错误吗?

答案 3 :(得分:0)

您创建一个新目录。这是包含您的工作的目录,不是您的包的开头。

例如,我创建了文件夹/ terri来开始。

然后我在它下面创建文件夹结构/ clarie / andrea。 在这个例子中,我的包将被称为claire.andrea。 正常的包名称以com开头,然后是公司名称或类似的东西(或标准java包的java,所以不要使用它:如java.lang。*)。

在andrea文件夹中,我创建了一个名为Saluton.java的java文件,其中包含Saluton类(只打印hello)。类名和文件名必须匹配。

从terri /文件夹中编译:javac。\ claire \ andrea \ Saluton.java 这将在\ terri \ claire \ andrea \ Saluton.class中创建一个Saluton.class

要运行:(再次来自/ terri),我这样做:java -cp。 claire.andrea.Saluton 其中说,使用当前目录中的类路径 我的主程序在claire.andrea包中,类名是Saluton。

这是运行: \特丽    java -cp。 claire.andrea.Saluton

“Hello World”。

总而言之,包名称与底层目录结构非常匹配。 该文件(如果它引用了一个包)必须存在于它所引用的目录结构中。如果我使用包claire.andrea在/ terri中编译Saluton.java我还没有找到运行它的方法,它编译得很好。

此外,该类的文件名必须与该文件中的公共类匹配。

运行,package.Class。通常,包不是大写的,类是。

答案 4 :(得分:0)

在命令提示符下通过以下命令检查您的类路径值是什么 回声%CLASSPATH%

检查类的创建位置。 要编译Java源程序,您需要检查所给的路径,无论那里是否有Java文件。