如何从 springboot 应用程序中分离集成的 tomcat

Posted

技术标签:

【中文标题】如何从 springboot 应用程序中分离集成的 tomcat【英文标题】:How can i detach from integrated tomcat from a springboot application 【发布时间】:2019-12-11 15:12:57 【问题描述】:

我在springboot中有一个项目,当我运行mvn spring-boot:run时,它使用嵌入式tomcat部署应用程序,我需要使用tomcat运行一个容器,并将应用程序编译为WAR,并将其添加到tomcat容器中.

【问题讨论】:

【参考方案1】:

您必须从依赖项中排除 tomkat:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

在此之后添加 WAR 包工作流。

【讨论】:

【参考方案2】:

查看 Spring 的文档以了解如何convert a spring boot JAR application to a WAR。

【讨论】:

【参考方案3】:

谢谢大佬回复我,终于知道怎么做了。

首先要访问 Tomcat 的管理仪表板,我们需要创建一组文件,如下所示:

-MySpringBootApp
|-->src
|----|->myspringbootapppackage
|------------------|->MySpringBootApp.java
|-->Dockerfile
|-->tomcat-users.xml
|-->pom.xml

tomcat-users.xml 我是这样写的

<tomcat-users>
    <role rolename="admin-gui"/>
    <user username="tomcat" password="asd123" roles="manager-gui"/>
</tomcat-users>

在我的Dockerfile 我这样写:

FROM tomcat:7-jre8-alpine
LABEL maintainer="myemail@myemail.mytld"
EXPOSE 8080
ARG WAR_FILE=target/myappbuilded-0.0.1-SNAPSHOT.war
ARG TOMCAT_USERS_FILE=tomcat-users.xml
ADD $WAR_FILE /usr/local/tomcat/webapps/myappbuilded.war
ADD $TOMCAT_USERS_FILE /usr/local/tomcat/conf
CMD ["catalina.sh", "run"]

在我的pom.xml,我在dependecies添加了这个插件,并在文件顶部添加了名称为packaging的节点

<packaging>war</packaging>
</dependencies>
    ...other dependencies ...
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
  </dependency>
</dependencies>

最后在MySpringBootApp.java,我只是从SpringBootServletInitializer 添加一个扩展,并添加一个覆盖方法configure,文件如下所示:

package myspringbootpackage;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class MySpringBootApp extends SpringBootServletInitializer 


    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 
        return application.sources(MySpringBootApp.class);
    

    public static void main(String[] args) 
        SpringApplication.run(MySpringBootApp.class, args);
    

就是这样!最后我只是通过运行mvn clean package -Dmaven.test.skip=true禁用测试来编译我的应用程序,一旦应用程序被编译到target目录,我就在应用程序目录中使用sudo docker build -t myspringbootappcontainer .编译了docker镜像。最后通过运行sudo docker run -p 5000:8080 myspringbootappcontainer 运行我的容器。就是这样 :) 希望它对其他开发者有最大的帮助 :)

【讨论】:

以上是关于如何从 springboot 应用程序中分离集成的 tomcat的主要内容,如果未能解决你的问题,请参考以下文章

如何从它的消息中分离异常类型

如何使用注释在 testng + maven 中分离单元测试和集成测试?

SpringBoot—集成AOP详解(面向切面编程Aspect)

在 Go 中分离单元测试和集成测试

如何在 cassandra 中将环从集群中分离出来

如何从以编程方式创建的 UITableView 中分离?