类文件javax/servlet/ServletException中非本机或抽象的方法中缺少代码属性

类文件javax/servlet/ServletException中非本机或抽象的方法中缺少代码属性,java,servlets,Java,Servlets,我计划在我的应用程序中使用Javaservlet。我在项目的POM.xml文件中包含以下内容,以加载JavaServlet3.0实现jar <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.servlet</artifactId> <version>3.2-b05</version> </dependenc

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

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.servlet</artifactId>
    <version>3.2-b05</version>
</dependency> 
我在这里找了一下,找到了一些

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

所以现在,我想知道为什么在运行时会出现这个错误。有人吗

更新:

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

谢谢,
Sandeep

在过去的两个小时左右,我一直在与surefire插件所使用的javaee api和javaee web api依赖性相关的问题进行斗争。正如JBoss论坛上的朋友们所说,整个JEE6库(根据Sun/Oracle的决定)被划分为一个API(仅限接口/存根)JAR和提供者

这与此有什么关系?如果您遇到问题,例如,您会遇到如下错误:

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>

maven surefire插件
2.12
faces:javax.faces-api

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

我和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>

org.glassfish.main.extras
玻璃鱼嵌入所有
3.1.2.2
假如

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

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


最后,我通过向java中添加一个main方法来修复它,该方法被报告为具有“缺席代码属性”,并将其用作调试目标。所有测试都恢复正常。

我在运行测试(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.1.5.1
测试

注意:我使用的是Jersey 1.17,我有一个与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>

org.apache.geronimo.specs
geronimo-servlet_3.0_规范
1
测试

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

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

org.glassfish.main.extras
玻璃鱼嵌入所有
3.1.2.2
假如
原来我的是javax.servlet


<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.2.2</version>
<scope>provided</scope>
org.glassfish.main.extras 玻璃鱼嵌入所有 3.1.2.2 假如

这对我有用。谢谢 但是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>

爪哇
JavaEEAPI
6
假如
org.glassfish.main.extras
玻璃鱼嵌入所有
3.1.2.2
测试
上述命令不起作用

<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>

org.glassfish.main.extras
玻璃鱼嵌入所有
3.1.2.2
测试
爪哇
JavaEEAPI
6
假如

以上订单有效

这里也有同样的问题。虽然对我来说,这是我声明依赖关系的顺序。glassfish嵌入式依赖项需要在提供的JavaEEWebAPI依赖项之前声明

    <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>

org.glassfish.extras
玻璃鱼嵌入所有
3
测试
爪哇
javaeewebapi
6
假如

我不知道为什么在测试中将glassfish嵌入到javaeewebapi之后时,类路径会变得混乱。我假设JVM首先尝试在提供的文件中解析javax类,然后在测试过程中放弃。我认为,声明测试范围将优先,但在我的情况下,情况似乎并非如此。希望这对其他人有所帮助。

您不应该在部署的依赖项中包含servlet jar文件,因为GlassFish的类路径中已经包含了它。此依赖项应具有“提供的”作用域。@JBNizet:我没有将Glassfish用作servlet容器。Jetty JAR(用于服务器、UTIL、servlet等)似乎没有任何ServletAPI的实现。因此,如果我没有显式地包含实现jar,它将如何工作?Jetty如何通过不实例化它传递给您的servlet的servlet请求和响应而成为servlet容器?谢谢!javaeewebapi中的javax也有类似的问题。像你描述的那样排除它(但后来javax:javaeewebapi)解决了它。但是它继续出现,最后我的按摩技术失败了。然后我下载了glassfish并将javaee.jar添加到我的netbeans项目库中,立即获得了成功。你知道为什么订单在这种情况下很重要吗?是的。这是因为某些包或类中的冲突。这意味着某些类在依赖项和包含在POM.xml中的顺序上是相同的,这决定了这些类的其他用户的注入优先级。如果您有疑问,请告诉我。它
    <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>