Spring Boot 应用的打包和发布
Posted _kairui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 应用的打包和发布相关的知识,希望对你有一定的参考价值。
1. 创建项目(example-fast)
基于 Spring Boot 创建一个 WEB 项目 example-fast。
2. 编译打包
2.1 采用 IDEA 集成的 Maven 环境来对 Spring Boot 项目编译打包,可谓是超级 easy
2.2 mvn 命令打包
# mvn clean 清理编译
# install 打包
# -Dmaven.test.skip=true 跳过单元测试
# -P dev 指定dev配置
mvn clean install -Dmaven.test.skip=true -P dev
3. 应用发布
3.1 一行命令的演化
运行 Spring Boot 打包之后的 jar 方式也简单,只需一行命令就行。
java -jar /usr/local/example-fast-1.0.0.jar
此时,服务是启动了,但是不能关闭这个窗口,一旦关闭服务就停止了,不得不考虑后台运行,并且还想看日志;
java -jar /usr/local/example-fast-1.0.0.jar > example-fast.out &
执行启动时,效果如下,然后就可以轻松看日志输出了。
如果项目组中你既是研发又充当运维的角色,到这基本就完事儿了,因为相信通过熟练操作,会形成肌肉反应,你肯定能记住这一行命令。
不过,若是分工明确,生产权限隔离的话,一般都是运维同事来操作发布,所以还得想办法让运维同事省力,不得不考虑脚本化。
首先创建项目目录例如 example-fast,然后分别创建 bin、lib、logs 目录;把 example-fast-0.0.1-SNAPSHOT.jar 拷贝至 lib 目录下;bin 目录主要存放脚本。创建 start.sh 应用启动脚本; stop.sh 应用停止脚本
启动脚本(start.sh)
#!/bin/bash
#配置 Java 环境变量
export JAVA_HOME=/usr/local/java/jdk/jdk1.8.0_231
export PATH=.:$JAVA_HOME/bin:$PATH
#定义应用名
App_Name=example-fast
#定义应用所在目录
App_Path=/home/$App_Name
#定义可执行文件的路径
JAR_PATH=$App_Path/example-fast-1.0.0.jar
#jvm启动参数
JAVA_OPTS="-Duser.timezone=GMT+8 -server -Xms4096m -Xmx4096m -XX:MaxMetaspaceSize=256m -Xloggc:$App_Path/logs/$App_Name.gc.log -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5 -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime"
#启动JAVA进程函数
CURRENT_COUNT=`ps -ef|grep java |grep $App_Name |grep -vc grep`
if [ $CURRENT_COUNT -eq 0 ]
then
Log_Name=$(echo $App_Name|awk -F"-" ' print $NF ')
nohup java -Dfunc_type=$App_Name $JAVA_OPTS -Dfile.encoding=utf-8 -jar $JAR_PATH > $App_Path/logs/$App_Name.out 2>&1 &
PROCESS_ID=`ps -ef | grep "$App_Name" |grep -v grep | awk ' print $2 '`
echo " ☺☺☺☺☺启动应用 $App_Name 成功,进程 id 为 $PROCESS_ID ☺☺☺☺☺ "
else
echo " ☺☺☺☺☺ 应用 $App_Name 已经被启动了 ☺☺☺☺☺ "
fi
# 执行应用启动 start.sh
sh start.sh
停止脚本(stop.sh)
#!/bin/bash
# 定义应用名称
App_Name=example-fast
# 停止JAVA进程函数
echo " ☺☺☺☺☺ 开始停止 $App_Name 应用 ☺☺☺☺☺ "
ps -ef | grep $App_Name | grep -v grep | awk 'print$2' | xargs kill
echo " ☺☺☺☺☺ 应用 $App_Name 停止成功!☺☺☺☺☺ "
# 执行应用停止 stop.sh
sh stop.sh
至此,Spring Boot 项目最基本的发布方式就完事了,可以直接执行脚本完成项目的启动和停止,操作更简单了!
打包一个包含 JSP 和静态资源的 Spring Boot 应用程序
【中文标题】打包一个包含 JSP 和静态资源的 Spring Boot 应用程序【英文标题】:Package a spring boot application including JSPs and static resources 【发布时间】:2014-04-03 00:49:50 【问题描述】:我想将 spring-boot 应用程序打包为 jar,我使用 mvn package
进行此操作。
这会生成一个不包含任何/WEB-INF/jsp
或/src/main/webapp/resources
的jar。
如何确保我的 jar 包含所需的一切?
这里是我当前的pom.xml
:
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-samples</artifactId>
<version>1.0.0.RC3</version>
</parent>
<packaging>jar</packaging>
<properties>
<main.basedir>$basedir/../..</main.basedir>
<m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
</properties>
<dependencies>
<dependency>
<groupId>$project.groupId</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>$project.groupId</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1101-jdbc41</version>
</dependency>
</dependencies>
<!-- Package as an executable JAR -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
<!-- Allow access to Spring milestones and snapshots -->
<!-- (you don't need this if you are using anything after 1.0.0.RELEASE) -->
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
<artifactId>com.example.app</artifactId>
【问题讨论】:
【参考方案1】:你有什么理由不能使用战争包装类型吗? https://maven.apache.org/plugins/maven-war-plugin/usage.html 我建议使用 war 打包类型并使用默认的 maven web-application 结构。
如果你真的想为你的 webapp 使用 jar 插件,你需要为你的项目配置它。由于您的帖子,我不了解您的结构,无法给您举个例子。 jar插件的使用在这里查看:https://maven.apache.org/plugins/maven-war-plugin/usage.html
【讨论】:
您需要使用战争包装,否则一切看起来都很正常。请参阅 JSP 限制中的 docs。 我尝试过使用战争包装,它可以工作。 java -jar myfile.war 看起来有点奇怪,但它确实有效。谢谢!【参考方案2】:要使用 Spring Boot 创建可运行的 JAR,请在 pom.xml 中使用 spring-boot-maven-plugin
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
也许你想看看我的示例应用程序http://info.michael-simons.eu/2014/02/20/developing-a-web-application-with-spring-boot-angularjs-and-java-8/(源代码在 GitHub 上,应用程序是实时的并从 JAR 运行)。
您应该注意的一件事:由于一些嵌入式 Tomcat 问题,来自 JAR 的 JSP 不起作用。我正在使用百里香叶。如果您需要 JSP,请继续使用 WAR 部署。
【讨论】:
【参考方案3】:以下示例适用于 Spring Boot 1.3.3.RELEASE:
https://github.com/ghillert/spring-boot-jsp-demo
关键是将静态jsp内容放入:
/src/main/resources/META-INF/resources/WEB-INF/jsp
并确保在 application.properties 中定义视图前缀/后缀:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
【讨论】:
为什么没有教程提到这个?【参考方案4】:将您的构建标签更改为
<build>
<resources>
<resource>
<directory>$basedir/src/main/webapp</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>$basedir/src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
</build>
【讨论】:
【参考方案5】:我遇到了和你一样的问题。我尝试了上面您标记为正确的答案,但它对我不起作用。
这有效...将 pom.xml 更改为...
<packaging>war</packaging>
...这将导致 maven 创建一个可执行的 WAR 文件,如下所示...
java -jar yourwarfile.war
我在这里找到了这个类似问题的解决方案...
WEB-INF not included in WebApp using SpringBoot, Spring-MVC and Maven
【讨论】:
以上是关于Spring Boot 应用的打包和发布的主要内容,如果未能解决你的问题,请参考以下文章
springboot2.0+dubbo-spring-boot-starter聚合项目打可执行的jar包
为啥我的idea中没有sping boot 1.5.7的版本