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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部署web-ear时出现sun.reflect.annotation.TypeNotPresentExceptionProxy错误相关的知识,希望对你有一定的参考价值。

当我尝试将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)

有任何想法吗?

答案

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

另一答案

最近与JUnit有相同的异常。情况是这样的:

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

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

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

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

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

另一答案

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

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

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

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

另一答案

解:

  1. 连接调试到Gla​​ssfish服务器
  2. 把断点放到一边 java.lang.Class.initAnnotationsIfNecessary(Class.java:3070)
  3. 部署您的应用程序。

部署时,您将在此断点处停止多次。请参阅此参考并记住出现部署错误之前的最后一个。比检查最后一个“this”类中的Annotations。你也可以把断点放到AnnotationParser.parseClassArray方法中,但它是编译代码并且方法上的断点很慢。 (在我的情况下,方法断点我最后无法解释应用程序)。

另一答案

在以下情况下也会发生这种情况:

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

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

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

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

另一答案

该问题与Jar文件冲突。验证war文件lib文件夹中的jar文件列表。删除不必要的和冲突的jar文件。然后部署将成功。

另一答案

TypeNotPresentExceptionProxy错误不是特定于特定依赖项的,并且取决于每个项目的类路径。所以验证你的maven依赖树。例如,当我有两个JUnit依赖项时,我遇到了这个错误,所以在类路径中有两个版本的JUnit注释。

您可以在类“java.lang.Class”的某些方法中放置断点:

例如:

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

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

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

部署函数时出现 Firebase 部署错误

php - 实时部署时出现 Laravel 404 错误

尝试部署功能 Firebase 时出现 ESLint 错误

为啥在将应用程序部署到 Heroku 时出现此错误?

尝试部署到 Google Cloud Run 时出现权限错误

部署 SnappyData-0.5 pulse.war 时出现 Bean 缺失错误