I have built a webapp using springboot with a react frontend and when I run the app locally I can use my REST API calls without any issue. Once I package everything up into a war file and deploy it to my tomcat server on my VM I can no longer access my backend.
On the catalina.out log file there are no errors appearing however theres also no indication of the springboot app starting. This is all I am getting.
17-Jul-2024 19:20:56.108 INFO [http-nio-0.0.0.0-8080-exec-2] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/tomcat/webapps/record-retention.war]
17-Jul-2024 19:20:56.305 WARNING [http-nio-0.0.0.0-8080-exec-2] org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [5.0]. Default version will be used.
17-Jul-2024 19:20:58.396 INFO [http-nio-0.0.0.0-8080-exec-2] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that werening can improve startup time and JSP compilation time.
17-Jul-2024 19:20:58.416 INFO [http-nio-0.0.0.0-8080-exec-2] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/opt/tomcat/webapps/record-retention.war] has finished in [2,308] ms
This is my App class.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class App extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application){
return application.sources(App.class);
}
}
The build portion of my pom.xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.12.1</version>
<executions>
<execution>
<id>Install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<nodeVersion>v20.14.0</nodeVersion>
<npmVersion>10.8.1</npmVersion>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<arguments>install</arguments>
<workingDirectory>src/main/record-retention-ui</workingDirectory>
</configuration>
</execution>
<execution>
<id>npm build</id>
<goals>
<goal>npm</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<arguments>run build</arguments>
<workingDirectory>src/main/record-retention-ui</workingDirectory>
</configuration>
</execution>
</executions>
<configuration>
<workingDirectory>src/main/record-retention-ui</workingDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>Copy JavaScript app into Springboot</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.build.finalName}/</outputDirectory>
<resources>
<resource>
<directory>src/main/record-retention-ui/build</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Previous to posting I've attacking this problem for 2 days with no avail, I implemented the servletInitializer as I didn't have that initially. I have no issue accessing the frontend through the server I just cant make any API calls.
This is my first time attempting to deploy a webapp to a server so any help/advice is greatly appreciated. If more information is needed I can provide it!
As shown here Spring Boot 3 comes with Jakarta EE 10 which means Servlet Specification 6.
As shown here for Servlet Spec 6 you need Tomcat 10.1+
Servlet Spec | Apache Tomcat Version | Supported Java Versions |
---|---|---|
6.1 | 11.0.x | 17 and later |
6.0 | 10.1.x | 11 and later |
4.0 | 9.0.x | 8 and later |
So provided you are using modern Spring Boot 3+, you need to use Tomcat 10.1+