我打算在我的应用程序中使用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实现可以解决问题。
谢谢, 和Sandeep
答案 0 :(得分:15)
我在过去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>
希望有所帮助,它对我有用。
答案 1 :(得分: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>
答案 2 :(得分: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>
以上订单作品
答案 3 :(得分:3)
我在运行测试时特别使用了Jersey(JUnit + Mockito)。对我有用的是将下面的代码添加到我的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
答案 4 :(得分:3)
我最近遇到了同样的错误,感谢这个问题和上面的答案 - 尤其是leandro.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与
有关答案 5 :(得分:2)
我有一个类似于josdem的情况(同样的错误,同时运行JUnit与Mockito),但没有泽西岛。所以这是一个独立于泽西岛的解决方案,对我有用:
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
<version>1.0</version>
<scope>test</scope>
</dependency>
答案 6 :(得分:1)
这里的问题相同。虽然我发现这是我声明依赖关系的顺序。需要在提供的javaee-web-api依赖项之前声明glassfish嵌入式依赖项。
<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>
我不确定为什么当测试中的javaee-web-api之后放置glassfish嵌入时,类路径会变得混乱。我想JVM尝试先解决首先提供的javax类,然后在测试期间放弃。我认为宣布测试范围优先,但在我的情况下似乎并非如此。希望这有助于某人。
答案 7 :(得分:-2)
使用netbeans 7.2.1编译同样的问题。 但是输出将我自己的一个java源文件指定为“缺少代码属性.......等”
同时,我可以使用JDeveloper编译和运行相同的项目。经过一些“清理”并重新启动后,netbeans仍然引发了同样的问题。
我最后通过在报告为具有“缺少代码属性”并使用与调试目标相同的java中添加main方法来修复它。一切恢复正常。