0

I am trying to deploy spring boot application to external tomcat, I am getting the following exception in the catalina.log file as shown below.

The war file name is : com#myApp.war.

I wanted to set the context-path of the application to com/myApp in the url

http://localhost:8080/com/myApp/healthcheck, hence the war file name is com#myApp.war

 java version is : 1.8 (both application and tomcat)
    tomcat is running on linux server.

08-Apr-2021 15:41:20.326 SEVERE [main] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [/opt/apache/tomcat/base/webapps/com#myApp.war]
    java.lang.IllegalStateException: Error starting child
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:720)
        at org.apache.catalina.core.ContainerBase.access$000(ContainerBase.java:129)
        at org.apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.java:150)
        at org.apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.java:140)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:688)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:706)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1848)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
        at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:773)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
        at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936)
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:843)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)
    Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/com/myApp]]
        at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
        ... 41 more
    Caused by: java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationContextInitializer : org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer
        at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:467)
        at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:449)
        at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:442)
        at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:284)
        at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:264)
        at org.springframework.boot.builder.SpringApplicationBuilder.createSpringApplication(SpringApplicationBuilder.java:109)
        at org.springframework.boot.builder.SpringApplicationBuilder.<init>(SpringApplicationBuilder.java:97)
        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createSpringApplicationBuilder(SpringBootServletInitializer.java:164)
        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:128)
        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:95)
        at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:174)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5166)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        ... 42 more
    Caused by: java.lang.ExceptionInInitializerError
        at org.springframework.beans.BeanUtils.<clinit>(BeanUtils.java:80)
        at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:463)
        ... 54 more
    Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "org.graalvm.nativeimage.imagecode" "read")
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
        at java.security.AccessController.checkPermission(AccessController.java:886)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
        at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)
        at java.lang.System.getProperty(System.java:717)
        at org.springframework.core.DefaultParameterNameDiscoverer.<clinit>(DefaultParameterNameDiscoverer.java:47)
        ... 56 more
08-Apr-2021 15:41:20.329 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/opt/apache/tomcat/base/webapps/com#myApp.war] has finished in [3,052] ms
08-Apr-2021 15:41:20.331 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
08-Apr-2021 15:41:20.348 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["https-jsse-nio2-8443"]
08-Apr-2021 15:41:20.349 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [21648] milliseconds

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

    
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>19.3.0.0</version>
<!--            <scope>provided</scope>-->
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        
    </dependencies>

    <build>
<!--        This gives the final war file name-->

        <finalName>${project.artifactId}</finalName>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>


            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.2</version>

                <executions>
                    <execution>
                        <id>build-info</id>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  • 1
    Apparently you are running a Tomcat instance with a security manager installed. I would also suggest to upgrade to Spring Boot 2.4.4 (the latest version). – M. Deinum Apr 08 '21 at 15:05
  • Its not an option for me, as the company wants me to use this Spring Boot -2.4.2 version. Is there any other solution :) – Syed Iftekharuddin Apr 08 '21 at 15:12
  • I mentioned multiple things in my comment and you only read one... Apparently your Tomcat is running with a SecurityManager which disallows to read properties. So either remove the security manager or downgrade Spring Boot to a version that doesn't support GraalVM. – M. Deinum Apr 08 '21 at 15:35
  • 1
    And I suggest to register an issue with Spring that detecting running in a native image can lead to a security exception. – M. Deinum Apr 08 '21 at 16:39
  • does adding a permission to the conf/catalina.policy file. A line to be added to the section of generic permissions ("grant {"): like permission java.util.PropertyPermission "org.graalvm.nativeimage.imagecode", "read"; will solve the problem? I have not worked with this so not sure how to use this, do u have any idea? – Syed Iftekharuddin Apr 08 '21 at 16:52
  • You will have to consult with the people who are managing the Tomcat instance if that is possible and if that is allowed. This would be needed to be added to the security policy in use by your Tomcat instance. – M. Deinum Apr 08 '21 at 17:38

2 Answers2

1

You problems you are facing running with a security manager are known and best summarized in Tomcat's documentation (emphasis mine):

Tomcat is tested with the security manager enabled; but the majority of Tomcat users do not run with a security manager, so Tomcat is not as well user-tested in this configuration. There have been, and continue to be, bugs reported that are triggered by running under a security manager.

The restrictions imposed by a security manager are likely to break most applications if the security manager is enabled. The security manager should not be used without extensive testing. Ideally, the use of a security manager should be introduced at the start of the development cycle as it can be time-consuming to track down and fix issues caused by enabling a security manager for a mature application.

Your application will break either because of a Tomcat bug, a Spring bug or a bug in your own application. Regarding the problems you found up to now:

  • the problem with java.util.PropertyPermission "org.graalvm.nativeimage.imagecode", "read" should probably considered a Spring bug (as stated in Deinum's comment): Spring should probably only issue a warning if it can't access org.graalvm.nativeimage.imagecode property,
  • the problem with java.lang.reflect.ReflectPermission "suppressAccessChecks" (in this version of your question) is probably due to your own code. Spring tries to access a private field by reflection, because you didn't provide a public setter (cf. ReflectPermission JavaDoc). The stack trace will tell you, which class is the culprit.

I understand that the choice of running with a security manager isn't yours, but now you have to thoroughly debug your application, check the meaning of the security exceptions and decide whether they are required or you can work around them.

Piotr P. Karwasz
  • 12,857
  • 3
  • 20
  • 43
  • How to debug this issue, I used set CATALINA_OPTS=-Djava.security.debug=all, but the tomcat shows some endless logs , that are not saved anywhere for study. – Syed Iftekharuddin Apr 11 '21 at 14:02
  • No need to enable debugging of the security manager: just enable the security manager on your local Tomcat (`startup.sh -security` if you use the shell files or add `-Djava.security.manager -Djava.security.policy=/path/to/catalina.policy` to the options) and check the logs for exceptions. – Piotr P. Karwasz Apr 11 '21 at 14:46
  • In the above output ,there are more to the stack trace "41 more ..". How can I see the full stack trace? – Syed Iftekharuddin Apr 11 '21 at 15:03
  • _"41 more ..."_ means the last 41 lines of the previous exception. In your case from `ContainerBase.access$000` to `Bootstrap.main`. – Piotr P. Karwasz Apr 11 '21 at 15:17
  • I used the command "catalina.bat run -security -Djava.security.manager -Djava.security.policy=${catalina.home}/conf/catalina.policy", but I get the same output as above in the question – Syed Iftekharuddin Apr 11 '21 at 18:25
  • My point is: you **do get** the full stack trace. See [this question](https://stackoverflow.com/q/63406604/11748454) to interpret what you get. From these stacktraces and access to Spring's source code you'll be able to interpret why that `SecurityException` occurred. – Piotr P. Karwasz Apr 11 '21 at 18:44
  • Sorry, but I need more help to debug this, I changed the logging levels in both logging.properties of tomcat and logback-spring.xml of my application, but nothing fruitful that shows that shows the exception full stack trace. Can u suggest some reading or some setting that might help. I also used this http://tomcat.apache.org/tomcat-9.0-doc/logging.html#Using_Log4j , but no use. Please suggest me something. – Syed Iftekharuddin Apr 12 '21 at 07:47
  • @SyedIftekharuddin: use the chat link you provided above. – Piotr P. Karwasz Apr 12 '21 at 07:49
  • Let us continue this discussion [in chat](https://chat.stackoverflow.com/rooms/231022/discussion-between-syed-iftekharuddin-and-piotr-p-karwasz). – Piotr P. Karwasz Apr 12 '21 at 07:59
  • This site can’t be reached – Syed Iftekharuddin Apr 12 '21 at 08:01
-2

When you start tomcat first thing it does is to search for web.xml file in the classpath. Spring Boot however, comes with an embedded tomcat server to run it on an external server you would need to use ServletInitializer

Soumendu
  • 15
  • 1