2012-05-22 37 views
6

我們在我們公司已經使用了liquibase一段時間,並且我們已經建立了一個持續集成環境,用於數據庫遷移,當補丁發生錯誤時會破壞工作。是否可以將自定義元數據添加到.class文件?

是CI環境的一個有趣的「功能」是破壞了「有可能是罪魁禍首」,因爲所有的補丁需要一個「作家」,並且錯誤信息顯示作者姓名。

如果你不知道liquibase是什麼,沒關係,它不是重點。

的一點是:具有連接到錯誤名字纔是真的好軟件開發proccess:問題得到解決的方式更快

所以我在想:Java stacktraces可能嗎?

我們可不可以用了類似下面的行號以及人民的名字堆棧跟蹤?

java.lang.NullPointerException 
at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372:john) 
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121:mike) 
at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232:bob) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173:bob) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87:bob) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862:john) 

這種信息將不得不從SCM系統中取出(如對每個源文件執行「svn blame」)。

現在,忘記搗毀一分鐘的編譯時間:這將甚至可能嗎? 要向類文件添加元數據?

+0

你爲什麼要把它放在類文件中?在外部系統中使用它可能會是一個更好的主意? – Suman

+0

我懷疑痕跡是相關的,拋出NullPointerException的行很少是對錯誤負責的行(並且作者當然不是應該責怪的行)。發生錯誤的原因是由代碼處理的數據沒有正確處理,並且當它吹得太晚(並且離代碼中應該修復的地方太遠)。 –

回答

1

通常這樣的功能可以在版本控制系統之上實現。您需要知道版本控制系統中的文件修訂版,然後您可以撥打blame/annotate命令獲取有關誰更改了每條專線的信息。您不需要將此信息存儲到類文件中,只要您可以確定您部署的每個類的修訂版(例如,您只部署了某個標籤或標籤)即可。

如果您在調查堆棧跟蹤時不想進入版本控制,則可以將行註釋信息存儲到類文件中,例如,在構建過程中使用類後處理器,可以在類級別添加自定義註釋(使用ASM執行該操作相對比較簡單)。然後,打印堆棧跟蹤的記錄器可以在運行時讀取此註釋,類似於showing jar versions

+0

偉大的回答尤金。非常有用的鏈接。謝謝! –

3

原則上,您可以添加自定義信息的.class文件(有和屬性部分,您可以添加的東西)。你將不得不編寫你自己的編譯器/編譯器擴展來這樣做。沒有辦法給你的源代碼添加一些東西,然後在類文件中顯示出來。 您也將在實踐中的主要問題:

  1. 疊跡線內置/打印的方式是不知道的東西,你添加到類文件。所以如果你想像上面展示的那樣打印這些東西,你必須破解一些核心的JDK類。
  2. 你想要多少細節?最後一個對給定文件進行修改的人?這在實踐中還不夠精確,除非文件是由單個開發人員擁有的。
  3. 添加「最後承諾,通過」更細粒度的信息,每個方法的說,或者更糟的是,每行會迅速臃腫類文件(和類文件的大小限制爲64K)

作爲一個側面提示,不管是否將錯誤歸咎於人們,都有助於修復錯誤,這很大程度上取決於開發組織的文化。確保你在一個有用的地方工作,然後再花大量的時間來開發類似的東西。

+0

類文件不限於64K。但方法是,而且這個過程確實會觸發「代碼太大」的錯誤。 –

+0

謝謝你的回答Jochen。 我真的不打算真的這樣做。 這只是一個「假設」,我想知道這裏的聰明頭腦會怎麼想。 此外,爲此,我認爲@ srs2012可能是正確的 - 這種信息會比.class文件更好,然後可以在堆棧跟蹤上完成某種「後處理」。 –

+0

無論如何,知道向.class文件添加自定義信息是可能的(我不是在談論註釋),這聽起來很有趣。 這種事情可以有其他的實際應用。 你能指出一些文檔,說更多關於這個問題? –

1

一種方式來添加添加自定義信息,在源代碼中使用annotations類文件。我不知道如何將這些信息可靠地放入堆棧軌跡中,但可以創建一個工具來檢索它。

+0

對於暴露的案例,註釋不起作用。 –

0

正如@theglauber正確指出的那樣,您可以使用註釋來添加自定義元數據。 Althougth我不確定你是否能夠從數據庫中檢索實現bean的信息並裝飾你的自定義異常管理器。

相關問題