14

次のコードでクラスjavax.servlet.ServletExceptionのインスタンスを作成しようとしています

public class MyTroubleViewer {
 public static void main(String[] args) {
  javax.servlet.ServletException servletException = new javax.servlet.ServletException("Hello");
  System.out.println(servletException.getMessage());
 }
}

しかし、作成時に例外が発生します。

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

Mavenは依存関係について私を助けてくれます:

<dependency>
 <groupId>javax</groupId>
 <artifactId>javaee-api</artifactId>
 <version>6.0</version>
 <type>jar</type>
 <scope>compile</scope>
</dependency>

私は何が間違っているのですか?

4

3 に答える 3

22

@ user353852で述べたように、現在の依存関係にはJava EE 6 APIのみが含まれ、メソッド本体は含まれていません。したがって、それに対してコードを実行することはできません。コンテナの外部でコードを実行するには、(GlassFishリポジトリから)「具体的な」依存関係を取得する必要があります。

<repositories>
  <repository>
    <id>glassfish-repository</id>
    <url>http://download.java.net/maven/glassfish</url>
  </repository>
  ...
</repositories>

<dependencies>
  <dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.servlet</artifactId>
    <version>3.0</version>
    <scope>test</scope>
  </dependency>
  ...
</dependencies>

そのような依存関係はスコープで宣言されるべきではないことに注意してくださいcompile、あなたはそれをバンドルしたくありません(それはそうであるべきであるprovidedか多分testですが、そうではありませんcompileruntime


javaee実装のプロバイダーは重要なのだろうか?通常、私はApacheサーバーを使用しているので、サーバー上にあるのと同じjavaee実装があると便利です。

理論的には、違います。ただし、実際には、使用するサーバー(またはJava EEリファレンス実装)の実装JARを使用することをお勧めします。Java EE 6を使用しているため、これは実際にはどちらの場合もGlassFishv3のJARSを意味します。

2番目の質問ははるかに重要です。javax.servletはjavaee-api実装の一部にすぎず、他の部分を見つけることができます。ここで、「javax / validation/Validation」が必要です。

Bean Validation APIの場合、次のものが必要です(Hibernate ValidatorがRIです)。

<repositories>
  <!-- For Hibernate Validator -->
  <repository>
    <id>jboss</id>
    <name>JBoss repository</name>
    <url>http://repository.jboss.org/maven2</url>
  </repository>
  ...
</repositories>

<dependencies>
  <!-- Bean Validation API and RI -->
  <dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.0.0.GA</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.0.2.GA</version>
    <scope>runtime</scope>
  </dependency>
  ...
</dependencies>

どのアーティファクトがjavaeeの各側面を実装しているかをどのように判断できますか。たぶんどこかにある種の「地図」があるのでしょうか?

公式なものはありませんが、BalusCからのこの素晴らしい答えが役に立ちます。

于 2010-06-05T13:58:25.900 に答える
5

この投稿をチェックしてください。基本的に、これらのMavenライブラリはスタブであり、コンパイルのみに適しています。これらは、実行時に参照されることを意図したものではありません。実行時に(単体テストの場合でも)、実際のjarファイル、つまりサーブレットコンテナからのファイルを参照する必要があります。

于 2010-06-05T10:38:59.093 に答える
0

1.サーブレットクラスがパブリックとして宣言されていることを確認します。2.パスはweb.xmlで正しく指定されているか、注釈を使用します。

于 2020-05-31T07:30:25.953 に答える