叶子的博客   Java/Ruby/PHP/JS

遇到问题时冷静对待,这或许不能解决问题
但能使你收获更多

springboot用maven打独立应用的jar包

如果用过spring boot的都知道,其引入了嵌入式web容器运行的。但是如果打包成jar包,方便是方便,但是无法通过修改配置文件–重启应用就达到想要的效果,必须又要重新打一个jar包。而lib依赖也是如此,很多时候都可以不变的,没必要发布都要打包吧。 以下内容你将会学到如何利用maven插件构建独立jar包,发布应用到正式环境的流程。

这里会使用到maven,如果不熟识的自行先去补习以下:)
假设你已经有了spring boot应用,你就可以执行以下操作

第一步:修改pom配置

我继续使用动态构建目标环境的配置,如果不熟识,可以先去maven构建不同环境读取不同的配置文件看看复习一下

配置部分:

<profiles>
        <!-- 开发环境,默认激活 -->
        <profile>
            <id>dev</id>
            <properties>
                <env>dev</env>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!-- 正服 -->
        <profile>
            <id>product</id>
            <properties>
                <env>product</env>
            </properties>
        </profile>
</profiles>
<build>
<resources>
            <resource>
                <directory>${project.basedir}/src/main/resources/${env}</directory>
                <includes>
                    <include>application.properties</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
        <sourceDirectory>src/main/java</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <!-- 加载的class目录的前缀(依赖的jar目录) -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!-- 入口 -->
                            <mainClass>com.test.jpa.ApiService</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!-- 把依赖的jar包拷到lib目录下 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <encoding>UTF-8</encoding>
                            <!-- 把配置文件拷到和jar包同一个路径下 -->
                            <outputDirectory>${project.build.directory}</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>src/main/resources/${env}/</directory>
                                    <includes>
                                        <include>application.properties</include>
                                    </includes>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 打jar包时需要把配置文件给排除在外 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <classifier>${env}</classifier>
                            <excludes>
                                <exclude>application.properties</exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

我没有copy模块名称和依赖的配置,因为各有各不同。 其中大家可以留意

<id>copy-resources</id>
<phase>package</phase>
<goals>
    <goal>copy-resources</goal>
</goals>
<configuration>
    <encoding>UTF-8</encoding>
    <!-- 把配置文件拷到和jar包同一个路径下 -->
    <outputDirectory>${project.build.directory}</outputDirectory>
    <resources>
        <resource>
            <directory>src/main/resources/${env}/</directory>
            <includes>
                <include>application.properties</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</configuration>

这个是重点,把配置文件copy到jar包同级目录,并且指定outputDirectory是读取同级目录的配置文件为springboot的自身配置。lib依赖包同理,我就不多说了。

第二步:执行maven命令

读过我那篇maven不同环境配置都知道,maven打包命令应该是:

mvn clean package -P${env}

假设我要发布一个正式环境的jar包,那应该就是:

mvn clean package -Pproduct

ok,执行完命令之后,去程序目录的target里面看看是否已经生产了配置文件,jar包,还有lib依赖文件夹? 因为方便区别,我特意把包的别名改成环境的别名,留意这一段:

<configuration>
  <classifier>${env}</classifier>
    <excludes>
        <exclude>application.properties</exclude>
    </excludes>
</configuration>

这样打出来的包名为:xxx-1.0-SNAPSHOT-product.jar

第三步:执行命令并修改配置重启

各位应该都跃跃欲试了,到这一步就可以执行命令来看看是否成功。

java -jar xxx-1.0-SNAPSHOT-product.jar

如果启动没问题,就说明lib依赖和配置文件能够正确读取,jar应用正确分离出来了。 这样,小伙伴们就能随便修改配置文件而不需要重新打包啦:-)

那如果更新到外网,那我们就可以区分多种更新了。 1.更新应用代码,也就是jar包,重启。 2.只更新配置文件,重启。

这样问题就来了?如何才能更加方便自己去发布不同地址服务器,并执行停止,启动或重启动作呢? 这样的话,就要用到shell脚本了。编写这样的脚本,发布动作就变得异常简单。欲知如何编写?叶子下回分解