Java"无法找到或加载主类",类路径错误

Ari*_*yek 7 java command-line jar classpath

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

我们说吧; 我有两个文件 - A.java和B.java.A.java有一个简单的公共类,它有一个私有实例变量,一个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
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Error: Could not find or load main class B
Run Code Online (Sandbox Code Playgroud)

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

但这是我不想要的.我想将我的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
Run Code Online (Sandbox Code Playgroud)

我希望能够清除它.我使用的是Windows Powershell,因此子目录标有"\".如果我在Unix终端中输入,那么它将是"/".顺便说一句,我在Ubuntu 14.04上试过这个,但没有用.我也用jdk 1.6到jdk 1.8进行了测试 - 同样的错误.

Mal*_*lay 5

在尝试运行程序时,您错过了"类路径".

有人误以为"-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.


Ari*_*jee -1

而不是以下内容:

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

提供这个

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

谢谢,

阿里特拉