是否有一种方法将所有jar文件包含在类路径的目录中?
我正在尝试java -classpath lib/*.jar:。program,它不能找到在这些罐子里的类文件。我是否需要将每个jar文件分别添加到类路径中?
是否有一种方法将所有jar文件包含在类路径的目录中?
我正在尝试java -classpath lib/*.jar:。program,它不能找到在这些罐子里的类文件。我是否需要将每个jar文件分别添加到类路径中?
当前回答
以适合多个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
其他回答
如果您在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将查找确切的模式。
希望能有所帮助!!
对我来说,这适用于窗户。
java -cp "/lib/*;" sample
linux
java -cp "/lib/*:" sample
我使用的是Java 6
您需要分别添加它们。或者,如果确实需要指定一个目录,可以将所有内容解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
分隔符是冒号而不是分号。
简写形式:如果你的main在一个jar中,你可能需要一个额外的“-jar pathTo/yourJar/YourJarsName.jar”显式声明来让它工作(即使“YourJarsName.jar”在类路径中) (或者,回答5年前提出的原始问题:你不需要显式地重新声明每个jar,但看起来,即使在java6中,你也需要重新声明自己的jar…)
长形式: (我已经明确说明了这一点,我希望即使是java的闯入者也可以使用它)
像这里的许多人一样,我使用eclipse导出JAR:(File-> export ->'可运行的JAR文件')。eclipse (Juno)提供了三个“库处理”选项:
opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"
通常我会使用opt2 (opt1肯定会破坏),但是我正在使用的一个jar中的本机代码,当您选择该选项时,我发现eclipse利用了方便的“jarinjar”技巧。即使在意识到我需要opt3之后,然后找到这个StackOverflow条目,我仍然花了一些时间来弄清楚如何在eclipse之外启动我的main,所以这里是对我有用的,因为它对其他人很有用……
如果你将罐子命名为fooBarTheJarFile.jar 和所有设置导出到目录:“/theFully/qualifiedPath/toYourChosenDir”。
(意味着“导出目的地”字段将读取:“/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar”)
当你点击finish后,你会发现eclipse将所有的库放在一个名为“fooBarTheJarFile_lib”的文件夹中,就像这样:
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar
然后,您可以从系统上的任何地方启动:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(对于Java新手来说:` package.path_to.the_class_with. path `。your_main'是声明的包路径,你可以在' classwithyourmain .java'文件的顶部找到,该文件包含'main(String[] args){…}'你希望在java之外运行)
要注意的陷阱:在你声明的类路径上的jar列表中有'fooBarTheJarFile.jar'是不够的。您需要显式地声明'-jar',并重新声明该jar的位置。
例如:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain
用相对路径重申:
cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS: java -cp "fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" -jar package.path_to.the_class_with.your_main.TheClassWithYourMain
WORKS: java -cp ".;fooBarTheJarFile_lib/*" -jar fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(使用Java版本“1.6.0_27”;通过OpenJDK 64位服务器虚拟机安装在ubuntu 12.04上)