【问题标题】:Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletException类文件 javax/servlet/ServletException 中非本机或抽象方法中的缺失代码属性
【发布时间】:2012-05-22 20:59:41
【问题描述】:

我计划在我的应用程序中使用 Java servlet。我在项目的 POM.xml 文件中包含以下内容以加载 Java servlet 3.0 实现 jar。

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.servlet</artifactId>
    <version>3.2-b05</version>
</dependency> 

项目编译良好。但是,当我运行它时,我收到以下错误:

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

我在这里搜索了一下,找到了一些good answers

我从他们那里了解到,当我们包含仅包含由 servlet API 定义的接口而不是实际实现的 JAR 时会发生此错误。所以,我检查了我使用的 glassfish jar 只是接口或者它也包含实现。我发现它是一个实现,而不仅仅是接口。

所以现在,我想知道为什么我会在运行时收到此错误。有人吗?

更新:

刚才,我发现这是一个明显的错误(我正在将 jar 添加到一个项目中,而正在运行一个完全不同的项目!)。我对此感到抱歉。添加 glassfish servlet 实现确实解决了这个问题。

谢谢, 桑迪普

【问题讨论】:

  • 您不应该在部署的依赖项中包含 servlet jar 文件,因为 GlassFish 已经在其类路径中包含它。此依赖项应具有“已提供”范围。
  • @JBNizet:我没有使用 Glassfish 作为 servlet 容器。为此,我正在使用 Jetty。
  • Jetty jars(用于服务器、实用程序、servlet 等)似乎没有任何 Servlet API 实现。那么如果我没有明确包含实现jar,它会如何工作呢?
  • 不实例化传递给您的 servlet 的 servlet 请求和响应,Jetty 如何成为一个 servlet 容器?

标签: java servlets


【解决方案1】:

过去 2 个小时左右,我一直在解决与用于 surefire 插件的 javaee-api 和 javaee-web-api 依赖项相关的问题。正如 JBoss 论坛上的朋友 posted a while ago 一样,看起来整个 JEE6 库(根据 Sun/Oracle 的决定)被划分为 API(仅限接口/存根)JAR 和提供程序。

这与此有何关系?如果你有问题,比如FacesContext class,你会收到这样的错误:

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

如果您查看依赖关系树,您会在编译类路径中发现一个默认的 API JAR,它也妨碍了运行时事务:

javax.faces:javax.faces-api:jar:2.1:provided

为 surefire 插件配置添加显式排除将在测试时强制使用提供程序 JAR 依赖项:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12</version>
    <configuration>
        <classpathDependencyExcludes>
            <!-- exclude code absent api -->
            <classpathDependencyExclude>javax.faces:javax.faces-api</classpathDependencyExclude>
        </classpathDependencyExcludes>
    </configuration>
</plugin>

希望对我有所帮助。

【讨论】:

  • 谢谢!来自 javaee-web-api 的 javax 也有类似的问题。像你描述的那样排除它(但随后是 javax:javaee-web-api)解决了它。
【解决方案2】:

我交易到 glassfish-embedded-all 并解决了这个问题。

    <dependency>
        <groupId>org.glassfish.main.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.1.2.2</version>
        <scope>provided</scope>
    </dependency>

【讨论】:

    【解决方案3】:
    <dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>3.1.2.2</version>
    <scope>provided</scope>
    

    它对我有用。谢谢。 但是 pom.xml 中的顺序对我来说也很重要

     <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.main.extras</groupId>
            <artifactId>glassfish-embedded-all</artifactId>
            <version>3.1.2.2</version>
            <scope>test</scope>
        </dependency>
    

    以上订单无效

    <dependency>
            <groupId>org.glassfish.main.extras</groupId>
            <artifactId>glassfish-embedded-all</artifactId>
            <version>3.1.2.2</version>
            <scope>test</scope>
        </dependency>
     <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
    

    高于订单的作品

    【讨论】:

    • 太棒了。你知道为什么在这种情况下顺序很重要吗?
    • 是的。它是因为一些包或类中的冲突。这意味着某些类的依赖关系和包含在 POM.xml 中的顺序是相同的,这决定了它为这些类的其他用户注入的优先级。
    • 如果您有任何疑问,请告诉我。
    【解决方案4】:

    当我运行我的测试(JUnit + Mockito)时,我在使用 Jersey 时遇到了同样的错误。对我有用的是将下面的代码添加到我的 pom.xml 文件中。

    <dependency>
       <groupId>com.sun.jersey</groupId>
       <artifactId>jersey-test-framework</artifactId>
       <version>1.1.5.1</version>
       <scope>test</scope>
    </dependency>
    

    注意:我使用的是 Jersey 1.17

    【讨论】:

    • 它实际上比 Glassfish 依赖项更轻
    【解决方案5】:

    我最近遇到了同样的错误,多亏了这个问题和上面的答案——尤其是leadro.freitos——我能够使用

    解决它
     <dependency>
        <groupId>org.glassfish.main.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.1.2.2</version>
        <scope>provided</scope>
    </dependency>
    

    原来我的与 javax.servlet 有关

    【讨论】:

      【解决方案6】:

      我有一个与 josdem 类似的案例(同样的错误,在使用 Mockito 运行 JUnit 时也是如此),但没有 Jersey。所以这是一个对我有用的独立于泽西岛的解决方案:

          <dependency> 
              <groupId>org.apache.geronimo.specs</groupId>
              <artifactId>geronimo-servlet_3.0_spec</artifactId>
              <version>1.0</version>
              <scope>test</scope>
          </dependency>
      

      【讨论】:

        【解决方案7】:

        同样的问题。虽然结果证明我是我声明依赖项的顺序。 glassfish 嵌入式依赖需要在提供的 javaee-web-api 依赖之前声明。

            <dependency>
                <groupId>org.glassfish.extras</groupId>
                <artifactId>glassfish-embedded-all</artifactId>
                <version>3.0</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-web-api</artifactId>
                <version>6.0</version>
                <scope>provided</scope>
            </dependency>
        

        我不确定为什么在测试中将 glassfish 嵌入在 javaee-web-api 之后放置时,类路径会变得混乱。我想JVM首先尝试解析提供的javax类,然后在测试期间放弃。我认为声明测试范围将优先,但在我的情况下似乎并非如此。希望这对某人有所帮助。

        【讨论】:

          【解决方案8】:

          使用 netbeans 7.2.1 编译时遇到了同样的问题。 然而,输出将我自己的一个 java 源文件指定为具有“缺少代码属性.......等”

          同时,我可以使用 JDeveloper 编译和运行相同的项目。经过几次“清理”并重新启动后,netbeans 仍然出现了同样的问题。

          我最终通过在 java 中添加一个 main 方法来修复它,该方法被报告为具有“缺少代码属性”并使用与调试目标相同的方法。一切恢复正常。

          【讨论】:

          • 但是它又继续弹出,最后我的按摩技巧失败了。然后我下载了 glassfish 并将 javaee.jar 添加到我的 netbeans 项目库中,并立即成功。
          猜你喜欢
          • 1970-01-01
          • 2012-04-22
          • 1970-01-01
          • 2013-04-03
          • 2012-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-10
          相关资源
          最近更新 更多