java.lang.ArrayStoreException:sun.reflect.annotation.TypeNot presentExceptionProxy移动到Android注解v.2.7后 [英] java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy after moving to Android Annotations v.2.7

查看:2702
本文介绍了java.lang.ArrayStoreException:sun.reflect.annotation.TypeNot presentExceptionProxy移动到Android注解v.2.7后的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有问题,我的建设项目在Eclipse中移动到Android注解v.2.7之后,在同一时间Maven构建是确定的。下面是从月食错误日志堆栈跟踪:

 错误
周一11月5日15时49分49秒GMT + 02:00 2012
错误项目英雄跑商的Java生成器。java.lang.ArrayStoreException:sun.reflect.annotation.TypeNot presentExceptionProxy
    在sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:653)
    在sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:460)
    在sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:286)
    在sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:222)
    在sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:69)
    在sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:52)
    在java.lang.Class.initAnnotationsIfNecessary(Class.java:3070)
    在java.lang.Class.getAnnotation(Class.java:3029)
    在javax.annotation.processing.AbstractProcessor.getSupportedSourceVersion(AbstractProcessor.java:103)
    在org.eclipse.jdt.internal.compiler.apt.dispatch.ProcessorInfo<&初始化GT;(ProcessorInfo.java:56)
    在org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.discoverNextProcessor(IdeAnnotationProcessorManager.java:94)
    在org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:116)
    在org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:159)
    在org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:134)
    在org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:820)
    在org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:434)
    在org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:365)
    在org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:178)
    在org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:302)
    在org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:60)
    在org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:254)
    在org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:178)
    在org.eclipse.core.internal.events.BuildManager $ 2.run(BuildManager.java:728)
    在org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    在org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)
    在org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:239)
    在org.eclipse.core.internal.events.BuildManager $ 1.run(BuildManager.java:292)
    在org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    在org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:295)
    在org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:351)
    在org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:374)
    在org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:143)
    在org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:241)
    在org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

Eclipse的会话数据:

  eclipse.buildId = M20120914-1800
java.version = 1.6.0_35
java.vendor =苹果公司
BootLoader的常量:OS = MacOSX的,ARCH = x86_64的,WS =可可,NL = EN_US
框架参数: - 产品 - 产品org.eclipse.epp.package.jee.product org.eclipse.epp.package.jee.product -keyring /Users/vitaliyzasadnyy/.eclipse_keyring -showlocation
命令行参数:-os MacOSX的-ws可可-arch x86_64的-product org.eclipse.epp.package.jee.product -data /用户/ vitaliyzasadnyy /开发/工作区/本机容器机器人 - 产品org.eclipse.epp .package.jee.product -keyring /Users/vitaliyzasadnyy/.eclipse_keyring -showlocation


解决方案

随着 @pyricau 帮助我解决了问题。这里是他的问题跟踪响应:

至于我可以看到

AbstractProcessor.getSupportedSourceVersion()尝试读取上的 @SupportedSourceVersion 注释处理器。

从堆栈跟踪,我们可以推断出AnnotationParser试图读取处理器类的所有注解。而这些注解之一,有一个包含无法加载类的类数组参数。

这在一个类数组的唯一注解 AndroidAnnotationsProcessor ​​ @ SupportedAnnotationClasses

这是我们可以推断,通过androidannotations支持的注解不是present,这意味着它们不是在Eclipse编译器的类路径中。

你可能注意到,我们提取的API罐子作为一个单独的Maven的神器,导致一个新的Maven配置:

 <依赖和GT;
        &所述;! - [...] - GT;
    <&依赖性GT;
        <&的groupId GT; com.google code.androidannotations< /的groupId>
        <&的artifactId GT; androidannotations< / artifactId的>
        <&版GT; 2.7 LT; /版本>
        <&范围GT;及提供LT; /&范围GT;
    < /依赖性>
    <&依赖性GT;
        <&的groupId GT; com.google code.androidannotations< /的groupId>
        <&的artifactId GT; androidannotations-API< / artifactId的>
        <&版GT; 2.7 LT; /版本>
    < /依赖性>
< /依赖和GT;

既然你告诉我,是正常工作与Maven的,我想你配置这个权利。

previously的androidannotations依赖性包含的注释。它不包含他们更多,他们现在都在androidannotations-API JAR。

这是罚款Maven的,因为在范围上编译提供的依赖也可为javac的。然而,Eclipse的区分这些依赖与注释处理罐。

所以,我假设你正在使用的手工方式配置日食注释处理:将罐子 Java编译器>注释处理>工厂路径即可。而且它目前只包含 androidannotations-2.7.jar

要解决这个问题,你应该添加两个AndroidAnnotations依赖关系:codemodel和androidannotations-API

下面是我们应该如何更新文档:(! SOLUTION


  1. 右键单击您的项目,选择属性

  2. 转到 Java编译器>注释处理并选择启用标注处理

  3. 转到 Java编译器>注释处理>工厂路径

  4. 点击上的添加变量,选择M2_REPO并单击延长... ;然后,选择以下JAR: <$c$c>com/google$c$c/androidannotations/androidannotations-api/2.7/androidannotations-api-2.7.jar

  5. 点击上的添加变量,选择M2_REPO并单击延长... ;然后,选择以下JAR: COM /阳光/ codemodel / codemodel / 2.4.1 / codemodel-2.4.1.jar

  6. 点击上的添加变量,选择M2_REPO并单击延长... ;然后,选择以下JAR: <$c$c>com/google$c$c/androidannotations/androidannotations/2.7/androidannotations-2.7.jar

  7. 确认工作区重建

  8. 完成!

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

解决方案

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!

这篇关于java.lang.ArrayStoreException:sun.reflect.annotation.TypeNot presentExceptionProxy移动到Android注解v.2.7后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆