How should I change Tomcat version of a war in Spring boot project?

半世苍凉 提交于 2020-12-15 10:24:21

问题


How can I change Tomcat version of a war in Spring boot project

I've created a spring project with Maven. I would like to change the version of embedded tomcat.

How should I modify pom.xml or s/t?

pom.xml : I've created a spring project with Maven. I would like to change the version of embedded tomcat.

How should I modify pom.xml or s/t?

pom.xml :

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <tomcat.version>8.5.32</tomcat.version>
</properties>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xxxxx</groupId>
    <artifactId>yyyy</artifactId>
    <version>0.0.1</version>
    <packaging>war</packaging>
    <name>xxxxx</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <tomcat.version>8.5.32</tomcat.version>
    </properties>
***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:175)

The following method did not exist:

    org.apache.tomcat.util.modeler.Registry.disableRegistry()V
    
    
     jar:file:/C:/Users/moto/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.35/tomcat-embed-core-8.5.35.jar!/org/apache/tomcat/util/modeler/Registry.class

The class hierarchy was loaded from the following locations:

    org.apache.tomcat.util.modeler.Registry: file:/C:/Users/moto/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.35/tomcat-embed-core-8.5.35.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of org.apache.tomcat.util.modeler.Registry

回答1:


When you're using spring-boot-stater-parent as you are, you can use a tomcat.version property to control the version of Tomcat. You've already done this in your pom.xml file:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <tomcat.version>8.5.32</tomcat.version>
</properties>

In short, you are already changing the version of Tomcat that Spring Boot uses.

By default, Spring Boot 2.3.1 uses Tomcat 9.0.x. If you remove <tomcat.version>8.5.32</tomcat.version> from your pom file, Tomcat 9.0.x should be used and your application should then be able to start. If you want to customise this version then you should keep the tomcat.version property but use a version with which Spring Boot is compatible. The latest Tomcat 9.0.x release is recommended. Recent 8.5.x releases may also work.




回答2:


If the effective maven POM file shows the overridden tomcat version then next step to debug this issue is to manually delete the org/apache/tomcat/embed in your .m2/repository folder and build the project again.

If it still does not work then try adding the dependencies manually as you are trying to use the older version of tomcat (not recommended but for debugging sake )

org.apache.tomcat.embed tomcat-embed-core
org.apache.tomcat.embed tomcat-embed-el
org.apache.tomcat.embed tomcat-embed-jasper
org.apache.tomcat.embed tomcat-embed-websocket



回答3:


In my case, I had to remove the Tomcat library from the Java Build Path in Eclipse. The Tomcat 8.5.32 library had been added by default when I created the dynamic web project. I believe this was causing Spring Boot to use my Eclipse default instead of the correct Tomcat 9 as described in Andy Wilkinson's response.



来源:https://stackoverflow.com/questions/62826247/how-should-i-change-tomcat-version-of-a-war-in-spring-boot-project

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!