3

我正在尝试运行我构建的 java prog,但我想从特定目录运行它。当指定我要运行的类文件的相对路径时,该路径包含一个带有句点的目录,它似乎使 java 出错了;因此,例如我尝试运行:

java -classpath myPath/myPath-1.2.3/myLongPath myPath/myPath-1.2.3/myLongPath/myProg

Java 错误提示找不到类 (NoClassDefFoundError);这是有道理的,因为我看到 java 正在寻找与我指定的目录不同的目录;它正在查找:myPath/myPath-1/2/3/myLongPath 而不是:myPath/myPath-1.2.3/myLongPath

尽我所能,我无法弄清楚如何向 java.exe 指定我希望它查看的目录包含句点。我尝试 \ 转义句点,但这没有帮助。以前有人遇到过这个问题吗?顺便说一句,我在 gnome 终端中的 linux 上运行。谢谢你的帮助。

4

2 回答 2

8

调用 java 的最后一个参数是要运行的类的名称。这不是文件名,而是类名。它包括完整的包名(除非该类在默认包中),用点分隔(不是斜线)。类名和任何包名都不能包含点。代表包路径的文件夹不得包含在类路径中包含的目录中(应该只有类文件夹的顶级目录)。

在你的情况下,这似乎只是myProg,但要确保,具有 main 方法的类的类名(包括包名)是什么?

例子:

如果我有一个类mypackage.mysubpackage.MainClass,并且类文件在/home/me/project/1.3/build/mypackage/mysubpackage/MainClass.class其中,那么运行该类的命令就是java -cp /home/me/project/1.3/build mypackage.mysubpackage.MainClass.

于 2010-02-18T08:42:42.703 回答
0

Java 使用句点作为包组件分隔符,因此它根本不能出现在类名中。由于类名与目录结构相关联,因此它也不能出现在类路径中使用的目录名中,并且再多的转义也无济于事。(使用目录分隔符本身作为包组件分隔符会更好,但它们在操作系统之间有所不同,Java 想要独立于操作系统。这是为此付出的代价之一。)

于 2010-02-18T08:45:41.950 回答