5

解決できない Java/Maven/Jetty の問題に苦しんでいます。正しく起動する Java Jetty サーバーがありますが、HTTP 要求が送信されるとすぐに中止され、次のスタックトレースが表示されます。

2013-09-30 08:40:24,534 [qtp297240915-11 Selector0] WARN  org.eclipse.jetty.io.nio - java.lang.SecurityException: class "javax.servlet.AsyncContext"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(ClassLoader.java:806) ~[na:1.6.0_37]
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:487) ~[na:1.6.0_37]
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:625) ~[na:1.6.0_37]
at java.lang.ClassLoader.defineClass(ClassLoader.java:615) ~[na:1.6.0_37]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) ~[na:1.6.0_37]
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) ~[na:1.6.0_37]
at java.net.URLClassLoader.access$000(URLClassLoader.java:58) ~[na:1.6.0_37]
at java.net.URLClassLoader$1.run(URLClassLoader.java:197) ~[na:1.6.0_37]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_37]
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) ~[na:1.6.0_37]
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) ~[na:1.6.0_37]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) ~[na:1.6.0_37]
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ~[na:1.6.0_37]
at org.eclipse.jetty.server.AbstractHttpConnection.<init>(AbstractHttpConnection.java:157) ~[jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131]
at org.eclipse.jetty.server.AsyncHttpConnection.<init>(AsyncHttpConnection.java:50) ~[jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131]
at org.eclipse.jetty.server.nio.SelectChannelConnector.newConnection(SelectChannelConnector.java:285) ~[jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131]
at org.eclipse.jetty.server.nio.SelectChannelConnector$ConnectorSelectorManager.newConnection(SelectChannelConnector.java:325) ~[jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131]
at org.eclipse.jetty.server.nio.SelectChannelConnector.newEndPoint(SelectChannelConnector.java:272) ~[jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131]
at org.eclipse.jetty.server.nio.SelectChannelConnector$ConnectorSelectorManager.newEndPoint(SelectChannelConnector.java:331) ~[jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131]
at org.eclipse.jetty.io.nio.SelectorManager$SelectSet.createEndPoint(SelectorManager.java:836) ~[jetty-io-7.6.5.v20120716.jar:7.6.5.v20120716]
at org.eclipse.jetty.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:491) ~[jetty-io-7.6.5.v20120716.jar:7.6.5.v20120716]
at org.eclipse.jetty.io.nio.SelectorManager$1.run(SelectorManager.java:285) [jetty-io-7.6.5.v20120716.jar:7.6.5.v20120716]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) [jetty-util-8.1.3.v20120416.jar:8.1.3.v20120416]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) [jetty-util-8.1.3.v20120416.jar:8.1.3.v20120416]
at java.lang.Thread.run(Thread.java:662) [na:1.6.0_37]

明らかに、それを実行するために含まれている jar 内で奇妙なことが起こっています。Google では、この問題への言及をいくつか見つけることができましたが、明確な解決策はありませんでした。

とにかく、最も奇妙なことは、同じアプリケーションが別のマシンで完全に動作することです。2 つの間に違いがないことを確認するために、プロジェクトのディレクトリ (コンパイル済みのクラス、maven の依存関係の jar ファイル、構成ファイルなどを含む) を、正常に実行されているマシンから正常に実行されていない別のマシンにコピーしました。エラーが表示され続けます。マシンの Maven ローカル キャッシュ (~/.m2/) も削除しましたが、問題にはなりません。Java と Maven のバージョンは、2 つのマシンで同じです。

明らかに、この 2 つの環境には何らかの違いがあるはずですが、今述べた側面以外にどこを探すべきかわかりません。

何か案は?

編集: プロジェクトには、競合する 2 つのバージョンの javax.servlet.servlet-api が含まれていました。pom から古いものを除外すると、問題が修正されました。いずれにせよ、1 台のマシンで両方の jar がロードされている (lsof で二重チェックされている) にもかかわらず、サーバーが正常に動作していた理由は謎のままです。クラスローダの順番を考慮したのかな。

4

2 に答える 2

3

引用符

java.lang.SecurityException: クラス "javax.servlet.AsyncContext" の署名者情報が、同じパッケージ内の他のクラスの署名者情報と一致しません

私のプロジェクトでもこの例外がスローされました。ついに私は解決策を見つけます。異なるバージョンで同じ依存関係を参照するためにスローされる例外。そのため、Java コードの署名は依存関係を台無しにします。

  1. 適切な依存関係を追加する
  2. 依存バージョンで確認
  3. 同じ jar の複数の依存関係を避ける

javax.servlet
servlet-api 2.5
提供

必要な依存関係は 1 つだけです

于 2014-04-30T12:18:26.127 に答える
2

除外する必要はありません。servlet-apiコンテナーにデプロイされるプロジェクトの への参照は<scope>provided</scope>、実行時にコンテナーのバージョンのみが存在することを確認するために使用する必要があります (サーブレット API を pom.xml に追加する方法)。

于 2013-10-05T12:42:32.280 に答える