Java "could not find or load main class"类路径错误

标签 java command-line jar classpath

我在使用 Java 中的 -cp 或 -classpath 标志进行编译时遇到了一个问题。我将尝试在下面解释这个问题:

比方说;我有两个文件 - A.java 和 B.java。 A.java 有一个简单的公共(public)类,带有一个私有(private)实例变量,一个 get 和一个 set 方法。 B.java是A的驱动方法,它实例化了A;为 A 的实例变量设置一些值,最后使用 A 中的 get 方法打印出该值。

我可以从命令行编译 A.java 和 B.java。如果两个编译的类文件都在同一个文件夹中;以下运行正常:

Java B

但是;假设我将 A.class 保存在一个单独的文件夹中。甚至更好;我制作了类文件 A.class 的 JAR 文件。现在;我应该能够使用正确说明的类路径编译 B.java。

编译成功。

javac -cp ..\Lib\A.jar -d ..\Bin B.java

它按预期将 B.class 文件放在 Bin 文件夹中。现在;如果我转到 Bin 文件夹并尝试执行以下操作;

java -cp ..\Lib\A.jar B

我得到错误:

Error: Could not find or load main class B

现在;在过去的几天里,我一直在徒劳地尝试解决这个问题。这是一个演示问题的简单用例;但实际上 - 我无法使用 -classpath 或 -cp 标志链接到现有的 JAR 库。我可以从命令行运行 Java 程序的唯一方法是从 JAR 存档中将类文件提取到与输出类相同的目录中。因此,我不需要在执行命令中包含类路径标志。

但这是我不想要的。我想将 JAR 存档与源代码的输出类文件分开。我知道使用 IDE;这是我不需要担心的事情。但我对命令行解决方案更感兴趣;了解引擎盖背后的内容。

我已经阅读了 StackOverflow 上关于此的所有其他建议 - 但似乎都没有用。仅供引用,我在所有情况下都使用默认包。没有明确指定包装。

请帮忙。提前致谢!

更新:我被要求以可读格式提供我的目录结构,所以这里是:

$pwd
C:\My\Path\To\Java\Programs\Top
$ls
Source
Bin
Lib
$cd Bin 
$ls
B.class
$ls ..\Source\
A.java
B.java
$ls ..\Lib
A.jar
$jar tf ..\Lib\A.jar
META-INF
META-INF/MANIFEST.MF
A.java
A.class

我希望这能清除它。我使用的是 Windows Powershell,所以子目录用“\”标记。如果我在 Unix 终端中输入,它应该是“/”。顺便说一下,我在 Ubuntu 14.04 上试过了,没有用。我还使用 jdk 1.6 到 jdk 1.8 对此进行了测试 - 同样的错误。

最佳答案

您在尝试运行程序时错过了“类路径”。

人们错误地认为“-cp ..\Lib\A.jar”是在运行时包含A.class。但问题是,“-cp”选项是设置类路径而不包括。这样一来就缺少类“B”的类路径。

因此,要从“Bin”文件夹运行您的程序,正确的命令(对于任何 Windows 系统)是:“java -cp .;..\Lib\A.jar B”。这 ”。”一切都不同,指的是当前目录。

对于 Linux,“Bin”文件夹中的命令变为:“java -cp .:../Lib/A.jar B”。

主要区别在于分隔符,“;”适用于 Windows,“:”适用于 Linux。

关于Java "could not find or load main class"类路径错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24691224/

相关文章:

java - 如何将 VM 选项添加到 jar 文件?

java - 可执行 jar 方法

java - 对同一类中方法的无参数调用产生 NullPointerException

java - 从 EditTextPreference 获取文本并保存

bash - 无法从 shell 脚本调用 openscad -D 命令行

bash - 如何在 Bash 中将变量设置为命令的输出?

java - 如何通过 eclipse 调试外部 .jar 文件?

java - 查找多模块 Maven 项目的代码覆盖率

java - 驱动程序 "com.mysql.jdbc.Driver"不支持 url "null"

java - 通过命令行 cucumber maven