17

我有两个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

4

5 回答 5

29

如果您将源代码放在与包名称 ( ) 匹配的适当目录层次结构中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。有关更多信息,请参阅此问题

于 2012-06-14T12:01:16.050 回答
3

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

例如,我创建文件夹 /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。

这是运行: \terri java -cp 。克莱尔·安德里亚·萨卢顿

“你好世界”。

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

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

要运行,package.Class。一般来说,包不是大写的,类是大写的。

于 2016-10-18T21:33:55.167 回答
1

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

设置类文件的目标目录。如果类是包的一部分,javac 会将类文件放在反映包名称的子目录中,并根据需要创建目录。例如,如果您指定 -dc:\myclasses 并且类名为 com.mypackage.MyClass,则类文件名为 c:\myclasses\com\mypackage\MyClass.class。

于 2012-06-14T12:17:16.417 回答
0

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

于 2012-06-14T12:04:34.957 回答
0

在命令提示符 echo %CLASSPATH% 中通过以下命令检查您的类路径值

检查您的班级是在哪里创建的。要编译 java 源程序,您需要检查您提供的路径,java 文件是否可用。

于 2020-05-21T18:40:33.957 回答