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 中发生了一些奇怪的事情,在谷歌中我可以找到一些关于这个问题的参考,但没有明确的解决方案。

无论如何,最奇怪的是同一个应用程序在另一台机器上完美运行。为了确保两者之间没有区别,我将项目的目录(包括编译的类、maven 依赖项 jar、配置文件等)从运行良好的机器复制到另一台无法正常运行的机器上。错误不断出现。我还删除了机器的 maven 本地缓存 (~/.m2/),尽管这无关紧要。两台机器的Java和Maven版本是一样的。

显然,两者之间必须存在一些环境差异,但除了我刚才提到的方面,我不知道我还应该在哪里寻找。

有任何想法吗?

编辑:该项目包括两个相互冲突的 javax.servlet.servlet-api 版本。从 pom 中排除较旧的解决了该问题。无论哪种方式,这对我来说仍然是一个谜,为什么在一台机器上虽然两个 jar 都已加载(用 lsof 仔细检查),但服务器运行得很好。也许考虑了类加载器的顺序?

4

2 回答 2

3

块引用

java.lang.SecurityException:类“javax.servlet.AsyncContext”的签名者信息与同一包中其他类的签名者信息不匹配

我的项目中也抛出了这个异常。最后我找到了解决方案。由于引用不同版本的相同依赖项而引发的异常。所以java代码签名与依赖关系混淆了。

  1. 添加适当的依赖
  2. 检查依赖版本
  3. 避免同一个jar的多重依赖

javax.servlet
servlet-api 2.5
提供

只需要一个依赖项

于 2014-04-30T12:18:26.127 回答
2

您不需要排除它;servlet-api对将部署在容器中的项目的任何引用都<scope>provided</scope>应用于确保在运行时仅存在容器的版本(如何将 servlet api 添加到我的 pom.xml)。

于 2013-10-05T12:42:32.280 回答