2016-05-13 4 views
0

Nach einem halben Tag der Suche nach verschiedenen Stack-Threads und keine Antwort finden, werde ich versuchen, mich zu fragen.Erstellen von Glas von Grund auf neu mit einer Klasse

Die folgende Methode ist voller Versuche, das Folgende zu tun. In einem Projekt habe ich eine Klasse namens A. Diese Klasse wird nicht im Projekt verwendet, es hat main() innerhalb und kleinen Code, um eine Testdatei zu erstellen und ein javafx-Fenster anzuzeigen. Der Methodenexport erstellt eine JAR-Datei mit dieser Klasse und markiert sie als Hauptklasse. Ich suche nach einer Möglichkeit, eine lib.jar in die output.jar-Datei, wie auch immer möglich, zu schlagen. Ich muss beachten, dass .. output.jar erstellt wird, beim Starten zeigt es nicht das javafx-Fenster, sondern erstellt die Testdatei, also wenn Sie die Ursache dafür wissen, fühlen Sie sich frei, auch beizutragen. :)

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) {} 
} 

Fühlen Sie sich frei, weitere Fragen zu stellen.

Antwort

1

Unter der Annahme, dass Ihre A Klasse ist unter einem Paket, ändern ...
JarEntry e = new JarEntry("A.class");
zu
JarEntry e = new JarEntry(SimpleJava.class.getName().replace('.', '/') + ".class");

Dies legen Sie Ihre A.class unter der rechten Paket/Verzeichnisstruktur in dem Glas.

XML-Parser haben Probleme beim Lesen der Datei, wenn die Dateicodierungen nicht übereinstimmen. Also, um die Xml-Codierung in der .classpath Datei erwähnt, aktualisieren Sie f.write(s.getBytes()); zu f.write(s.getBytes("UTF-8"));
Ich hoffe, das funktioniert für Sie.

+0

Guter Punkt, danke :) – Poody

+0

Ich bin nicht einmal sicher, dass Sie eine .classpath-Datei für eine ausführbare JAR-Datei benötigen – Poody

+0

Sie haben Recht, der .classpath muss nicht in der JAR-Datei vorhanden sein. Korrigiert meine Antwort, fügte ".class" dem Dateinamen hinzu. –