2017-10-10 85 views
2

我刚刚从IDE切换回记事本来编写Java程序。该计划正在使用20个JAR。我编译成功。当我决定运行Java类文件时使用运行Java命令,包括当前文件夹中的所有JAR

java -cp ".\\*" MyProgram 

它给出标准错误“无法找到或加载主类....”。

我很困惑,因为当我用现有文件夹中的所有文件运行java命令时,它只会获得这些JAR,因为当前文件夹已经在类路径中。当程序从当前文件夹运行时,我尝试使用-cp "."将它明确地包含在类路径中,但这也不起作用。

最后我能够用这个命令运行程序:

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

我问这个问题,了解背后的Java的类路径中的实际逻辑。

纠正我,如果我错了,但我认为JAR只是一个标准的归档,其中所有的软件包都封装在各自的文件夹中。

java -cp "." MyProgram 

或者干脆:如果所有的JAR文件都在我的当前文件夹包括我的主类文件,那么为什么我不能与运行

java MyProgram 

如果问题是与多个JAR文件包括这就是为什么我们使用".\\*"包括在类路径中的所有JAR文件,那么为什么我们要明确在classpath中再次使用包含在当前文件夹:

java ".\\*;." MyProgram 
+0

http://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html。请参见“类路径通配符”一节。 Quote:“类路径条目可以包含基本名称通配符('*'),这被认为是相当于指定扩展名为.jar或.JAR的目录中所有文件的列表。例如,类路径entry'mydir/*'指定名为mydir的目录中的所有JAR文件,由'*'组成的类路径条目展开为当前目录中所有jar文件的列表。所以你真的只需要'cp'* ;.“' –

回答

0

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

.表示它将在当前目录中查找.class文件。

JAR的行为就像一个目录。所以要拥有abc.jar“目录”,你需要在你的类路径中指定。

如果你需要同时出现在当前目录下的.class文件和.class文件打包到当前目录中的JAR文件,您将有以下类路径:-cp ".:*.jar

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

+0

不,正确的语法确实是'。\ *'(或Unix中的'./*',或者更好的是'*')。请参阅Oracle文档:“类路径条目可以包含基本名称通配符('*'),它被认为等同于指定扩展名为.jar或.JAR的目录中的所有文件的列表。例如,类路径条目'mydir/*'指定名为mydir的目录中的所有JAR文件,包含'*'的类路径条目展开为当前目录中所有jar文件的列表。 http://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html –

1

类拍h是包含程序的类和资源的jar文件和目录的列表。提到一个jar文件将其内容添加到类路径中。

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

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

0

"."意味着当前目录不在目录

"./*"文件是指在当前目录下的所有文件。

所以要使用在当前目录中,以便第二个所有罐子将工作

1

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

java -classpath E:\lib\* HelloWorld 

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