是否有一种方法将所有jar文件包含在类路径的目录中?
我正在尝试java -classpath lib/*.jar:。program,它不能找到在这些罐子里的类文件。我是否需要将每个jar文件分别添加到类路径中?
是否有一种方法将所有jar文件包含在类路径的目录中?
我正在尝试java -classpath lib/*.jar:。program,它不能找到在这些罐子里的类文件。我是否需要将每个jar文件分别添加到类路径中?
当前回答
在Windows下,这是有效的:
java -cp "Test.jar;lib/*" my.package.MainClass
这是行不通的:
java -cp "Test.jar;lib/*.jar" my.package.MainClass
注意*.jar,因此*通配符应该单独使用。
在Linux操作系统下,如下所示:
java -cp "Test.jar:lib/*" my.package.MainClass
分隔符是冒号而不是分号。
其他回答
使用Java 6或更高版本,类路径选项支持通配符。注意事项:
使用直引号(") 使用*,而不是*.jar
窗户
lib/*" my.package.MainClass . java -cp "Test.jar
Unix
java -cp "Test.jar:lib/*" my.package.MainClass .jar:lib/*
这类似于Windows,但使用:而不是;。如果你不能使用通配符,bash允许以下语法(其中lib是包含所有Java存档文件的目录):
Java -cp "$(printf %s: lib/*.jar)"
(注意,使用类路径与-jar选项不兼容。参见:从命令提示符执行带有多个类路径库的jar文件)
理解通配符
从类路径文档中:
Class path entries can contain the basename wildcard character *, which is considered equivalent to specifying a list of all the files in the directory with the extension .jar or .JAR. For example, the class path entry foo/* specifies all JAR files in the directory named foo. A classpath entry consisting simply of * expands to a list of all the jar files in the current directory. A class path entry that contains * will not match class files. To match both classes and JAR files in a single directory foo, use either foo;foo/* or foo/*;foo. The order chosen determines whether the classes and resources in foo are loaded before JAR files in foo, or vice versa. Subdirectories are not searched recursively. For example, foo/* looks for JAR files only in foo, not in foo/bar, foo/baz, etc. The order in which the JAR files in a directory are enumerated in the expanded class path is not specified and may vary from platform to platform and even from moment to moment on the same machine. A well-constructed application should not depend upon any particular order. If a specific order is required then the JAR files can be enumerated explicitly in the class path. Expansion of wildcards is done early, prior to the invocation of a program's main method, rather than late, during the class-loading process itself. Each element of the input class path containing a wildcard is replaced by the (possibly empty) sequence of elements generated by enumerating the JAR files in the named directory. For example, if the directory foo contains a.jar, b.jar, and c.jar, then the class path foo/* is expanded into foo/a.jar;foo/b.jar;foo/c.jar, and that string would be the value of the system property java.class.path. The CLASSPATH environment variable is not treated any differently from the -classpath (or -cp) command-line option. That is, wildcards are honored in all these cases. However, class path wildcards are not honored in the Class-Path jar-manifest header.
注意:由于java 8中的一个已知错误,windows示例必须在条目前使用反斜杠,后面带星号:https://bugs.openjdk.java.net/browse/JDK-8131329
以适合多个jar和当前目录的类文件的方式设置类路径。
CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar;
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH
如果使用Java 6,则可以在类路径中使用通配符。
现在可以在类路径定义中使用通配符:
javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java -d build/classes
裁判:http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
如果您在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将查找确切的模式。
希望能有所帮助!!
我在Ubuntu 10.04上使用java-sun 1.6.0_24的解决方案,所有的jar都在“lib”目录下:
java -cp .:lib/* my.main.Class
如果失败,下面的命令应该起作用(打印出所有*。lib目录中的jar到类路径参数)
java -cp $(for i in lib/*.jar ; do echo -n $i: ; done). my.main.Class