.java文件中的包使得类文件不可用

Kdg*_*Dev 2 java

自从我上次完成Java以来​​已经太久了,我不记得为什么会发生以下情况:

鉴于此文件由标准Maven项目创建,如下所示:Maven Tutorial

package com.mycompany.app;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}
Run Code Online (Sandbox Code Playgroud)

编译它,即使使用Maven但使用标准的javac可执行文件,也会生成一个没有错误的类文件.尝试运行类文件,您会收到此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: App (wrong name: com/mycompany/app/App)
Run Code Online (Sandbox Code Playgroud)

删除包命令,再次编译,它运行正常.为什么是这样?我正在运行JDK 1.6.0_21顺便说一句.

小智 8

在为类创建之后,您必须做的一件事是创建嵌套子目录来表示类的包层次结构.在您的情况下,包名称是"com.mycompany.app",因此App.class(已编译的App.java文件)应驻留在"com/mycompany/app"子目录中.尽管源文件驻留在哪里并不重要.例如,我复制了您的文件并执行了以下操作:

$ ls
App.java
$ javac App.java 
$ ls
App.class       App.java
$ mkdir -p com/mycompany/app
$ mv App.class com/mycompany/app/
$ java com.mycompany.app.App
Hello World!
$ 
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读有关Java包的Wikipedia页面.您还可以查看以下链接:

祝好运!