我的目录结构如下所示。
PackagesUnit3 / COM / MYNAME /启动/ PackagesTest.java
(此类包含我的main和import语句“import com.systems.mui。*;)
PackagesUnit3 / COM /系统/ MUI / Test.java
(此类包含package语句“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)"
编译器为每个java类成功生成.class
个文件,并将它们放在与源文件相同的位置。
根据Horstmann的说法,“Core Java”第9版。页。 186,我的“java”命令语法应该有用。
我不必指定当前目录(“。”),因为我没有使用classpath(-cp)选项。
注意:我使用“SUBST R:”命令将PackagesUnit3目录建立为基本目录。我的实际命令行看起来像 R:>
有什么建议吗?
答案 0 :(得分: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
答案 1 :(得分:0)
我已经检查了这一点,重新创建了场景并且你是对的...假设所有类都是公共的,具有正确的包声明,并且从根目录编译,类Test
将成功编译,因为它不引用任何其他类(或来自不同包的类)。不需要-cp
选项
在编译类PackagesTest
时,无法找到类Test
。但是通过添加-cp .
,它可以成功编译。
一旦编译了两个文件,尝试运行PackagesTest
'main,也将无法找到类Test
。但通过添加-cp ,
,它可以顺利运行。
通过使用选项-verbose
,您可以看到javac(和java)命令在哪里查找类,因为它显示默认的类路径,它不包含“。”。 (本地目录)