问题
I've got problems with building my project in eclipse after moving to Android Annotations v.2.7, at the same time maven build is ok. Here is stacktrace from eclipse Error log:
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 session data:
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
回答1:
With help of @pyricau I solved problem. Here is his response from issue tracker:
As far as I can see,
AbstractProcessor.getSupportedSourceVersion()
tries to read the@SupportedSourceVersion
annotation on the processor.From the stacktrace, we can deduce that the AnnotationParser is trying to read all the annotations on the processor class. And that one of these annotations has a class array parameter that contains classes that cannot be loaded.
The only annotation that has a class array in
AndroidAnnotationsProcessor
is@ SupportedAnnotationClasses
.From that we can deduce that the annotations supported by androidannotations are not present, which means they are not in the classpath of the eclipse compiler.
As you probably noted, we extracted the API jar as a separate Maven artifact, leading to a new maven configuration:
<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>
Since you are telling me that is works fine with Maven, I assume you configured this right.
Previously, the androidannotations dependency contained the annotations. It doesn't contain them any more, they are now in the androidannotations-api jar.
This is fine for Maven, because dependencies available in scope compile are also available to Javac. However, Eclipse differentiate those dependencies with the annotation processing jars.
So, I assume that you're using the "manual way" to configure the eclipse annotation processing: adding jars to Java Compiler > Annotation Processing > Factory Path. And it currently only contains
androidannotations-2.7.jar
.To fix the problem, you should add the two AndroidAnnotations dependencies: codemodel and androidannotations-api
Here is how we should update the doc: (SOLUTION!)
- Right-click your project, choose Properties
- Go to Java Compiler > Annotation Processing and choose Enable annotation processing
- Go to Java Compiler > Annotation Processing > Factory Path
- Click on Add Variable, select M2_REPO and click on Extend...; then, select the following JAR :
com/googlecode/androidannotations/androidannotations-api/2.7/androidannotations-api-2.7.jar
- Click on Add Variable, select M2_REPO and click on Extend...; then, select the following JAR :
com/sun/codemodel/codemodel/2.4.1/codemodel-2.4.1.jar
- Click on Add Variable, select M2_REPO and click on Extend...; then, select the following JAR :
com/googlecode/androidannotations/androidannotations/2.7/androidannotations-2.7.jar
- Confirm the workspace rebuild
- Done!
Source: https://github.com/androidannotations/androidannotations/issues/379#issuecomment-10073205
回答2:
Try to rebuild the project - mvn clean package
. Do not forget to specify a profile if you have different Maven profiles.
来源:https://stackoverflow.com/questions/13233631/java-lang-arraystoreexception-sun-reflect-annotation-typenotpresentexceptionpro