2012-03-27 67 views
3

我使用的是javac編譯器,我發現它會根據作爲參數傳遞的源文件的順序生成不同的結果二進制.class文件。事實上,這是一個與ANT或MAVEN編譯的問題,因爲它們以不同的順序排列文件。java組裝的二進制文件取決於源文件的順序

2次編譯之間有差異。我已經反彙編了這段代碼,並且發現javac(優化器?)從其中一個編譯中刪除了不推薦使用的java jsr/ret彙編指令。

我想知道如果這種行爲是「隱」編譯的結果: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/solaris/javac.html#searching

  • 任何人都可以解釋這種現象?

  • 如何在ANT和MAVEN中生成傳遞給編譯器的源文件順序無關緊要的「冪等」編譯過程?

+1

你爲什麼在意?有什麼東西被打破了嗎? – ControlAltDel 2012-03-27 18:40:33

+2

您是否確定Ant和Maven使用相同的參數使用相同的javac編譯器版本?我有頭javac 6不再使用jsr/ret,而j​​avac 5爲try-finally塊。 – 2012-03-27 18:59:03

+0

我關心,因爲我很好奇(有關)爲什麼java編譯不同。無論如何,如果您必須驗證從ANT到MAVEN的遷移,您必須做的一件事就是驗證編譯過程是否生成相同的二進制文件。想想如果你改變插件,如儀器代碼的jibx,你必須在maven中使用不同版本的編譯器插件。 – 2012-03-27 19:05:06

回答

0

您可以得到您的來源列表,然後按字母順序排序,包括完整路徑。這將使運行之間保持一致。

+0

它與ANT和MAVEN的東西你可以指定源文件夾,但他們以不同的順序文件。訂購任務/ pom中的每個源文件都是不可行的。 – 2012-03-27 18:50:20