迁移到 JDK 11 发生错误“java.lang.NoClassDefFoundError: javax/activation/DataSource”(tomcat 9.0.12)[重复]

Posted

技术标签:

【中文标题】迁移到 JDK 11 发生错误“java.lang.NoClassDefFoundError: javax/activation/DataSource”(tomcat 9.0.12)[重复]【英文标题】:Migration to JDK 11 has error occure "java.lang.NoClassDefFoundError: javax/activation/DataSource" (tomcat 9.0.12) [duplicate] 【发布时间】:2019-03-26 02:06:31 【问题描述】:

我正在将使用 JDK8 的 java 项目迁移到使用 JDK 11,然后发生与 javax 激活相关的错误。 遵循 Oracle 的迁移指南,I see java.activation that module was removed from JDK 11.

之后,我建议添加第三方**activation-1.0.2.jar*,但仍然出现错误? 请就问题提出建议?您能否告诉我迁移源代码使用 Java 8 到 Java 11 的经验(使用 tomcat 9.0.12 的服务器。Eclipse 2018-09(4.9.0) 编译器)

这是详细错误:

Caused by: java.lang.NoClassDefFoundError: javax/activation/DataSource
    at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
    at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3167)
    at java.base/java.lang.Class.getDeclaredMethods(Class.java:2310)
    at org.apache.catalina.util.Introspection.getDeclaredMethods(Introspection.java:133)
    at org.apache.catalina.startup.WebAnnotationSet.loadMethodsAnnotation(WebAnnotationSet.java:285)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:138)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:69)
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:328)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:768)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5007)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)

【问题讨论】:

【参考方案1】:

您似乎包含了不正确的工件(外部 jar)。

您应该包含 javax.activation:javax.activation-api:1.2.0 作为项目的外部依赖项,以显式访问类 javax.activation.DataSource。相同的示例 Maven 依赖项将是:

<dependency>
  <groupId>javax.activation</groupId>
  <artifactId>javax.activation-api</artifactId>
  <version>1.2.0</version>
</dependency>

另外,请注意如果使用模块化代码(包括module-info.java),您必须使用声明声明对库的依赖 -

requires java.activation;

【讨论】:

javax.activation:javax.activation-api:1.2.0 不是模块,所以requires java.activation 没有意义。在 Java 9 和 10 中,您可以使用 requires java.activation--add-modules java.activation 而不是 包含依赖项。在 Java 11+ 中,该模块不再存在于 JDK 中,因此 requires java.activation 将无法在那里工作。 @nullpointer 谢谢你的帮助,我现在不在项目上使用 maven。我正在使用java构建路径。我将 javax.activation-api:1.2.0 添加到外部 JAR 中,但仍然出现该错误? @Andreas 你的意思是添加外部库对 java 11 没有意义吗?那么,你能帮我更详细的建议来解决这个问题吗? @Andreas 我知道 javax.activation:javax.activation-api:1.2.0 不是模块,因此将其称为依赖项(只是一种描述完整工件名称的方式)。无法与之前在使用框架方面提出的问题相关。是的,在 Java 11 中该模块不存在,但如果您显式添加依赖项并希望在项目中使用 module-info.java,则 requires 与 Java 9.10 中一样有效。 @SuperBeam 在您执行应用程序时,您在哪里看到涉及的依赖项?它是否存在于类路径中?

以上是关于迁移到 JDK 11 发生错误“java.lang.NoClassDefFoundError: javax/activation/DataSource”(tomcat 9.0.12)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

升级到JDK8,编译时发生 Error:java: java.lang.ExceptionInInitializerError

迁移到 JDK 11 后 Spring Boot 测试中的 Mockito 错误

JDK_API剖析之java.lang包

java.lang.ClassCastException 为啥?

使用 Java 11 运行 Sonar Scanner 时主版本号错误

java中的异常类型以及区别????