java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy after moving to Android Annotations v.2.7

≯℡__Kan透↙ 提交于 2019-12-12 10:57:06

问题


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!)

  1. Right-click your project, choose Properties
  2. Go to Java Compiler > Annotation Processing and choose Enable annotation processing
  3. Go to Java Compiler > Annotation Processing > Factory Path
  4. 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
  5. 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
  6. 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
  7. Confirm the workspace rebuild
  8. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!