2012-12-04 74 views
4

因此,java有一個專門用於將java源代碼編譯爲.class文件的內置庫,它位於javax.tools中。所以,我想知道你是如何得到它的工作。我已經閱讀了javadoc,並在其中提供了一些示例,但是當我使用這些示例時,我會遇到錯誤。使用javax.tools在運行時編譯java源代碼?

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

那就是例子甲骨文給出爲了得到StandardJavaFileManager類從中你可以做更多的實例。但是,我在該代碼的第一行中遇到了一些問題。當我嘗試執行ToolProvider.getSystemJavaCompiler();時,它總是返回null。在該方法的javadoc中,它說:「返回此平臺提供的編譯器;如果沒有提供編譯器,則返回null。」但他們從來沒有顯示任何其他方式獲得JavaCompiler的實例。我已經嘗試了很多其他方式,例如使用ServiceLoader來找到任何可以提及的參考,但是沒有任何優點。我該如何去做這件事?

+0

http://www.java.net/node/688208 http://stackoverflow.com/questions/2543439/null-pointer-exception-while-using-java-compiler-api – nhahtdh

回答

8

機會,你從JRE目錄,而不是一個JDK目錄中運行Java - 你需要運行一個版本,「知道」裏的Java編譯器是。

因此,舉例來說,在我的Windows拳擊,運行一個小的測試應用程序是這樣的:

import javax.tools.*; 

class Test { 
    public static void main(String[] args) { 
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
     System.out.println(compiler); 
    } 
} 

的結果是:

c:\Users\Jon\Test>"\Program Files\Java\jdk1.7.0_09"\bin\java Test 
[email protected] 

c:\Users\Jon\Test>"\Program Files\Java\jre7\bin\java" Test 
null 

正如你可以看到,這是很好,當我專門跑JDK版本,但在運行JRE版本時我得到空值。檢查你是如何啓動Java的。

+0

好的,所以使用Eclipse ,如何將其更改爲使用我的JDK而不是我的JRE? –

+0

@StevenFontaine:看看你的項目屬性 - 這將顯示你正在構建和運行的環境。 (您可能可以單獨更改運行配置,但您可能只想更改項目的配置...或者甚至是您的工作區默認設置。) –

3

編譯往往通過直接調用javac的編譯,這需要安裝的Java Development Kit(JDK)或致電com.sun.tools.javac.Main,它可以在Sun的找到的tools.jar執行。 Sun的許可允許tools.jar通過完整的Java運行時環境(JRE)重新分發。其他實現此類動態功能的方法包括使用與應用程序的實現語言(請參閱參考資料)集成的現有動態腳本語言(如JavaScript或Groovy)或編寫特定領域語言和相關語言解釋程序或編譯器。