24

アプリケーションで Java サーブレットを使用する予定です。Java サーブレット 3.0 実装 jar をロードするために、プロジェクトの POM.xml ファイルに以下を含めました。

<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

ここで検索したところ、いくつかの良い答えが見つかりました。

実際の実装ではなく、サーブレット API によって定義されたインターフェイスのみを含む JAR を含めると、このエラーが発生することがわかりました。そのため、使用しているグラスフィッシュ jar が単なるインターフェイスであるか、実装も含まれていることを確認しました。これは単なるインターフェースではなく、実装であることがわかりました。

だから今、なぜ実行時にこのエラーが発生するのか疑問に思っています。誰?

アップデート:

ちょうど今、それが私の側からの露骨なエラーであることがわかりました(まったく別のプロジェクトを実行している間に、あるプロジェクトにjarを追加していました!)。申し訳ありません。glassfish サーブレットの実装を追加すると、問題が解決します。

ありがとう、サンディープ

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

私は最近この同じエラーに遭遇しました。この質問と上記の回答、特に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 と関係があることがわかりました

于 2014-12-12T15:30:27.317 に答える
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 に答える
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 に答える
-2

netbeans 7.2.1 でのコンパイルで同じ問題が発生しました。ただし、出力では、自分の Java ソース ファイルの 1 つが「absent code attribute.......etc」を持つものとして指定されていました。

同時に、JDeveloper を使用して同じプロジェクトをコンパイルして実行することができました。数回の「クリーンアップ」と再起動の後、netbeans は依然として同じ問題を引き起こしました。

「不在コード属性」があると報告されているJavaにmainメソッドを追加し、デバッグターゲットと同じものを使用することで、最終的に修正しました。すべて正常に戻りました。

于 2013-06-07T00:00:48.540 に答える