Просто для удовольствия Я делаю небольшой файл проекта Java, чтобы сохранить свой dropbox для компиляции java для меня без идеала проще, чем набирать все эти досадные аргументы командной строки себя.jar compile Runtime.getRuntime.exec() полная директория в jar
Прямо сейчас у меня только одна небольшая проблема ... Сначала вот мой код, который умеет компилировать файлы классов в банку с манифестом.
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;
}
}
Как прокомментировал строки, содержащей Runtime.getRuntime() Exec ("банку cvfm" + jarLocation + "" + binF + "manifest.txt" + toCompile). здесь возникает проблема. В действительности команда выполняется правильно, но я предоставляю полный путь к файлам классов, которые должны быть скомпилированы в банку.
В качестве примера я воспользуюсь примером проекта, который этот компилятор. со структурой каталогов:
/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"
это, однако, компилируется в банку, как:
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
Проблема ясна, файл не может работать, пока это так, и это явно составлен неправильно. Я мог бы скомпилировать его правильно, перейдя в каталог, который был найден до выполнения (не нашел способа сделать это). Или, возможно, изменение местоположения во время выполнения команды (я пробовал использовать -cp, но безрезультатно).
Лучшим вариантом является использование -C, поскольку он может перемещать Main.class и manifest.txt в нужное место, однако он не включает подкаталоги в Me.class и папку k no дольше. и добавив это в начало каждого имени файла, добавив «-C» + f2.getParent() + «». в методе listFilesString предотвращает компиляцию любого из файлов классов в банку.
Спасибо за любую помощь/вклад!
Вы рассмотрели (а) файл makefile (2) Maven (3) IDE? Это проблема. – EJP
Вся идея заключалась в том, что я мог бы сделать быстрый проект и скомпилировать его без внешних утилит. –
И вы в конечном итоге переопределите 'make' или Maven или IDE. Не имеет смысла даже начинать этот путь. – EJP