Android Annotations v.2.7に移行した後、Eclipseでプロジェクトをビルドする際に問題が発生しました。同時にMavenビルドは問題ありません。Eclipseエラーログからのスタックトレースは次のとおりです。
Error
Mon Nov 05 15:49:49 GMT+02:00 2012
Errors running builder 'Java Builder' on project 'heroes'.
Java.lang.ArrayStoreException: Sun.reflect.annotation.TypeNotPresentExceptionProxy
at Sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.Java:653)
at Sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.Java:460)
at Sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.Java:286)
at Sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.Java:222)
at Sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.Java:69)
at Sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.Java:52)
at Java.lang.Class.initAnnotationsIfNecessary(Class.Java:3070)
at Java.lang.Class.getAnnotation(Class.Java:3029)
at javax.annotation.processing.AbstractProcessor.getSupportedSourceVersion(AbstractProcessor.Java:103)
at org.Eclipse.jdt.internal.compiler.apt.dispatch.ProcessorInfo.<init>(ProcessorInfo.Java:56)
at org.Eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.discoverNextProcessor(IdeAnnotationProcessorManager.Java:94)
at org.Eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.Java:116)
at org.Eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.Java:159)
at org.Eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.Java:134)
at org.Eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.Java:820)
at org.Eclipse.jdt.internal.compiler.Compiler.compile(Compiler.Java:434)
at org.Eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.Java:365)
at org.Eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.Java:178)
at org.Eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.Java:302)
at org.Eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.Java:60)
at org.Eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.Java:254)
at org.Eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.Java:178)
at org.Eclipse.core.internal.events.BuildManager$2.run(BuildManager.Java:728)
at org.Eclipse.core.runtime.SafeRunner.run(SafeRunner.Java:42)
at org.Eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.Java:199)
at org.Eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.Java:239)
at org.Eclipse.core.internal.events.BuildManager$1.run(BuildManager.Java:292)
at org.Eclipse.core.runtime.SafeRunner.run(SafeRunner.Java:42)
at org.Eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.Java:295)
at org.Eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.Java:351)
at org.Eclipse.core.internal.events.BuildManager.build(BuildManager.Java:374)
at org.Eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.Java:143)
at org.Eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.Java:241)
at org.Eclipse.core.internal.jobs.Worker.run(Worker.Java:53)
Eclipseセッションデータ:
Eclipse.buildId=M20120914-1800
Java.version=1.6.0_35
Java.vendor=Apple Inc.
BootLoader constants: OS=macosx, Arch=x86_64, WS=cocoa, NL=en_US
Framework arguments: -product org.Eclipse.epp.package.jee.product -product org.Eclipse.epp.package.jee.product -keyring /Users/vitaliyzasadnyy/.Eclipse_keyring -showlocation
Command-line arguments: -os macosx -ws cocoa -Arch x86_64 -product org.Eclipse.epp.package.jee.product -data /Users/vitaliyzasadnyy/Development/workspaces/native-container-Android -product org.Eclipse.epp.package.jee.product -keyring /Users/vitaliyzasadnyy/.Eclipse_keyring -showlocation
@ pyrica の助けを借りて問題を解決しました。 課題追跡システム からの彼の応答は次のとおりです。
私が見る限り、
AbstractProcessor.getSupportedSourceVersion()
はプロセッサ上の@SupportedSourceVersion
アノテーションを読み取ろうとします。スタックトレースから、AnnotationParserがプロセッサクラスのすべての注釈を読み取ろうとしていると推測できます。そして、これらのアノテーションの1つには、ロードできないクラスを含むクラス配列パラメーターがあります。
AndroidAnnotationsProcessor
にクラス配列を持つ唯一のアノテーションは@ SupportedAnnotationClasses
です。このことから、androidannotationsでサポートされているアノテーションが存在しない、つまりEclipseコンパイラーのクラスパスにないことが推測できます。
お気づきかもしれませんが、API jarを個別のMavenアーティファクトとして抽出し、新しいMaven構成を作成しました。
<dependencies> <!-- [...] --> <dependency> <groupId>com.googlecode.androidannotations</groupId> <artifactId>androidannotations</artifactId> <version>2.7</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.googlecode.androidannotations</groupId> <artifactId>androidannotations-api</artifactId> <version>2.7</version> </dependency> </dependencies>
これはMavenで正常に機能するとおっしゃっているので、これを正しく構成したと思います。
以前は、androidannotations依存関係にアノテーションが含まれていました。それらはもう含まれていません。現在、androidannotations-apijarにあります。
スコープコンパイルで利用可能な依存関係はJavacでも利用できるため、これはMavenでは問題ありません。ただし、Eclipseは、これらの依存関係をアノテーション処理jarで区別します。
したがって、Eclipseアノテーション処理を構成するために「手動の方法」を使用していると仮定します:Javaコンパイラ>アノテーション処理>ファクトリパスにjarを追加します。また、現在は
androidannotations-2.7.jar
のみが含まれています。この問題を修正するには、2つのAndroidAnnotations依存関係を追加する必要があります:codemodelとandroidannotations-api
ドキュメントを更新する方法は次のとおりです:(SOLUTION!)
- プロジェクトを右クリックし、プロパティを選択します
- Javaコンパイラ>注釈処理に移動し、注釈処理を有効にするを選択します
- Javaコンパイラ>アノテーション処理>ファクトリパスに移動します
- 変数の追加をクリックし、M2_REPOを選択して、拡張...をクリックします。 ;次に、次のJARを選択します:
com/googlecode/androidannotations/androidannotations-api/2.7/androidannotations-api-2.7.jar
- 変数の追加をクリックし、M2_REPOを選択して、拡張...をクリックします。 ;次に、次のJARを選択します:
com/Sun/codemodel/codemodel/2.4.1/codemodel-2.4.1.jar
- 変数の追加をクリックし、M2_REPOを選択して、拡張...をクリックします。 ;次に、次のJARを選択します:
com/googlecode/androidannotations/androidannotations/2.7/androidannotations-2.7.jar
- ワークスペースの再構築を確認する
- 完了!
ソース: https://github.com/androidannotations/androidannotations/issues/379#issuecomment-10073205
プロジェクトを再構築してみてください-mvn clean package
。異なるMavenプロファイルがある場合は、プロファイルを指定することを忘れないでください。