运行 Java 命令包括当前文件夹中的所有 JAR

Running Java command including all JARs in current folder

我刚刚从 IDE 切换回记事本来编写 Java 程序。该程序使用 20 个 JAR。我编译成功了。当我决定使用 运行 Java class 文件时

java -cp ".\*" MyProgram

它给出了标准错误 "Couldn't find or load main class...."。

我很困惑,因为当我使用 运行 现有文件夹中所有文件的 java 命令时,它只会获取那些 JAR,因为当前文件夹已经在 class路径。由于该程序来自当前文件夹 运行ning,我尝试使用 -cp "." 将其显式包含在 class 路径中,但这也没有用。

最后我可以使用这个命令 运行 程序:

java -cp ".\*;." MyProgram.java

我问这个问题是为了理解 Java 的 class 路径背后的实际逻辑。

如果我错了请纠正我,但我认为 JAR 只是一个标准存档,其中所有包都封装在各自的文件夹中。如果所有 JAR 都在我当前的文件夹中,包括我的主 class 文件,那么为什么我不能 运行 它:

java -cp "." MyProgram 

或简单地:

java MyProgram

如果问题在于要包含的多个 JAR 文件,这就是我们使用 ".\*" 将所有 JAR 包含在 class 路径中的原因,那么为什么我们必须显式包含当前文件再次在 class 路径中使用以下文件夹:

java ".\*;." MyProgram

class 路径是包含程序的 classes 和资源的 jar 文件和目录的列表。提及 jar 文件会将其内容添加到 class 路径。

"./*" 将只获取当前目录中的 jar 文件,"." 将当前目录添加到 class 路径。这允许访问所有 classes(以及作为原始文件资源的 jar 文件,但不能访问其内容,即其中包含的 classes)。

如果在 class 路径中需要两者,则必须同时指定。

"."表示当前目录不是目录中的文件

"./*"表示当前目录下的所有文件。

所以你想使用当前目录中的所有 jar,所以 2nd 可以工作

要在命令提示符中包含 运行 您的程序所需的所有 jar,请使用通配符 *:

java -classpath E:\lib\* HelloWorld

您正在使用 "."" 定义当前目录,"./*"" 定义当前目录中的所有文件。

你已经回答了你自己的问题,有点。

.表示会在当前目录下寻找.class个文件

JAR 就像一个目录。因此,要获得 abc.jar "directory",您需要在类路径中指定 abc.jar

如果您需要当前目录中存在的 .class 文件,以及打包到当前目录中找到的 JAR 中的 .class 文件,您将具有以下类路径:-cp ".:*.jar

这里的所有答案都告诉你使用不带扩展名的通配符(*./*)但这是一个不好的做法,你不希望 Java 去查看不相关的文件,因此指定扩展名:*.jar.