15

私は自分の pom.xml に次の依存関係を持っているので、私の IDE (IntelliJ) はコンパイル中に使用できるサーブレット API クラスを持ちますが、ビルドでは提供されません。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>3.0-alpha-1</version>
    <scope>provided</scope>
 </dependency>

しかし、提供されたスコープは、テストスコープで実行するときに、この依存関係のクラスをクラスパスに追加します。これは、プログラムで開始する Jetty の問題です。すでにライブラリにあるので、

 java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package

この依存関係を削除すると、Jetty サーバーはテスト スコープで正しく起動しますが、IntelliJ がコードをコンパイルするにはこの依存関係が必要です。これを解決する最善の方法は何ですか? テスト範囲からこの依存関係を除外する方法はありますか?

4

8 に答える 8

8

私はちょうどこの問題を自分で抱えていて、それを共有したかったのです:

  • 私の WAR が最終的に展開されるコンテナに干渉しないように、javax.servlet:servlet-api:3.0-alpha-1スコープを使用して に依存します。provided
  • に依存しorg.eclipse.jetty:jetty-webapp、スコープtestを使用して、Jetty サーバーを単体テストの一部として実行できるようにする
  • その後、 への推移的な依存関係がorg.eclipse.jetty.orbit:javax.servlet:3.0.0.v201112011016必要になります。jetty-webapp

Jetty には が提供していない が必要だったため、 の除外はjetty.orbit:javax.servlet(私にとって) オプションではありません。私はこれをやってしまった:Serverjavax.servlet.HttpConstraintElementjavax.servlet:servlet-api:3.0-alpha-1

  1. への依存を削除しますjavax.servlet:servlet-api
  2. への依存関係jetty.orbit:javax.servletをスコープprovidedで明示的に追加するため、完全に置き換えますjavax.servlet:servlet-api

必要なものとの取引が何であるかはわかりませんHttpConstraintElement。おそらく、将来のバージョンの で利用できるようになるでしょう。これはjavax.servlet:servlet-api、Jetty の同じ実装よりも望ましい依存関係であると感じています。

編集:

ちなみに、この問題は、POM ファイルを自動的にフォーマットするプラグインの構成をいじることによって発生しました。依存関係を並べ替えたため、POMファイルを並べ替えるために別のポスターのソリューションに対して機能します。私の膨大なMavenの経験では、依存関係の順序に「依存」している場合、それは大きな臭いです.

于 2013-02-12T06:08:58.463 に答える
5

スコープをコンパイルするように設定してみてください

于 2012-06-18T15:26:14.137 に答える
3

junit テストを実行しているクラスパスに javax.servlet-api を含めないようにしようとすると、解決策が見つかりました。実際、クラスパスのjarの最後にservlet-apiを移動すると、悟りが来ました...

間違ったバージョンの servlet-api を使用しました。2.5 を使用していましたが、3.0 が必要でした。Mavenスコープは「提供」を選択します。Eclipse内でjunitを実行し、「mvn test」を実行するために機能します。

とはいえ、なぜ対立がないのか、私には理解できません。「提供された」依存関係でさえ、テスト時にクラスパスに公開されるので、競合が発生する可能性があります-または、もちろん-コンパイルに使用されるサーブレットAPIの正しいバージョンとjettyのバージョンを正確にヒットした場合servlet-api の場合、競合はありません。

とにかく、それは私のために働きます。

これが、jetty + サーブレット API の依存関係/* pom-setup です。

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>8.1.4.v20120524</version>
    <type>jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-servlet</artifactId>
    <version>8.1.4.v20120524</version>
    <type>jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-webapp</artifactId>
    <version>8.1.4.v20120524</version>
    <type>jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-jsp</artifactId>
    <version>8.1.4.v20120524</version>
    <type>jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
于 2012-08-21T05:10:12.833 に答える
3

私にとっては同じエラーが発生しました。古いバージョンのサーブレット (2.5) がサーブレット 3.0 と共にパスに存在することがわかりました。古いバージョンを削除(除外)すると、問題は解決しました。

于 2013-03-22T03:37:43.163 に答える
1

同様の問題を修正するために、次の sbt プロジェクト設定を使用します。

  "any dependency program that includes servlet-api java library code" %  excludeAll ExclusionRule(organization = "org.eclipse.jetty.servlet-api"),
  "org.mortbay.jetty" % "servlet-api" % "3.0.20100224"
于 2015-01-06T05:42:17.493 に答える