2017-09-26 1 views
1

Mein Ziel ist es, den Strom einiger .classes zu nehmen und eine JAR zu erstellen.JAR generiert mit JarOutputStream mit ungültiger .class

Das Problem ist, dass JAR Stores die Klassen erstellt, aber nicht als Klassenpfad verwendet werden kann (es findet nur die Klasse nicht). Die JAR ist nicht beschädigt und wenn ich die JAR dekomprimiere, kann ich die .classes verwenden. Also, was ist das Problem, wenn dieser Code?

@Test 
public void createJARTest() throws IOException 
{ 
    final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    final JarOutputStream jarOutputStream = new JarOutputStream(byteArrayOutputStream); 

    final String path = "/com/app/MyClass.class"; 

    final JarEntry entry = new JarEntry(path); 
    jarOutputStream.putNextEntry(entry); 

    final BufferedInputStream in = new BufferedInputStream(this.getClass().getResourceAsStream(path)); 

    final byte[] buffer = new byte[1024]; 
    int bytesRead = 0; 
    while ((bytesRead = in.read(buffer)) != -1) 
    { 
     jarOutputStream.write(buffer, 0, bytesRead); 
    } 
    in.close(); 
    jarOutputStream.closeEntry(); 

    jarOutputStream.close(); 

    byteArrayOutputStream.writeTo(new FileOutputStream("/Downloads/classpath.jar")); 
    byteArrayOutputStream.close(); 
} 

Antwort

1

fand ich das Problem:

Die JarOutputStream hat drei undokumentierte Macken:

  1. Verzeichnisnamen mit einem '/' Slash enden.
  2. Pfade müssen '/' Schrägstriche verwenden, nicht '\'
  3. Einträge dürfen nicht mit einem '/' Schrägstrich beginnen.

So wurde die Lösung nur eine Zeile:

final JarEntry entry = new JarEntry("com/app/MyClass.class"); 
Verwandte Themen