2011-12-25 6 views
1

私は、私たちのアプリケーション用のパッチを作成するために内部的に書いたツールを持っています。 変更されたクラスをscmで確認し、javacを使用してコンパイルします。
次に、作成したjarをクラスパスに追加します。 私はそれに問題があることを発見しました: クラスAでメソッドの戻り値の型を変更し、クラスBがそのメソッドを使用するとクラスAの署名が変更され、クラスBがそのメソッドを呼び出すときにNoSuchMethodErrorを取得します。
しかし、私はクラス静的変数が変更された別のケースを持っています: java.lang.NoClassDefFoundError: Could not initialize class
原因を知っていますか?
クラスが変更されたときにどのクラスをコンパイルする必要があるかを知る方法はありますか?クラスの変更時にどのクラスをコンパイルする必要がありますか?

+1

すべてを再コンパイルする方が簡単ではありません場合、私は思ったんだけどとdiffツールを使用して、実際に変更されたバイナリファイルを探します。 –

+0

私はこの問題のいくつかの詳細な議論を読みました。簡単な答えは、再コンパイルが必要なことを知ることは簡単ではなく、スタンドアロンのツールはありません。 Eclipseのインクリメンタル・コンパイラはこれを実行できますが、コンパイルの一部としてのみ実行できます。 @ JensSchauderの提案は良いもののようだ。 –

答えて

4

信頼できないと思われるソリューションを開発するために多くの努力をしているように思えます。

すべてのリリースで、アプリケーション全体をビルドします。パッチを作成するには、オリジナルの配布物と比較して、作成したクラスまたはファイルを比較します。変更されたファイルはすべて含まれます。

あなたは定数、メソッドまたはクラスを変更し、すべての結果を理解する必要はありません

  • ので、これは良いです。
  • 書式やコメントのような何かを変更しても、ファイルを更新する必要はありません。
  • パッチの適用がまったく同じで、完全に配布されていることを確信することができます。
1

クラスAのシグネチャを変更した場合、このクラスを呼び出すすべてのクラスを再コンパイルする必要はありません。これらのクラスの実装を変更する必要があります。もし、クラスA、クラスBによって呼び出されたメソッドfoo()を持っていたし、今はbar()に社名を変更した場合

は、たとえば、あなたは、クラスBのソースコードを変更する必要がありそうでない場合、あなたはNoSuchMethodErrorを取得します。

ただし、インターフェイスを変更せずにクラスAの内部実装を変更するだけで、このクラス自体以外のものを再コンパイルする必要はありません。コンパイルするときは、適切なクラスパスを作成するだけです。クラスパスには、クラスAの直接依存関係と依存関係の依存関係が含まれていなければなりません。第3レベルの依存関係(つまり、依存関係の依存関係)を含んではいけません。しかし、IMHOは、パッチをコンパイルするときにクラスパスを処理する最も簡単な方法は、既存のアプリケーションの完全なクラスパスを提供するだけです。

+1

いくつかのシグネチャの変更があります。たとえば、戻り値の型が以前と同じ型に割り当てられている場合や、引数の型がさらに広くなっている場合など、(少なくともいくつかの)用途を単純に再コンパイルすることができます。定数の変化に似ています。 –

3

また、例外やエラーを引き起こすことはないが、間違った動作を引き起こすため、定数をターゲットにすることは困難です。

あなたがプリミティブ型またはStringと、その値はコンパイル時に決定することが可能であるいくつかpublic static finalフィールドを持つクラスを考えてみましょう。

public class A { 
    public static final String GREETING = "Hello"; 
    ... 
} 

別のクラスBこのフィールドにアクセスする場合、コンパイラは定数をインライン - すなわちA.GREETING参照をその値"Hello"に置き換えます。一定値がどこから来るのかの情報は保持されません。

今すぐトラブルが来る - あなたもそれを再コンパイルするまで、あなたができる唯一のクラス"Hi"を言うし、再コンパイルするGREETINGの値を変更した場合、クラスBにおけるインライン値は変更されません。したがって、は、最初に他の人が既に指摘しているように、アプリケーション全体を最初から再構築することをお勧めします。

この問題を議論素晴らしい記事: http://marxsoftware.blogspot.com/2009/09/inconstant-constants-in-java.html

一部SO関連の質問:

Is Java guaranteed to inline string constants if they can be determined at compile time

Are all compile-time constants inlined?

関連する問題