我有两个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
?
答案 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文件。