java.lang.SecurityException,包含两个冲突版本的javax.servlet.servlet-api jar

时间:2013-09-30 08:54:59

标签: java maven jetty

我正在努力解决我无法解决的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双重检查)服务器运行正常。也许考虑了类加载器的顺序?

2 个答案:

答案 0 :(得分:2)

块引用

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

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

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

    的javax.servlet
      servlet-api 2.5
      提供

    只需要一个依赖

答案 1 :(得分:1)

你不应该排除它;对将部署在容器中的项目的servlet-api的任何引用都应使用<scope>provided</scope>来确保在运行时仅存在容器的版本(how to add the servlet api to my pom.xml)。