War 包部署到外部 Tomcat
Tomcat 是一个免费开源的 Java Web 应用服务器,实现了 Java Servlet 和 JavaServer Pages 规范,属于轻量级应用服务器,没有商业中间件如 Weblogic、Websphere 等集群管理能力。在中小型系统被广泛使用,是Java Web开发调试的首选。
将 Springboot 工程使用 War 包方式部署,需要首先调整 pom 文件,将 jar 包改为 war 包,并且添加排除 tomcat 相关的配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| <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 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>jh.yysjzx.patrolselfservice</groupId> <artifactId>patrolselfservice</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>patrolselfservice</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.9</version> </plugin> </plugins> </build> </project>
|
同时需要修改入口类 App.java 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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 ) {
System.out.println( "Hello World!" ); SpringApplication.run(App.class,args); }
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){ return builder.sources(App.class); } }
|
本文选择使用 Docker 运行 Tomcat,使用的 Tomcat 版本为 9.0.31 ,具体的操作过程如下:
1 2 3 4
| # 使用 mvn 生成 war 包 $ mvn package # 将生成的 war 包考入一个目录,把这个目录映射为容器 tomcat 的 webapps 目录 $ docker run --rm --name my_tomcat -p 8080:8080 -v /docker-conf/tomcat/data:/usr/local/tomcat/webapps/ tomcat:9.0.31
|
容器启动后通过 http://localhost:8080/war 包名称 可以访问 springboot 应用。
Docker 方式部署
可以将我们之前编写的简单 springboot 应用程序构建为一个应用镜像,这种部署方式需要有容器环境。采用这种方式将为运维人员提供很好的操作管理能力。
将之前打包生成的 springboot jar 文件拷贝入一个空白的文件夹,并创建一个 Dockerfile,Dockerfile 的具体内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
MAINTAINER cocowool<cocowool@qq.com>
VOLUME /tmp
ADD patrolselfservice-1.0-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar", "-Djava.security.egd=file:/dev/./urandom", "--spring.profiles.active=test", "--server.port=8080", "> /log/app.log"]
|
确认一下目录结构
1 2 3 4
| $ ls -lh total 34488 -rw-r--r-- 1 shiqiang staff 561B Nov 19 21:40 Dockerfile -rw-r--r-- 1 shiqiang staff 17M Nov 18 16:01 patrolselfservice-1.0-SNAPSHOT.jar
|
然后执行镜像创建的命令 docker build -t springbootapp:0.0.1 .
。等命令执行结束后,就可以使用 docker 运行自己的 springboot 应用。
1
| $ docker run --rm --name my_springboot -p 8080:8080 springbootapp:0.0.1
|
参考资料
- Tomcat
- 从源码理解SpringBootServletInitializer的作用
- 使用 Docker 部署 Tomcat
- https://blog.csdn.net/prxhlirr/article/details/126398361