2016-05-13 66 views
0

经过半天的搜索各种堆栈线程而没有找到答案,我会试着问自己。从头开始创建一个类的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

假设你A类是下一个包,改变...
JarEntry e = new JarEntry("A.class");

JarEntry e = new JarEntry(SimpleJava.class.getName().replace('.', '/') + ".class");

这将会把你的A.class罐中的合适的包/目录结构下。

如果文件编码不匹配,XML解析器将无法读取文件。因此,要匹配.classpath文件中提到的xml编码,请将f.write(s.getBytes());更新为f.write(s.getBytes("UTF-8"));

希望这适用于您。

+0

好点,谢谢:) – Poody

+0

我甚至不确定你需要一个可运行jar的.classpath文件tho – Poody

+0

你是对的,.classpath不需要存在于jar文件中。更正了我的答案,将“.class”添加到文件名。 –