0

I installed Tomcat 9 with OpenJDK 11 but the Tomcat service didn't start and failed with the following error:

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

After diagnostic I found that one of the jar(xerces.jar) is creating issue, so I removed that jar from my application. After that tomcat service started without any issue.

But once I try to access one of my servlet it gave me below error:

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)

Best part is everything is working with Java 8 without removing anything.

It looks like issue is not related to xerces.jar as it is already working with Java 8. After some research I found that

A sealing violation means that some classes from a sealed package were loaded from two different locations (directories or jar files).

A sealed package is one that essentially says "I know that all classes in this package come from a single jar file. For security reason no other location may provide classes that are in this package".

This is not the case as everything working with Java 8. Any help will be appreciated.

After diagnostic I found that -Djava.security.manager parameter is causing the whole problem that we set additionally in service.bat while installing tomcat. After removing -Djava.security.manager,tomcat is working normally. However, security manager we enabled in java 8 due to security policy and now because of that tomcat it is not running in java11. How to resolve this issue with security manager enable and with java 11???

rahul sharma
  • 33
  • 1
  • 7

2 Answers2

0

This is pretty weird. The java.io module is part of the Java runtime.

The only explanation I can think of is that someone has put a copy of rt.jar 1 from an older version of Java into your webapp's WAR file, or one of the Tomcat shared libraries folder. Since Tomcat's webapp class-loaders have the search order inverted compared with a typical Java application, that could lead to these classes being loaded from the wrong place, leading to a sealing violation.

1 - Or something like this. It also could be a JAR containing a subset of the standard class libraries that have been "tweaked" for some purpose.

Stephen C
  • 698,415
  • 94
  • 811
  • 1,216
  • I'm also assuming the same so I removed xerces.jar. Now it is giving errorto some other package of rt.jar and weired part is everything work with java8. – rahul sharma Nov 26 '19 at 03:10
  • It is not xerces.jar. That wouldn't have caused this in the first place. It is something else either in your WAR file or the Tomcat shared libraries. Or possibly something weird on the JVM's bootclasspath. (Hint: try a clean install of Tomcat.) – Stephen C Nov 26 '19 at 03:21
  • It is (IMO) not weird that it works in Java 8. Java 8 is somewhat tolerant of you loading std classes from non-std places. Try using the JVM debugging option that allows you to see *where* each class is loaded from. (Check the manual.) – Stephen C Nov 26 '19 at 03:22
  • when I tried to start tomcat using startup.bat or using catalina.bat and it's running and it failed with above error when I started with tomcat windows service – rahul sharma Nov 26 '19 at 07:11
  • Could you please clarify your last comment. I cannot work out what you are saying. – Stephen C Nov 26 '19 at 07:20
  • I tried to start tomcat using startup.bat or catalina.bat and tomcat started without any issue, no exception and same i tried to start with tomcat windows service it gave the same error message which I mentioned earlier. the only difference is it tomcat service start with JAVA Options parameter set while installing tomcat and startup.bat and catalina.bat ignore these parameter. These parameter we set while installing tomcat(we modified service.bat for our own purpose) – rahul sharma Nov 26 '19 at 07:29
  • So what are the options that you are providing? What modifications did you make to service.bat? – Stephen C Nov 26 '19 at 07:57
  • Something like this "%EXECUTABLE%" //US//%SERVICE_NAME% ++JvmOptions "-Djava.security.manager;-Djava.security.policy=%CATALINA_HOME%\conf\catalina.policy; with many other parameters , this same change it already their in tomcat which was running with java 8 – rahul sharma Nov 26 '19 at 08:25
  • Put the whole lot into the question. There is a good chance that one of those options is the root cause of the problem. – Stephen C Nov 26 '19 at 08:32
  • Below is the list of paramter set in service.bat -Dcatalina.base=F:\ApacheTomcat -Dcom.sun.management.jmxremote.port=5886 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xrs -Djava.io.tmpdir=F:\ApacheTomcat\temp -Djava.security.manager -Djava.security.policy=F:\ApacheTomcat\conf\catalina.policy -Dorg.apache.catalina.connector.RECYCLE_FACADES=true -Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=false -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=false -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=false – rahul sharma Nov 26 '19 at 08:40
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/203087/discussion-between-rahul-sharma-and-stephen-c). – rahul sharma Nov 26 '19 at 08:44
  • After diagnostic I found that -Djava.security.manager parameter is causing the whole problem that we set additionally in service.bat while installing tomcat. After removing -Djava.security.manager,tomcat is working normally. However, security manager we enabled in java 8 due to security policy and now because of that tomcat it is not running in java11 , Also I modified original question. – rahul sharma Nov 26 '19 at 10:49
0

what was the installation procedure followed for Tomcat 9 and Openjdk 11

Please make sure that you point to the proper JVM.dll file because in OpenJDK 11 version not bundled with JRE. in Tomcat properties you need to map jvm.dll present in bin/server/jvm.dll.