bash
/Desktop/Lab 3$ cd Stemmer
/Desktop/Lab 3/Stemmer$ java Stemmer
/Desktop/Lab 3/Stemmer$ cd ..
/Desktop/Lab 3$ java Stemmer/Stemmer
Error: Could not find or load main class Stemmer.Stemmer
Caused by: java.lang.NoClassDefFoundError: Stemmer (wrong name: Stemmer/Stemmer)
/Desktop/Lab 3$
当我指定一个相对路径时,为什么java不运行Stemmer
?
当我在目录中时,它似乎已经运行了程序,但我希望java像在它所在的目录中一样运行Stemmer
。
有人能解释一下这里发生了什么吗。
运行Java程序时,指定类名,包括完全指定的包,而不是文件路径。这意味着你将包裹"分开";路径";用点,而不是斜线。如果您编译了一个名为Stemmer.java
的文件,该文件位于名为Stemmer
的文件夹中,并且第一行为package Stemmer
,则执行
java Stemmer.Stemmer
有两个广泛的选项:
您正在尝试用java编写应用程序
然后,您需要一个IDE来开发它,并需要一个构建系统来生成jar文件形式的可分发文件。尝试以现在的方式在"命令行"上运行此程序没有任何意义或理由。您需要包和项目定义。
您现在只是在玩,在一个源文件中编写一些基本代码
然后只运行源文件。我认为这是java11中引入的一个特性。在此之前,这种编写模式(在源文件中填充一些行并立即运行(并不是java本身擅长的,只有IDE才能做到这一点。
从java11:开始
java Stemmer/Stemmer.java
效果很好,无需(重新(编译任何内容。java
会处理的。
解释
运行Java程序时,指定类名,包括完全指定的包而不是文件路径。
你之前读过这个答案,然后完全忽略它,尝试java Stemmer.Stemmer
,这显然不起作用。
您拥有的类名为Stemmer
,它位于未命名的包中。因此,要运行它,java Stemmer
就是如何做到这一点的。这不是文件名。Stemmer.Stemmer
不是"运行子目录Stemmer
中的类文件Stemmer
"的java ese,而"package"不是"文件系统上的目录"的java se。
Stemmer类的类路径根是它自己的目录,因为您没有使用任何包。默认的类路径是当前目录。如果Stemmer类文件的根目录不在类路径上,运行它是不可能的,所以如果/Desktop/Lab 3/Stemmer
不在cp上,你就不能这样做
java -cp '/Desktop/Lab 3/Stemmer' Stemmer
这会很好用的。
一般来说,使用未命名的包是个坏主意,尝试运行原始类文件也是个坏主意——使用IDE进行开发,使用构建系统来构建项目。
这些规则和注意事项在编写"真实"项目时都非常有意义(您可以检查源代码管理,并最终将其部署到某个地方或作为产品交付给其他用户(。但如果只是胡搅蛮缠,那就太麻烦了,而且有点可笑。这正是为什么(现在(你可以指定一个路径到一个java源文件,这似乎是你想要做的。