java.lang.SecurityException 与两个冲突版本的 javax.servlet.servlet-a



我正在努力解决一个我无法解决的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]

显然,运行它的罐子里发生了一些奇怪的事情,在谷歌中,我可以找到一些关于这个问题的参考资料,但没有明确的解决方案。

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

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

有什么想法吗?

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

块引用

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

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

  1. 添加适当的依赖项
  2. 检查依赖项版本
  3. 避免同一罐子的多重依赖
  4. 关系

javax.servlet
servlet-API 2.5
提供

只需要一个依赖项

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

最新更新