【问题标题】:Tomcat 9 not able to start with OpenJDK 11Tomcat 9 无法从 OpenJDK 11 启动
【发布时间】:2020-03-20 14:36:36
【问题描述】:

我用 OpenJDK 11 安装了 Tomcat 9,但是 Tomcat 服务没有启动并且失败并出现以下错误:

SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/orion]]
    at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:951)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1432)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1422)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:261)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:801)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:695)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/orion]]
    at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1432)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1422)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
    ... 21 more
Caused by: org.apache.xerces.parsers.ObjectFactory$ConfigurationError: Provider org.apache.xerces.parsers.XIncludeAwareParserConfiguration could not be instantiated: java.lang.SecurityException: Sealing violation loading java.io.StringReader : Package java.io is sealed.
    at org.apache.xerces.parsers.ObjectFactory.newInstance(Unknown Source)
    at org.apache.xerces.parsers.ObjectFactory.createObject(Unknown Source)
    at org.apache.xerces.parsers.ObjectFactory.createObject(Unknown Source)
    at org.apache.xerces.parsers.SAXParser.<init>(Unknown Source)
    at org.apache.xerces.parsers.SAXParser.<init>(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.<init>(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl.<init>(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(Unknown Source)
    at org.apache.tomcat.util.digester.Digester.getParser(Digester.java:614)
    at org.apache.tomcat.util.descriptor.web.WebXmlParser.<init>(WebXmlParser.java:62)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1099)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:769)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5007)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    ... 27 more

诊断后我发现其中一个 jar(xerces.jar) 正在创建问题,因此我从我的应用程序中删除了该 jar。之后tomcat服务启动没有任何问题。

但是一旦我尝试访问我的一个 servlet,它就会给我以下错误:

INFO: Marking servlet [InfoServlet] as unavailable
Nov 25, 2019 3:33:24 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet [InfoServlet]
java.lang.SecurityException: Sealing violation loading java.io.StringWriter : Package java.io is sealed.
    at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2363)
    at org.apache.catalina.loader.WebappClassLoaderBase$PrivilegedFindClassByName.run(WebappClassLoaderBase.java:156)
    at org.apache.catalina.loader.WebappClassLoaderBase$PrivilegedFindClassByName.run(WebappClassLoaderBase.java:145)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:832)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1297)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
    at org.apache.log4j.Category.getInstance(Category.java:522)
    at com.pg.orion.basic.rmiservlet.InfoServlet.<clinit>(InfoServlet.java:32)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:151)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1032)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:761)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:394)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:834)

最好的部分是一切都与 Java 8 一起工作,而无需删除任何东西。

看起来问题与 xerces.jar 无关,因为它已经在使用 Java 8。经过一番研究,我发现

密封违规意味着密封包中的某些类是从两个不同的位置(目录或 jar 文件)加载的。

一个密封的包本质上说“我知道这个包中的所有类都来自一个 jar 文件。出于安全原因,没有其他位置可以提供这个包中的类”。

情况并非如此,因为所有使用Java 8 的东西。任何帮助将不胜感激。

经过诊断,我发现 -Djava.security.manager 参数导致了我们在安装 tomcat 时在 service.bat 中另外设置的整个问题。去掉-Djava.security.manager后,tomcat工作正常。 但是,由于安全策略,我们在 java 8 中启用了安全管理器,现在由于那个 tomcat,它没有在 java11 中运行。 如何通过启用安全管理器和使用 java 11 解决此问题???

【问题讨论】:

标签: java tomcat java-11 tomcat9 openjdk-11


【解决方案1】:

这很奇怪。 java.io 模块是 Java 运行时的一部分。

我能想到的唯一解释是有人将旧版 Java 中的 rt.jar1 副本放入您的 webapp 的 WAR 文件或 Tomcat 共享库文件夹之一。由于 Tomcat 的 webapp 类加载器的搜索顺序与典型的 Java 应用程序相比是颠倒的,这可能会导致这些类从错误的位置加载,从而导致密封违规。

1 - 或类似的东西。它也可以是一个 JAR,其中包含出于某种目的而“调整”过的标准类库的子集。

【讨论】:

  • 我也假设相同,所以我删除了 xerces.jar。现在它对 rt.jar 的其他一些包给出了错误,而奇怪的部分是一切都可以与 java8 一起使用。
  • 它不是 xerces.jar。这首先不会导致这种情况。它是您的 WAR 文件或 Tomcat 共享库中的其他内容。或者可能在 JVM 的引导类路径上有一些奇怪的东西。 (提示:尝试全新安装 Tomcat。)
  • 它在 Java 8 中工作并不奇怪(IMO)。Java 8 在某种程度上容忍您从非标准位置加载标准类。尝试使用 JVM 调试选项,该选项允许您查看每个类的加载位置哪里。 (查看手册。)
  • 当我尝试使用 startup.bat 或 catalina.bat 启动 tomcat 并且它正在运行并且当我使用 tomcat windows 服务启动时它失败并出现上述错误
  • 能否请您澄清您的最后评论。我无法弄清楚你在说什么。
【解决方案2】:

Tomcat 9 和 Openjdk 11 的安装过程是怎样的

请确保您指向正确的 JVM.dll 文件,因为在 OpenJDK 11 版本中 不与 JRE 捆绑在一起。在 Tomcat 属性中,您需要映射 bin/server/jvm.dll 中存在的 jvm.dll。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2020-06-10
    • 2015-11-25
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多