2016-07-18 39 views
3

我有一個單一的,簡短的Java文件和一個main方法。它從第三方庫中導入,我將其稱爲thirdpartylib。我在命令行運行Java編譯器覆蓋和轉換源文件

javac -classpath "../thirdpartylib/lib/*" MyClass.java 

。我得到以下命令行輸出:

warning: Supported source version 'RELEASE_6' from annotation processor 'org.mangosdk.spi.processor.SpiProcessor' less than -source '1.8' 
MyClass.java:14: error: unreported exception Exception; must be caught or declared to be thrown 
d.put(125, new HashSet<>(Arrays.asList(0, 1, 2))); 
         ^
    exception thrown from implicit call to close() on resource variable 'facade' 
MyClass.java:39: error: unreported exception Exception; must be caught or declared to be thrown 
2 errors 
1 warning 

後來,當我在我的編輯調查報告的錯誤打開MyClass.java回來了,我的Java文件已被徹底改寫! (我的編輯的撤消歷史記錄救了我。)文件的頂部讀取

# Generated by org.mangosdk.spi.processor.SpiProcessor (0.2.4) 
# Mon, 18 Jul 2016 10:10:47 -0500 

和我的代碼的其餘部分看起來就像是排序行方向按字母順序排列 - 不是有效的Java語法,至少可以說。谷歌搜索讓我看到一個明顯defunct包叫SPI。我沒有在我的電腦上安裝它,除非thirdpartylib正在使用它,但這並不能解釋它爲什麼會破壞我的源代碼。

如果編譯器不斷刪除我的源代碼,我該如何編譯我的程序?

+3

我傾向於認爲您有充分的證據證明註釋處理器確實安裝在您的系統上。它看起來與Java 8不兼容,所以找到並擺脫它。 –

+3

在此之前,我*推測*註釋處理器假定您的Java源位於與工作目錄不同的目錄中,並且它不會有意覆蓋它們。如果你把你的類放在一個包中,相應地安排源代碼,然後從源代碼根目錄運行編譯器,然後*可能*你會避免覆蓋你的源代碼,但是你可能仍然無法成功構建。 –

回答

3

它看起來像類路徑包含註釋處理器。註釋處理器通常應該只生成新的資源並且不修改現有的資源,但是它們確實能夠更改任何文件。

您可以嘗試使用編譯器選項-proc:none禁用所有註釋處理。

javac -proc:none -classpath "../thirdpartylib/lib/*" MyClass.java 
+1

添加'-proc:none'這個技巧。在修復OP中提到的「未報告的異常」(與註釋處理器無關)之後,整個事件編譯並正確運行。謝謝! – wkschwartz