部署 web-ear 时 sun.reflect.annotation.TypeNotPresentExceptionProxy 错误

Posted

技术标签:

【中文标题】部署 web-ear 时 sun.reflect.annotation.TypeNotPresentExceptionProxy 错误【英文标题】:sun.reflect.annotation.TypeNotPresentExceptionProxy error when deploy web-ear 【发布时间】:2011-09-27 00:32:05 【问题描述】:

当我尝试将 ejd-ear、web-ear 部署到 glassfish 服务器时。 我在 web 项目中添加了一个 ejb 客户端依赖项。 ejb-ear 部署成功。但是当我尝试部署 web-ear 时,它会抛出异常。

sun.reflect.annotation.TypeNotPresentExceptionProxy
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.getAnnotations(Class.java:3050)
    at org.glassfish.apf.impl.AnnotationProcessorImpl.processAnnotations(AnnotationProcessorImpl.java:285)
    at org.glassfish.apf.impl.AnnotationProcessorImpl.process(AnnotationProcessorImpl.java:195)
    at org.glassfish.apf.impl.AnnotationProcessorImpl.process(AnnotationProcessorImpl.java:134)
    at com.sun.enterprise.deployment.archivist.Archivist.processAnnotations(Archivist.java:606)
    at com.sun.enterprise.deployment.archivist.Archivist.readAnnotations(Archivist.java:459)
    at com.sun.enterprise.deployment.archivist.Archivist.readAnnotations(Archivist.java:432)
    at com.sun.enterprise.deployment.archivist.Archivist.readRestDeploymentDescriptors(Archivist.java:408)
    at com.sun.enterprise.deployment.archivist.Archivist.readDeploymentDescriptors(Archivist.java:383)
    at com.sun.enterprise.deployment.archivist.Archivist.open(Archivist.java:246)
    at com.sun.enterprise.deployment.archivist.Archivist.open(Archivist.java:255)
    at com.sun.enterprise.deployment.archivist.Archivist.open(Archivist.java:216)
    at com.sun.enterprise.deployment.archivist.ApplicationFactory.openArchive(ApplicationFactory.java:165)
    at org.glassfish.javaee.core.deployment.DolProvider.load(DolProvider.java:180)
    at org.glassfish.javaee.core.deployment.DolProvider.load(DolProvider.java:93)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.loadDeployer(ApplicationLifecycle.java:826)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.setupContainerInfos(ApplicationLifecycle.java:768)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:368)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1247)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:465)
    at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:222)
    at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168)
    at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:234)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:662)

有什么想法吗?

【问题讨论】:

如果引用了注释但jar不存在,也会发生这种情况 【参考方案1】:

我认为最好的办法是在java.lang.TypeNotPresentException的构造函数中下一个断点,并检查Throwable类型的第二个参数以了解根本原因

【讨论】:

就我而言,根本原因是:java.lang.ClassNotFoundException: com.github.springtestdbunit.DbUnitTestExecutionListener 谢谢你,实验室!我在 TypeNotPresentExceptionProxy 中设置了 excpetion 并得到了 ClassNotFoundException 所以我发现缺少哪个类。 您好,您如何使用 Eclipse 调试器将该断点放在已编译的 TypeNotPresentExceptionProxy 类中? (使用 WAS Liberty Prifle 应用服务器)谢谢! @icordoba,仔细看我的回答:我们需要在 TypeNotPresentException 中断点,而不是在 TypeNotPresentExceptionProxy 中 这很有帮助,虽然是找出问题的一种非常简单的方法。非常感谢【参考方案2】:

最近在使用 JUnit 时遇到了同样的异常。 情况是这样的:

@SuiteClasses(MyTestClass.class)
public class MySuite 
    ...

问题是 JVM 无法处理 MyTestClass,因为它在类路径中缺少依赖项(缺少另一个 JAR 文件)。但该异常没有提供有关缺少哪个类的信息。

解决方案是暂时向 MySuite 添加一个静态初始化块,以实例化 MyTestClass:

@SuiteClasses(MyTestClass.class)
public class MySuite 
    static 
        new MyTestClass();
    

这会导致 JVM 首先运行静态块,尝试实例化 MyTestClass,找出丢失的类并报告适当的异常。然后你可以添加缺少的依赖并删除临时静态块。

【讨论】:

【参考方案3】:

我们实际上只是遇到了同样的异常。我们有一个项目,我们目前从 Java 转移到 Kotlin。在项目中,所有测试类都是用 Kotlin 编写的,因此我们将文件夹命名为 src/test/kotlin。我们还根据Kotlin documentation 中的“编译 Kotlin 和 Java 源代码”部分配置了我们的 pom。

我们忘记的是“仅编译 Kotlin 源代码”部分中描述的测试目录定义:

<build> <testSourceDirectory>$project.basedir/src/test/kotlin</testSourceDirectory> </build>

IntelliJ 自动编译按要求编译了所有测试类,之后 maven 构建也成功,这也有点令人困惑。只有在mvn clean test 之后,TypeNotPresentExceptionProxy 才会发生。

【讨论】:

【参考方案4】:

解决方案:

    通过调试连接到 Glassfish 服务器 将断点放入行中 java.lang.Class.initAnnotationsIfNecessary(Class.java:3070) 部署您的应用程序。

在部署时,您将在此断点处多次停止。请参阅参考并记住发生部署错误之前的最后一个。比检查上一个“this”类中的注释。 您也可以在 AnnotationParser.parseClassArray 方法中设置断点,但它是编译后的代码,方法上的断点非常慢。 (就我的方法断点而言,我最终无法部署应用程序)。

【讨论】:

【参考方案5】:

这也可能发生在以下情况:

项目 A 是一些库,是 Eclipse 中的一个 Maven 项目。 它有一个名为org.exmaple.Foo 的类,位于src/test/java/ 目录中。

在发生错误的项目 B 中,您尝试访问此类。但这是不可能的。

Eclipse 不会抱怨,因为它“知道”这两个类。 如果你在不工作的项目上运行mvn clean install,maven 会给你一个正确的错误信息。

我认为自开普勒以来可能会发生此错误,但我不确定。至少它仍然存在于 Luna 中:)

【讨论】:

【参考方案6】:

问题与 Jar 文件冲突。验证war文件lib文件夹中的jar文件列表。删除不必要的和冲突的 jar 文件。那么部署就成功了。

【讨论】:

【参考方案7】:

TypeNotPresentExceptionProxy 错误并非特定于特定依赖项,而是取决于每个项目的类路径。 因此,请验证您的 Maven 依赖关系树。 例如,有一次我遇到了这个错误,当时我有两个 JUnit 依赖项,所以类路径中有两个版本的 JUnit 注释。

可以在“java.lang.Class”类的一些方法中下断点:

例如:

java.lang.Class.getAnnotation 
java.lang.Class.getAnnotations 

之后,您将能够发现导致问题的类...在类中搜索注释并检查您的类路径是否有歧义。

【讨论】:

以上是关于部署 web-ear 时 sun.reflect.annotation.TypeNotPresentExceptionProxy 错误的主要内容,如果未能解决你的问题,请参考以下文章

测试 DAO 时出错:sun.reflect.generics.reflectiveObjects.TypeVariableImpl 无法转换为 java.lang.Class

java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

Mockito、Java 9 和 java.lang.ClassNotFoundException:sun.reflect.ReflectionFactory

部署Spring web项目遇到的问题及解决方案

[B cannot be cast to java.lang.String

TypeNotPresentExceptionProxy