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
就像我在它所在的目录里时一样。
有人能解释一下这里发生了什么事吗。
2条答案
按热度按时间gblwokeq1#
运行java程序时,指定的类名包括完全指定的包,而不是文件路径。这意味着用点而不是斜线分隔包“路径”。如果你编译了一个名为
Stemmer.java
在一个名为Stemmer
而且已经package Stemmer
作为第一行,那么你做kxkpmulp2#
有两种选择:
您正在尝试用java编写应用程序
然后您需要一个ide来开发它,并需要一个构建系统来生成jar文件形式的可分发内容。没有任何意义或理由试图运行这个'命令行'的方式你。您需要包和项目定义。
您现在只是在玩玩,在一个源文件中编写一些基本代码。
然后运行源文件。我认为,这是java11中引入的一个特性。在此之前,这种编写模式(在源文件中填充一些行并立即运行)并不是java本身擅长的,只有ide能够正确地做到这一点。
从java11开始:
工作很好,不需要(重新)编译任何东西。
java
我会处理的。解释
运行java程序时,指定的类名包括完全指定的包,而不是文件路径。
你以前读过这个答案,然后就开始完全忽略它而去尝试
java Stemmer.Stemmer
这显然行不通。你的班级被命名为
Stemmer
,它位于未命名的包中。因此,要运行它,java Stemmer
就是如何做到这一点。不是文件名。Stemmer.Stemmer
不是“运行类文件”的java eseStemmer
在子目录中Stemmer
,并且“package”不是“文件系统上的目录”的java ese。stemmer类的classpath根目录是它自己的目录,因为您不使用任何包。默认的类路径是当前目录。如果没有类路径上的根,就不可能运行stemmer类文件,因此如果
/Desktop/Lab 3/Stemmer
不在cp上,你不能这么做。所以我们来解决这个问题:那就行了。
一般来说,使用未命名的包是个坏主意,尝试运行原始类文件也是个坏主意——使用ide进行开发,使用构建系统构建项目。
这些规则和警告在编写一个“真正的”项目(您签入源代码管理并最终将其作为产品部署到某个地方或作为产品交付给其他用户)时都是非常有意义的。但如果只是胡闹,那就太麻烦了,有点可笑了。这就是为什么(现在)您可以只指定java源文件的路径,这似乎就是您想要做的。所以,就这么做吧。