用一个类从头开始创建jar

时间:2016-05-13 15:03:33

标签: java javafx jar

经过半天的搜索各种堆栈线程而没有找到答案,我会试着问自己。

以下方法充满尝试执行以下操作。 在一个项目中,我有一个名为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) {}
}

随意提出任何进一步的问题。

1 个答案:

答案 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"));

希望这对你有用。