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

2022-09-01 20:46:01

我计划在我的应用程序中使用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

我在这里搜索了它,并找到了一些很好的答案

我从他们那里发现,当我们包含JAR时,会发生此错误,该JAR仅包含由servlet API定义的接口,而不是实际的实现。因此,我检查了我使用的玻璃鱼罐只是接口还是也包含实现。我发现它是一种实现,而不仅仅是接口。

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

更新:

刚才,我发现这是我这边的一个明显错误(我正在将jar添加到一个项目,而正在运行一个完全不同的项目!我很抱歉。添加玻璃鱼服务实现确实解决了这个问题。

谢谢,桑迪普


答案 1

在过去的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>

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


答案 2

我交易到玻璃鱼嵌入所有并解决了这个问题。

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

推荐