2016-06-08 6 views
0

Просто для удовольствия Я делаю небольшой файл проекта 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 предотвращает компиляцию любого из файлов классов в банку.

Спасибо за любую помощь/вклад!

+0

Вы рассмотрели (а) файл makefile (2) Maven (3) IDE? Это проблема. – EJP

+0

Вся идея заключалась в том, что я мог бы сделать быстрый проект и скомпилировать его без внешних утилит. –

+0

И вы в конечном итоге переопределите 'make' или Maven или IDE. Не имеет смысла даже начинать этот путь. – EJP

ответ

0

Одна строка отсутствовала, небольшая корректировка Я исправил ошибку.

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; 
    } 
}