2

プロジェクトのアノテーション付きクラスからメタデータコード(.javaファイル)を生成するために、サードパーティのアノテーションプロセッサを使用しています。Eclipseを介してプロセッサを正常に構成し([プロパティ]->[Javaコンパイラ]->[注釈処理])、コード生成は正常に機能します(コードは自動的に作成および生成されます)。また、Eclipseは、生成されたクラスとそのフィールドをエラーなしで正常に自動補完します。クラス「some.package.Foo」があり、生成されたメタデータクラスが「some.package.Foo_」であるとします。オートコンプリートの助けを借りて、Eclipseエディターで次のコードをエラーなしで取得できます。

import some.package.Foo_;
...
public class Test {
  void test() {
    Foo_.someField = null; // try to access a field from the generated class Foo_
  }
}

ただし、実際にプロジェクトをビルドすると(または、自動的にビルドが有効になっているためファイルを保存すると)、「some.package.Foo_」を解決できないというエラーが表示されます。Eclipseがsome.package.Foo_を同時に生成し、コンパイルしているようです。

私は2つの一時的な解決策を見つけました(そもそも注釈プロセッサの使用を実質的に妨げています):

  1. 生成されたクラスをビルドする前に、生成されたすべてのファイルを右クリックして[プロパティ]に移動し、[派生]チェックボックスをオフにします。その後、プロジェクトのクリーンアップを行い、インポートは正常です。エラーは発生しません。ただし、もう一度クリーンアップを実行すると、ファイルの生成によって「派生」ティックが再度(自動的に)チェックされるため、エラーが再び表示されます。したがって、これは本当に面倒で時間がかかります。
  2. また、これらすべてのファイルの「派生」ティックのチェックを外し、今回は、これらのファイルを含むソースフォルダーとパッケージの「派生」チェックのチェックを外します。次に、注釈プロセッサを無効にしてから、クリーンアップを実行します。別のクリーンアップを行ってもインポートエラーは発生しませんが、モデルを更新するものを変更する場合はアノテーションプロセッサをオンに戻して繰り返す必要があるため、アノテーションプロセッサを使用するメリットはありません。それらのファイルの新しいバージョンを生成した後、それをオフにするこの退屈な手順。

これはEclipseのバグですか?はいの場合、上記の2つよりも優れた回避策またはクイックフィックスはありますか?そうでない場合、私は問題を解決するために何を試みるべきですか?

また、ビルドパス上のライブラリの順序を並べ替えてみましたが、役に立ちません。

4

4 に答える 4

2

私は同様の問題を抱えており、私が見つけた唯一のことは、具体的には機能しないインポートですが、クラス自体の参照は機能するということです。私が使用した回避策は、生成されたクラスが必要なすべての場合に FQCN を使用することです (生成されたクラスが同じパッケージにある場合を除きます。インポートは明らかに必要ないため)。

あなたの例を使用するには、次のようにします。

public class Test {
  void test() {
    some.package.Foo_.someField = null; // try to access a field from the generated class Foo_
  }
}

私の唯一の推測は、Eclipse コンパイラーが注釈処理を行う前にインポートを処理していることです。これは、Eclipse のバグであるに違いありません。

この質問は 1 年以上前のものであることを知っているので、それを修正する他の方法が見つかったかどうかを知りたいです。

于 2011-10-07T15:24:03.020 に答える
2

最後のプロセッサ ラウンドでソースを生成していると仮定します。これは推奨される方法ではなく、まさにあなたが抱えていた問題につながります。説明はこちら: http://code.google.com/p/acris/wiki/CodeGenerationPlatform_Pitfall_Rounds

したがって、私のアドバイスは、通常の処理ラウンドでソースを生成することであり、最終ラウンドは、処理が終了したことなどを通知するためだけに使用する必要があります。

うまくいけば、これはあなたを助けます。

于 2011-02-04T08:43:09.980 に答える
1

私たちは同様の問題を経験していて、どうやらそれを解決したようです。誰かに役立つ場合に備えて、SOで共有することを考えました。

使用しているもの:

  • Eclipse Indigo(ビルドID:20120216-1857)
  • Maven用のm2eコネクタ
  • 静的メタモデルクラス生成のためのopenJPA

私たちの問題:

たとえば、com.abc.xyzという名前のパッケージと、OurEntityという名前のエンティティクラスがあります。プロジェクト(JPA、EJB、EARなどすべてを最初にmvn cleanと一緒に)をビルドすると、メタモデルクラスが生成されます。また、PUjar内に適切にパッケージ化されます。しかし、生成されたメタモデルクラスcom.abc.xyz.OurEntity_をインポートしようとすると、Eclipseはそれを解決できません。OPは明らかにこのポイントを超えました:-)。Mavenビルドが失敗し、そのクラスを解決できなかったと述べました。このようないくつかのバグレポートを除いて、グーグルからの助けはあまりありません:https ://bugs.eclipse.org/bugs/show_bug.cgi?id=350378
そのバグレポートによると、単一のクラスではなくパッケージ全体をインポートすることが役立ちました。それで、それを試しましたが、利点はありませんでした。また、完全に修飾されたクラス名を使用することが彼らのために働いたと言いました(そしてDavidHeitzmanもそうしました)。それもうまくいきませんでした。

ソリューション:

メタモデルクラスを使用する必要があるプロジェクトのEclipseビルドパスにPUjarを追加しました。突然、すべての赤い下線が消えました(驚くことではありません)。しかし、恐れていたのは、同じ耳に2つの膿があるかもしれないということでした。しかし、Mavenは自動的にそれを処理しました。

于 2012-11-27T07:36:42.793 に答える
0

このかなり古い質問は、OPが具体的に求めていた非常に可能性の高い日食のバグを指すことなく注目を集めたので、日食のバグトラッカーへのポインタで上記の回答を補完したいと思います:

定数を参照するパラメーターを使用して、生成されたクラス IF 処理注釈のインポートを解決できません

回避策には次のものがあります。

  1. 生成されたクラスを定義するパッケージのワイルドカード インポートを行う (つまりimport some.package.*;)
  2. 生成されたクラスの完全修飾名を使用する、つまりsome.package.Foo、コード内で参照し、インポートを使用しない
  3. 新しいEclipseに切り替えます。この特定の Eclipse バグは、Eclipse バージョン 4.4 (別名 Luna) で解決されています。
于 2014-08-23T17:51:15.110 に答える