使用bashshell中的相对路径调用java文件


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源文件,这似乎是你想要做的。

最新更新