5

我的目录结构如下所示。

PackagesUnit3/com/myname/start/PackagesTest.java
(这个类包含我的main和import语句“import com.systems.mui.*;)

PackagesUnit3/com/systems/mui/Test.java
(该类包含包语句“package com.systems.mui;”)

使用 PackageUnit3 作为我的基本目录,我可以使用语句成功编译这两个类

"javac com/myname/start/PackagesTest.java"

但是我无法使用命令运行代码

"java com.myname.start.PackagesTest"

Error: "Exception in thread "main" java.lang.NoClassDefFoundError: com/myname/start/PackagesTest (wrong name: PackagesTest)"

编译器成功地.class为每个 java 类生成了文件,并将它们放置在与源文件相同的位置。

根据 Horstmann,“Core Java”第 9 版。页。186,我的“java”命令语法应该可以工作。

我不应该指定当前目录 ("."),因为我没有使用类路径 (-cp) 选项。

注意:我使用“SUBST R:”命令将 PackagesUnit3 目录建立为基本目录。我的实际命令行看起来像R:>

有什么建议么??

4

2 回答 2

10

鉴于例外情况,您似乎缺少一条package语句:

package com.myname.start;

您的包声明应该与您的目录结构匹配,然后将使用正确的完全限定名称生成该类com.myname.start.PackageTest

要么在 IDE 中编译,它会为你解决问题,要么从你的包结构的根目录编译,带有一个可选-d参数来指定根输出目录,例如

$ javac -d bin com/myname/start/*.java
$ java -cp bin com.myname.start.PackageTest
于 2013-08-02T14:59:44.890 回答
0

我已经检查过了,重新创建了场景,你是对的......假设所有类都是公共的,具有正确的包声明,并从根目录编译,类Test将成功编译,因为它不引用任何其他类(或来自不同包的类)。不需要任何-cp选项

编译类PackagesTest时,找不到类Test。但是通过添加-cp .,它编译成功。

一旦两个文件都被编译,尝试运行PackagesTest'main,也将无法找到类Test。但是通过添加-cp ,它运行顺利。

通过使用该选项-verbose,您可以看到查找类的 javac(和 java)命令在哪里,因为它显示了不包含“.”的默认类路径。(本地目录)

于 2013-08-02T15:25:07.377 回答