2016-06-08 17 views
0

Nur zum Spaß mache ich eine kleine Java-Projektdatei auf meiner Dropbox, um Java für mich ohne eine Idee zu kompilieren, einfacher als alle diese lästigen Befehlszeilenargumente einzugeben mich selber.jar Kompilieren Runtime.getRuntime.exec() Volles Verzeichnis in jar

Jetzt gerade habe ich nur ein kleines Problem ... Zuerst hier ist mein Code, der Klassendateien in ein Glas mit einem Manifest zu kompilieren schafft.

public static String listFilesString(String dirLocation){ 
    String allPaths = ""; //pretty self explanatory returns full list of files in directory with spaces 
    File f = new File(dirLocation); 
    if(f.isDirectory()&&f.list().length>0){ 
     for(File f2 : f.listFiles()){ 
      if(f2.isDirectory()){ 
       allPaths = allPaths + listFilesString(f2.toString()); 
      } else { 
       allPaths = allPaths + f2.toString() + " "; 
      } 
     } 
    } 
    return allPaths; 
} 

public static boolean compileOutputToJar(String output, String jarLocation){ 
    output = output.replace('\\', '/'); //replacements just for uniformity 
    String binF = WorkspaceVariables.workspaceDir+output; 
    String toCompile = listFilesString(binF).replace('\\', '/'); 
    try { 
     Runtime.getRuntime().exec("jar cvfm " + jarLocation + " " + binF + "manifest.txt " + toCompile); // this line represents the problem 
     System.out.println("Compiled Workspace to Jar!"); 
     return true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

Wie auf der Linie kommentiert wird, das Runtime.getRuntime(), exec ("jar CVFM" + jarLocation + "" + binF + "manifest.txt" + toCompile.); Hier tritt das Problem auf. Tatsächlich wird der Befehl korrekt ausgeführt, aber ich gebe den vollständigen Pfad zu den Klassendateien, die in das Jar kompiliert werden sollen.

Als Beispiel werde ich das Beispielprojekt verwenden, das kompiliert wird. mit einer Verzeichnisstruktur:

META_INF/MANIFEST.MF 
Users/MYUSERNAME/Desktop/Other/ide/javas/bin/Main.class 
Users/MYUSERNAME/Desktop/Other/ide/javas/bin/manifest.txt < Nevermind this inclusion, just a problem I've not fixed. 
Users/MYUSERNAME/Desktop/Other/ide/javas/bin/k/Me.class 

Das Problem ist klar, die Datei ausführen, während es so nicht ist, und es ist klar falsch zusammengestellt:

/bin/manifest.txt  < The manifest is compiled properly 
/bin/Main.class  < Calls k.Me to get the n variable which is printed 
/bin/k/Me.class  < Defines a string 'n' equal to "hi" 

jedoch diese in das Glas als kompiliert wird. Ich könnte es korrekt kompilieren, indem ich zu dem Verzeichnis wechsele, in dem sie vor der Ausführung gefunden wurden (es wurde keine Möglichkeit gefunden, dies zu tun). Oder möglicherweise den Speicherort während der Befehlsausführung ändern (Ich habe versucht, -cp, aber ohne Erfolg).

Die beste Option scheint die Verwendung von -C zu sein, da die Dateien Main.class und manifest.txt an den richtigen Platz verschoben werden können, jedoch keine Unterverzeichnisse für Me.class und den k-Ordner no länger existieren. und fügen Sie das an den Anfang jedes Dateinamens hinzu, indem Sie "-C" + f2.getParent() + "" hinzufügen. in der listFilesString-Methode verhindert, dass eine der Klassendateien überhaupt in das Jar kompiliert wird.

Danke für jede Hilfe/Beiträge!

+0

Haben Sie (a) ein Makefile (2) Maven (3) eine IDE in Betracht gezogen? Es ist ein gelöstes Problem. – EJP

+0

Die ganze Idee war, ich könnte ein schnelles Projekt machen und es ohne externe Dienstprogramme kompilieren. –

+0

Und Sie werden am Ende reimplementieren 'make' oder Maven oder eine IDE. Es macht keinen Sinn, diesen Weg überhaupt zu beginnen. – EJP

Antwort

0

Eine Zeile fehlte, eine kleine Korrektur, die ich vorgenommen habe, korrigierte den Fehler.

public static String listFilesString(String dirLocation){ 
    String allPaths = ""; //pretty self explanatory returns full list of files in directory with spaces 
    File f = new File(dirLocation); 
    if(f.isDirectory()&&f.list().length>0){ 
     for(File f2 : f.listFiles()){ 
      if(f2.isDirectory()){ 
       allPaths = allPaths + f2.toString() + " "; //THIS LINE WAS ADDED 
       allPaths = allPaths + listFilesString(f2.toString()); 
      } else { 
       allPaths = allPaths + f2.toString() + " "; 
      } 
     } 
    } 
    return allPaths; 
} 

public static boolean compileOutputToJar(String output, String jarLocation){ 
    output = output.replace('\\', '/'); //replacements just for uniformity 
    String binF = WorkspaceVariables.workspaceDir+output; 
    String toCompile = listFilesString(binF).replace('\\', '/'); 
    try { 
     Runtime.getRuntime().exec("jar cvfm " + jarLocation + " " + binF + "manifest.txt " + toCompile); // this line represents the problem 
     System.out.println("Compiled Workspace to Jar!"); 
     return true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
}