是否有一种方法将所有jar文件包含在类路径的目录中?

我正在尝试java -classpath lib/*.jar:。program,它不能找到在这些罐子里的类文件。我是否需要将每个jar文件分别添加到类路径中?


当前回答

简单回答:java -classpath lib/*:。my.package.Program

Oracle提供了关于在Java 6和Java 7的类路径中使用通配符的文档,在“理解类路径通配符”一节中。(在我写这篇文章的时候,这两页的内容是一样的。)以下是此次会议的重点总结:

In general, to include all of the JARs in a given directory, you can use the wildcard * (not *.jar). The wildcard only matches JARs, not class files; to get all classes in a directory, just end the classpath entry at the directory name. The above two options can be combined to include all JAR and class files in a directory, and the usual classpath precedence rules apply. E.g. -cp /classes;/jars/* The wildcard will not search for JARs in subdirectories. The above bullet points are true if you use the CLASSPATH system property or the -cp or -classpath command line flags. However, if you use the Class-Path JAR manifest header (as you might do with an ant build file), wildcards will not be honored.

是的,我的第一个链接与得分最高的答案中提供的链接相同(我没有希望超越它),但这个答案并没有提供更多的解释。由于现在Stack Overflow不鼓励这种行为,我想我应该对此进行扩展。

其他回答

如果您在Eclipse或Netbeans等任何IDE之外开发和运行Java应用程序,以上所有解决方案都非常有效。

如果您在Windows 7上使用Eclipse IDE for Development in Java,那么如果使用命令提示符运行Eclipse内部构建的类文件,可能会遇到问题。

例如,你在Eclipse中的源代码具有以下包层次结构: edu.sjsu.myapp.Main.java

json.jar是Main.java的外部依赖项

当您尝试从Eclipse中运行Main.java时,它将毫无问题地运行。

但是当你在Eclipse中编译Main.java后尝试使用命令提示符运行这个命令时,它会抛出一些奇怪的错误,比如“ClassNotDef Error blah blah”。

我假设你在源代码的工作目录中!!

使用下面的语法从命令提示符运行它:

json.jar" Main.java .jar" java -cp ".;json.jar" edu.sjsu.myapp.Main 不要错过。以上)

这是因为您已经将Main.java放在包edu.sjsu.myapp中,java.exe将查找确切的模式。

希望能有所帮助!!

来自wepapp的类:

  > mvn clean install

  > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2

macOS,当前文件夹

Java 13在macOS Mojave…

如果所有的.jar文件都在同一个文件夹中,使用cd将其设置为当前工作目录。与pwd核实。

对于-classpath,首先必须列出应用程序的JAR文件。使用冒号:作为分隔符,附加星号*以获得同一文件夹中的所有其他JAR文件。最后,将类的完整包名与main方法一起传递。

例如,对于一个名为my_app.jar的JAR文件中的一个应用程序,在一个名为com的包中一个名为app的类中有一个主方法。例如,在同一个文件夹中放置一些需要的罐子:

java -classpath my_app.jar:* com.example.App

这不是一个能够将/*设置为-cp的直接解决方案,但我希望您可以使用下面的脚本来缓解动态类路径和lib目录的情况。

 libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use  ~>         java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi; 

为Linux编写脚本,也可以为windows编写类似的脚本。如果提供了正确的目录作为"libDir2Scan4jars"的输入;脚本将扫描所有的jar并创建一个类路径字符串,并将其导出到一个env变量“tmpCLASSPATH”。

请注意,在Windows上的Java 7中,通配符展开被打破了。

查看这个StackOverflow问题以获得更多信息。

解决方法是在通配符后面加一个分号。Java -cp " where/*;"