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

当我尝试部署ejd-ear,web-ear到glassfish服务器。 我在web项目中添加了ejb客户端依赖项。 ejb-ear部署成功。 但是当我尝试部署web-ear时,会引发exception。

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的构造函数中放置一个断点,然后检查Throwabletypes的第二个参数以了解根本原因

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

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

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

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

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

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

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

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

${project.basedir}/src/test/kotlin

IntelliJ自动编译根据需要编译所有测试类,之后maven构建成功,这也有点令人困惑。 只有在mvn clean testTypeNotPresentExceptionProxy出现。

解:

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

在部署过程中,您将在这个中断点停止多次。 请参阅参考资料,并记住上次部署前的错误。 而不是检查最后的“ 这个 ”类中的注释。 你也可以把断点放到AnnotationParser.parseClassArray方法中,但是这个方法的编译代码和断点很慢 。 (在我的方法中断点,我最后不能申请)。

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

项目A是一些图书馆,在你的日食maven项目。 它有一个名为org.exmaple.Foo的类,它位于src/test/java/目录下。

在你的项目B发生错误的地方,你试图访问这个类。 但这是不可能的。

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

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

这个问题与Jar文件冲突。 validationwar文件lib文件夹内的jar文件列表。 删除不必要和冲突的jar文件。 然后部署将会成功。

Interesting Posts