2011-11-25 29 views
2

有人告訴我,javac是足夠聰明,它不重新編譯.java,在條件,這.java有之前的.class時間戳。我只是發現它在我的機器中不能這樣工作,我當然在某處錯了嗎?爲什麼javac重新編譯我的.java,雖然.class已經更新?

P.java位於.../eg/access下,以聲明爲包訪問

eg 
|- access 
     |- P.class 
     |- P.java 

然後當我運行javac P.java的,每次它重新編譯P.java,是正常還是我錯了?

+1

我不會直接使用'javac'。相反,我會使用像maven,ant或IDE這樣的構建工具,這些工具在整個過程中都非常聰明。 –

+0

只需注意:如果你有'package'類的'P'作爲第一個聲明,那麼你應該從'eg'目錄編譯爲'javac access/P.java'。 –

回答

5

這是正常的,它是每次重新編譯。 javac不會執行增量編譯。

+0

但是,「javac編譯器在源文件和類文件的類路徑中查找,重新編譯源代碼(並重新生成類文件),如果它是較新的。」來自http://www.cis.upenn.edu /〜bcpierce/courses/629/jdkdocs/tooldocs/win32/javac.html – zell

+1

@zell不知道這個文檔有多大,但它看起來很老。它可能已經被我在我的答案中提到的命令行選項所取代,就我所知,該子句不在新的等效文檔中。 – berry120

+1

@zell,查看頁面上的標題:星期三,10九月1997 20:40:24 GMT是頁面被修改的最後一次。就我個人而言,我相信Sun/Oracle文檔。 –

2

我想你可能會混淆javac的命令行可執行文件,javac task in Apache Antjavac總是重新編譯源文件,無論是比二進制文件更舊還是更新。 Ant很聰明,能夠確定文件何時需要重新編譯,但是當然,您必須使用Ant構建系統才能使用此功能。

7

javac的默認重新編譯一切每次。你觀察到的行爲是正確的,並通過設計。

看起來你可以指定這個行爲雖然一個選項:

-Xprefer:{更新,源}

指定讀取的文件當兩個源文件和類文件被發現的類型。 (請參閱搜索類型)。如果使用-Xprefer:使用較新的,它將讀取某個類型的源或類文件的較新者(默認值)。如果使用-Xprefer:source選項,它將讀取源文件。使用-Xprefer:來源如果您想確保任何註釋處理器都可以訪問使用SOURCE保留策略聲明的註釋。

摘自:http://docs.oracle.com/javase/6/docs/technotes/tools/windows/javac.html

你也可能會想Eclipse的編譯器,我敢肯定不會做增量編譯 - 或在螞蟻javac任務是足夠聰明,想出這樣的情況。

+1

實際上,-Xprefer修改類*的搜索首選項*未在命令行中指定*。因此,如果我執行javac Foo.java並引用Bar類,並且java編譯器同時找到Bar.java *和* Bar.class,則此選項指定將使用哪一個編譯Foo。它不會影響Foo.java是否重新編譯。請參閱http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#searching –

相關問題