第一篇文章,很抱歉我的格式不佳。我有一个我在eclipse中开发的java程序。我将程序导出为jar(myJar.jar),然后将我程序所依赖的所有外部jar放入名为 lib 的文件夹中,该文件夹与myJar.jar位于同一位置。为了设置我的类路径,我有一个清单文件,格式如下:
Main-Class: exe.myMain
Class-Path: lib/jar_1.jar lib/jar_2.jar ... lib/jar_n.jar
Manifest-Version: 1.0
但是,当我尝试使用“java -jar myJar.jar”运行程序时,来自 lib 中的jar的类没有被加载(我得到了一个ClassNotFoundException)。我在程序中使用以下代码来打印类路径:
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url:urls){
System.out.println(url.getFile());
}
当我运行此代码时,类路径只是“myJar.jar”。
我有两个问题:
1。)上面的代码是否实际上在运行时给了我JRE的类路径,或者我只是给了我的主类的地址?
2。)鉴于上面的代码确实在运行时给了我JRE的类路径,我做错了吗?
请随时询问更多信息,我很乐意提供您所需要的信息。
答案 0 :(得分:1)
你在做什么听起来是对的。
出于某种原因,在检查类路径时,清单中的Class-Path
条目不会显示(例如here和here;这些示例使用属性"java.class.path"
但我的测试显示ClassLoader.getURLs()
表现相同)。它应该仍然可以搜索类。我不知道如何从清单中获取包含Class-Path
条目的真正类路径。
我要检查的第一件事是META-INF/MANIFEST.MF
内的文件myJar.jar
与您创建的清单相匹配。您可以通过将其重命名为myJar.jar
文件扩展名来打开.zip
。
我试图复制你的问题,但lib/jar_1.jar
中的课程已经为我加载了,所以如果META-INF/MANIFEST.MF
是正确的,我会详细描述我所做的事情,这样你就可以找到我们的内容做得与众不同。
修改强>
以下是我使用的步骤:
创建一个名为" experiment"的新目录。以下步骤都在该目录中完成。
创建名为" jar_1"," lib"和" exe"
创建一个名为" ClassInJar1.java"的文件。在目录" jar_1"具有以下内容:
package jar_1;
public class ClassInJar1 {
public static void method() {
System.out.println("Hello from ClassInJar1");
}
}
运行javac jar_1/ClassInJar1.java
运行jar cf lib/jar_1.jar jar_1/ClassInJar1.class
创建一个名为" myMain.java"的文件。在目录" exe"具有以下内容:
package exe;
import java.net.*;
import jar_1.ClassInJar1;
public class myMain {
public static void main(String[] args) {
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader) cl).getURLs();
for (URL url : urls) {
System.out.println(url.getFile());
}
ClassInJar1.method();
}
}
运行javac exe/myMain.java
创建一个名为" manifest"的文件。在"实验"目录包含以下内容:
Main-Class: exe.myMain
Class-Path: lib/jar_1.jar lib/jar_2.jar
Manifest-Version: 1.0
运行jar cfm myJar.jar manifest exe/myMain.class
运行java -jar myJar.jar
输出:
/.../experiment/myJar.jar
Hello from ClassInJar1
答案 1 :(得分:0)
您的chmod +x squash.sh
GIT_EDITOR=./squash.sh git rebase --interactive $COMMIT_ID
文件似乎有误。您有manifest
=> java但是有exe类型?推荐给你的是你应该使用eclipse导出你的jar文件它会自动为你创建所有的东西,你不必手动创建清单文件,这样你就可以犯错。请参阅以下详细信息:
我通过使用eclipse =>创建了一个java项目进行了测试使用eclipse的导出功能导出可运行的JAR =>使用第3个选项(将所需的库复制到子文件夹中......)。导出后,我得到名为Main-Class: exe.myMain
的jar和名为myJarName.jar
的文件夹。使用myJarName_lib
program =>打开jar在7zip
=>下打开META-INF
=>这是它的结构:
MANIFEST.MF