在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
我收到错误:
Error: Could not find or load main class B
现在;过去几天我一直试图解决这个问题。这是一个简单的用例来演示这个问题;但实际上 - 我无法使用-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
我希望能够清除它。我使用的是Windows Powershell,因此子目录标有“\”。如果我在Unix终端中输入,那么它将是“/”。顺便说一句,我在Ubuntu 14.04上试过这个,但没有用。我还用jdk 1.6到jdk 1.8进行了测试 - 同样的错误。
答案 0 :(得分:5)
你错过了"类路径"在尝试运行程序时。
有人错误地认为" -cp .. \ Lib \ A.jar"是在运行时包含A.class。但问题是," -cp"选项是设置类路径而不包括。这样就缺少了类#34; B"。
的类路径所以要运行你的程序,来自" Bin"文件夹,正确的命令(对于任何Windows系统)是:" java -cp。; .. \ Lib \ A.jar B"。 "。"参考当前目录,完全不同。
对于Linux,命令来自" Bin"文件夹,变成:" java -cp。:../ Lib / A.jar B"。
主要区别在于分隔符," ; "适用于Windows和" :"适用于Linux。
答案 1 :(得分:-1)
而不是以下内容:
java -cp .. \ Lib \ A.jar B
提供此
java B -cp .. \ Lib \ A.jar
谢谢,
Aritra