2011-05-03 37 views
1

我不知道如何設置compilationTask的源文件。如何通過CompilationTask設置編譯源

我嘗試這樣做:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

List<String> optionList = new ArrayList<String>(Arrays.asList("-d","build/classes")); 

List<String> classes = new ArrayList<String>(); 
classes.add("src/Hello.java"); 
CompilationTask task = compiler.getTask(null, null, null, optionList, classes, null); 

task.call(); 

,但我得到了以下錯誤:

Exception in thread "main" java.lang.IllegalArgumentException: Not a valid class name: src/Hello.java

當然

,如果我把班空,而不是我得到「沒有源文件」,因爲沒有源文件被給了。在此之前我嘗試過使用JavaCompiler的運行函數,但我無法在字符串參數中指定選項(或者我不知道如何)。

這裏是解決方案:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

     StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); 
     List<String> optionList = new ArrayList<String>(Arrays.asList("-d","build/classes")); 

Iterable<? extends JavaFileObject> classes = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(new File("src/Hello.java"))); 


CompilationTask task = compiler.getTask(null, null, null, optionList,null, classes); 

task.call(); 
+0

你曾經解決過這個問題嗎?如果是這樣,你介意發佈你的解決方案嗎? – 2011-06-01 12:39:35

+0

帖子用解決方案更新 – Muaz 2011-06-02 21:49:42

回答

0

下面的代碼就可以解決這個問題,雖然我做的路徑絕對的,當我跑我的機器上的代碼:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
StandardJavaFileManager fm = compiler.getStandardFileManager(diagnostics, null, null); 

ArrayList<String> optionList = new ArrayList<String>(Arrays.asList("-d","build/classes")); 

ArrayList<File> files = new ArrayList<File>(); 
files.add(new File("src/Hello.java")); 
CompilationTask task = compiler.getTask(null, null, null, optionList, null, fm.getJavaFileObjectsFromFiles(files)); 

task.call(); 
+0

編譯單元需要JavaFileObjects的列表,JavaFileObject是一個接口(需要實現它的所有方法)。有沒有另一種方法來指定源文件的路徑作爲一個字符串或什麼的? – Muaz 2011-05-03 18:07:24

0

嘗試改變:

classes.add("src/Hello.java"); 

去:

classes.add(
    new SimpleJavaFileObject(new URI("src/Hello.java"), JavaFileObject.Kind.SOURCE) 
); 

這有點冗長,但沒有工作。當然,它可以提取到一個方法。