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的版本

将 Spring Boot Web 和 Batch 应用程序打包在一起以进行 PCF 部署

将初始数据导入 Spring Boot 应用程序

我可以在 Spring Boot 应用程序中运行长任务吗?

为什么使用 Spring Boot?