6

当社ではしばらくの間liquibaseを使用しており、パッチにエラーが発生した場合にジョブを中断するデータベース移行のために継続的インテグレーション環境をセットアップしてきました。

そのCI環境の興味深い「機能」は、すべてのパッチに「作成者」が必要であり、エラーメッセージに作成者名が表示されるため、破損の原因が「原因である可能性が高い」ことです。

liquibaseが何であるかわからない場合、それは大丈夫です、それは重要ではありません。

重要なのは、エラーに人名を付けることは、ソフトウェア開発プロセスにとって非常に良いことです。問題ははるかに迅速に解決されます

だから私は考えていました:それはJavaスタックトレースで可能ですか?

以下のような行番号とともに、人々の名前を含むスタックトレースを作成できますか?

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システムから引き出す必要があります(ソースファイルごとに「svnblame」を実行するなど)。

さて、コンパイル時間を1分間無駄にすることを忘れてください。それも可能でしょうか?そのようなクラスファイルにメタデータを追加するには?

4

4 に答える 4

3

原則として、カスタム情報を.classファイルに追加できます(追加できる属性セクションがあります)。そのためには、独自のコンパイラ/コンパイラ拡張機能を作成する必要があります。ソースコードに何かを追加して、クラスファイルに表示する方法はありません。また、実際には大きな問題が発生します。

  1. ビルド/印刷されたスタックトレースの方法は、クラスファイルに追加したものを認識しません。したがって、上記のようにこのようなものを印刷したい場合は、いくつかのコアJDKクラスをハックする必要があります。
  2. どのくらいの詳細が必要ですか?特定のファイルに変更を加えた最後の人は?ファイルが1人の開発者によって所有されていない限り、これは実際には十分に正確ではありません。
  3. 「last-committed-by」情報をより細かい粒度で追加すると、たとえばメソッドごと、さらに悪いことに、行ごとにクラスファイルがすぐに肥大化します(クラスファイルのサイズは64Kに制限されます)

ちなみに、バグのせいで人々を非難することがバグをより早く修正するのに役立つかどうかは、開発組織の文化に大きく依存します。このようなものの開発に多くの時間を費やす前に、これが役立つ場所で作業するようにしてください。

于 2012-05-22T21:28:28.547 に答える
1

ソースコードのアノテーションを使用して、クラスファイルにカスタム情報を追加する1つの方法。その情報をスタックトレースに確実に配置する方法はわかりませんが、それを取得するためのツールを作成することはできます。

于 2012-05-22T21:30:25.300 に答える
1

通常、このような機能はバージョン管理システムの上に実装できます。バージョン管理システムでファイルのリビジョンを知る必要があります。その後、blame / annotateコマンドを呼び出して、個々の行を誰が変更したかに関する情報を取得できます。デプロイする各クラスのリビジョンを識別できる限り(たとえば、特定のタグまたはラベルのみをデプロイする場合)、この情報をクラスファイルに保存する必要はありません。

スタックトレースを調査するときにバージョン管理に移動したくない場合は、行の注釈情報をクラスファイルに保存できます。たとえば、ビルド中にクラスレベルでカスタム注釈を追加できるクラスポストプロセッサを使用します(これは比較的ASMを使用して実装するのは簡単です)。次に、スタックトレースを出力するロガーは、 jarバージョンを表示するのと同様に、実行時にこのアノテーションを読み取ることができます。

于 2012-05-23T15:00:51.683 に答える
0

@theglauber が正しく指摘したように、注釈を使用してカスタム メタデータを追加できます。Bean を実装し、カスタム例外マネージャーを装飾するデータベースからその情報を取得できないかどうかはよくわかりません。

于 2012-05-22T21:38:17.103 に答える