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!
Haben Sie (a) ein Makefile (2) Maven (3) eine IDE in Betracht gezogen? Es ist ein gelöstes Problem. – EJP
Die ganze Idee war, ich könnte ein schnelles Projekt machen und es ohne externe Dienstprogramme kompilieren. –
Und Sie werden am Ende reimplementieren 'make' oder Maven oder eine IDE. Es macht keinen Sinn, diesen Weg überhaupt zu beginnen. – EJP