【问题标题】:java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/mail/MessagingExceptionjava.lang.ClassFormatError:类文件 javax/mail/MessagingException 中非本机或抽象方法中的缺失代码属性
【发布时间】:2012-08-21 23:50:55
【问题描述】:

我有一个 javaee Bibliothek 的 maven 依赖项。

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
</dependency>

我在 Eclipse 中的某些类中遇到错误。

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/mail/MessagingException

我添加了 javax.mail 依赖项。

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.5</version>
</dependency>

它没有工作。有什么想法吗??

【问题讨论】:

    标签: java jakarta-ee maven java-ee-6


    【解决方案1】:

    它不起作用,因为来自 javax/javaee-api/provided 依赖项的类是专门构造的。它们不是可用的运行时,因为缺少方法的实现。

    简单地将 javax.mail/mail/1.4.5 依赖项中的类添加到类路径中没有帮助,因为 javax/javaee-api/provided 中的类已经存在。单独拥有 javax.mail/mail/1.4.5 依赖可以解决您的问题,但很可能您还需要来自 javax/javaee-api/provided 的其他类。

    您可以做的是摆脱javax/javaee-api/provided 依赖并从目标应用服务器提供的依赖中获取这些类。您可以使用以下示例:

       <dependency>
            <groupId>org.jboss.spec</groupId>
            <artifactId>jboss-javaee-6.0</artifactId>
            <version>1.0.0.Final</version>
            <type>pom</type>
            <scope>provided</scope>
         </dependency>
    

    因为提供了范围,所以它不会影响要构建的工件。这就是为什么您可以将它与 JBoss 以外的其他应用程序服务器一起使用的原因。它与原始依赖项中的 API 相同,但它包含 normal 类。

    【讨论】:

    • 我添加了更多的说明来回答。
    • 我总是将 javaee-api 依赖项放在 pom.xml 中,在它之前有实现 jars,这也修复了它
    【解决方案2】:

    很奇怪,但以下顺序对我有用,

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>
    
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
    

    反过来不行。

    【讨论】:

    • 这确实有效。 @prayag upd 你能否发布更多关于它是如何工作的细节。
    • 这对我有用。恕我直言的解释如下:订单在类路径中是有价值的。因此,这样编译器会使用第一个包中包含的 javax.mail.MessagingException 类,而不是第二个。
    【解决方案3】:

    就我而言,只使用库:

    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4</version>
    </dependency>
    

    使用 JDK 6 和 Tomcat 运行没有问题

    【讨论】:

    • 我还需要 javaee 的其他库
    【解决方案4】:

    如果您按以下顺序将它们添加到您的 pom 中: javax.mail javaee-web-api 它会起作用是非常合乎逻辑的,因为运行时首先从 javax.mail 中找到必要的类(具有正确的实现),而忽略来自 javaee-web-api 的任何类似的类(没有实现)。

    【讨论】:

      【解决方案5】:

      就我而言,我使用以下顺序。与 JDK6 配合得很好。

      <dependency>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
          <version>1.4</version>
          <scope>provided</scope>
          <exclusions>
              <exclusion>
                  <groupId>javax.activation</groupId>
                  <artifactId>activation</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
      
      <dependency>
          <groupId>javaee</groupId>
          <artifactId>javaee-api</artifactId>
          <version>5</version>
          <scope>provided</scope>
      </dependency>
      

      【讨论】:

        猜你喜欢
        • 2013-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 2012-04-22
        • 1970-01-01
        相关资源
        最近更新 更多