2016-08-04 46 views
0

從java內編譯Java源代碼是由javafx.tools包中的Java編譯器工具協助完成的任務。但是,我似乎無法找到任何有關信息。從Java內部編譯Java源文件與運行JVM

我問的問題是,如果有可能編譯java文件對JVM被用來編譯它。我正在編寫運行在使用幾個jar庫(其中一些非常大的庫)的軟件上的代碼,並且我打算動態編譯各個java文件並加載生成的類文件,使其幾乎像腳本語言一樣運行。爲了讓編譯的java文件訪問軟件中的類和變量,它需要在構建時將所有相同的庫添加到其類路徑中,否則我將面臨編譯錯誤。

我搜索了周圍是否這是不可能的信息,並且找不到它,我得到完全不相關的結果。

如果不可能,我可以鏈接所有需要的庫(超過30個),我只是不想。如果不可能針對當前環境進行編譯,那麼您會如何考慮最簡單的方式來動態獲取JVM中加載的所有庫的列表?

編輯:作爲對Jim的迴應,我知道java文件被編譯到類文件中,並且類文件是加載的文件。我知道庫需要可以被編譯器訪問,等等。我說的是,我有超過30個庫,總共超過380 MB,並且我在一個文件夾中有幾百個單獨的java源文件,它們擴展了一個類定義在主程序中作爲模塊使用,如果我必須將所有數百個文件與380 MB文件連接起來進行編譯,那就需要花費很多時間。我可以將它們一起編譯來解決大部分問題,但主要問題是要運行的文件列表添加到命令行的-classpath參數中,並且隨時可能會更改,所以我不能很難編碼這個。這就是問題的第二部分存在的原因,我將如何獲得用於運行當前程序的類路徑,以便將其傳遞給編譯器。

+0

語句_「編譯Java文件對正在使用的JVM」_沒有意義。你編譯一個java文件來產生一個類文件,然後這個類文件可以被加載到一個JVM中。對於外部庫,它們必須可供編譯器使用以解析引用,並且它們必須可供類加載器在運行時鏈接。假設外部庫已經存在於JVM的類路徑中,那麼在調用它時,只需確保它們對編譯器也可用。 –

+0

我認爲你沒有正確閱讀我的問題吉姆。首先,「Compi e e against」是一個完全有效的陳述,你可能想要查看它,你會發現它是一個相當常用的短語,意思是將資源鏈接到編譯過程。 「對庫進行編譯」「在本例中的意思與」向編譯器類路徑添加庫「完全相同,我問是否有可能不是必須鏈接超過300個單獨的java文件的每個庫超過30個,如果可以使用已經加載和運行的環境 –

+0

「使用了幾個jar庫,其中一些很大」 - 你可以創建一個只包含api的小jar,並且針對這些大的lib進行編譯。你可以調用'System.getProperty(「java.class.path」)'' - 可能對你的情況來說已經足夠了。 – mabn

回答

0

當您使用編譯器API時,指定要使用的ClassLoader。這個ClassLoader然後提供你編譯你的代碼所需的所有類。我不記得細節,但是我在大約5年前編寫了一個用於編寫Java代碼的內存庫。 https://github.com/OpenHFT/Java-Runtime-Compiler