经过半天的搜索各种堆栈线程而没有找到答案,我会试着问自己。
以下方法充满尝试执行以下操作。 在一个项目中,我有一个名为A的类。这个类没有在项目中使用,它有main()内部和小代码来创建一个测试文件并显示一个javafx窗口。方法导出使用所述类创建一个jar文件,将其标记为主类。 我正在寻找一种方法将lib.jar压缩到output.jar文件中,无论方法如何。 我必须注意.. output.jar被创建,在启动它没有显示javafx窗口,但创建测试文件,所以如果你知道原因,请随时贡献。 :)
public void export() {
Manifest man = new Manifest();
man.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
man.getMainAttributes().put(Attributes.Name.CLASS_PATH, ". mylib.jar");
man.getMainAttributes().put(Attributes.Name.MAIN_CLASS, A.class.getName());
try {
JarOutputStream f = new JarOutputStream(new FileOutputStream("output.jar"), man);
InputStream c = getClass().getResourceAsStream("A.class");
JarEntry e = new JarEntry("A.class");
f.putNextEntry(e);
byte[] buffer = new byte[1024];
while (true) {
int count = c.read(buffer);
if (count == -1)
break;
f.write(buffer, 0, count);
}
f.closeEntry();
JarEntry cp = new JarEntry(".classpath");
f.putNextEntry(cp);
String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<classpath>"
+ "<classpathentry kind=\"src\" path=\"src\"/>"
+ "<classpathentry kind=\"con\" path=\"org.eclipse.jdt.launching.JRE_CONTAINER\"/>"
+ "<classpathentry kind=\"lib\" path=\"mylib.jar\"/>"
+ "<classpathentry kind=\"output\" path=\"bin\"/>"
+ "</classpath>";
f.write(s.getBytes());
f.closeEntry();
f.close();
} catch (IOException e) {}
}
随意提出任何进一步的问题。
答案 0 :(得分:1)
假设您的A
课程在一个包裹下,请更改...
JarEntry e = new JarEntry("A.class");
到
JarEntry e = new JarEntry(SimpleJava.class.getName().replace('.', '/') + ".class");
这会将您的A.class
放在jar中正确的包/目录结构下。
如果文件编码不匹配,XML解析器将无法读取文件。因此,要匹配.classpath
文件中提到的xml编码,请将f.write(s.getBytes());
更新为f.write(s.getBytes("UTF-8"));
希望这对你有用。