24

I am planning to use Java servlets in my application. I included the following in my project's POM.xml file to load Java servlet 3.0 implementation jar.

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

The project compiles fine. However, when I run it, I get the following error:

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

I searched for it here and found some good answers.

I figured out from them that this error happens when we include the JAR which contains only interfaces defined by servlet API and not the actual implementation. So, I checked that the glassfish jar I am using is just interfaces or it contains implementation too. I found that it is an implementation and not just interfaces.

So now, I am wondering why I am getting this error at runtime. Anyone?

UPDATE:

Just now, I found out that it was a blatant error from my side (I was adding the jar to one project, while, was running an altogether different project!). I am sorry for this. Adding the glassfish servlet implementation DOES solve the issue.

Thanks, Sandeep

4

8 回答 8

17

过去 2 个小时左右,我一直在解决与用于 surefire 插件的 javaee-api 和 javaee-web-api 依赖项相关的问题。正如 JBoss 论坛上的人不久前发布的那样,似乎整个 JEE6 库被划分(根据 Sun/Oracle 的决定)为 API(仅限接口/存根)JAR 和提供程序。

这与这有什么关系?如果您对FacesContext 类有疑问,您会收到如下错误:

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>

希望有帮助,它确实对我有用。

于 2012-07-23T04:43:23.437 回答
8

我交易到 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>
于 2013-05-31T13:55:29.373 回答
4
<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>

以上订单作品

于 2015-06-03T06:16:22.523 回答
3

当我运行我的测试(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

于 2013-07-29T20:48:36.027 回答
3

我最近遇到了同样的错误,多亏了这个问题和上面的答案——尤其是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 有关

于 2014-12-12T15:30:27.317 回答
2

我有一个与 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>
于 2014-01-08T15:39:06.030 回答
1

这里同样的问题。尽管事实证明我是声明依赖项的顺序。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类,然后在测试期间放弃。我认为声明测试范围将优先,但在我的情况下似乎并非如此。希望这可以帮助某人。

于 2017-01-04T15:31:42.357 回答
-2

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

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

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

于 2013-06-07T00:00:48.540 回答