SpringBoot分离资源文件打包

简介: SpringBoot分离资源文件打包

Springboot给了我们很多方便,不再需要单独部署一个tomcat,运行起来也很简单。但是对于配置文件因为项目经常修改的时候,却有些不太方便,每次改完配置都得重新打包。这里我也探索了一下将资源包分离的方式,请看下面的具体实现。

方式一、使用maven插件来打包
1.修改pom文件

首先添加几个插件,maven-jar-plugin,maven-dependency-plugin,maven-resources-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖-->
                <includes>
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
                <!--使用外部配置文件,jar包里没有资源文件-->
                <addResources>true</addResources>
                <outputDirectory>${project.build.directory}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <!--<classifier>run</classifier>-->
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                  <!--这里配置MANIFEST.MF文件,添加正确的依赖,Mainclass-->
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <useUniqueVersions>false</useUniqueVersions>
                        <mainClass>com.xxx.StarterApplication</mainClass>
                    </manifest>
                    <manifestEntries>
                        <!--MANIFEST.MF 中 Class-Path 加入资源文件目录-->
                        <Class-Path>./config/</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <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>
                      <!--这里是配置依赖jar包输出目录-->
                        <outputDirectory>
                            ${project.build.directory}/lib/
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <resources>
                          <!--这里是相关配置文件的输出目录,当然你可以过滤一些文件-->
                            <resource>
                                <directory>src/main/resources</directory>
                <!--这里是忽略的文件(类型)-->
                                <!--<excludes>
                                    <exclude>**/*.xml</exclude>
                                </excludes>-->
                                <!--这里是需要导出的文件(类型)-->
                                <!--<includes>
                                    <include>*.properties</include>
                                    <include>*.yml</include>
                                </includes>-->
                            </resource>
                        </resources>
                        <!--输出目录-->
                        <outputDirectory>${project.build.directory}/config</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
2.打包

然后执行mvn clearmvn install或直接mvn clean install,之后可以在target目录看到相应的包和文件

打开config目录看一下

原来resource的配置文件都打包进来了,当然lib也是一样的。

3.执行

可以将这几个目录和文件拷贝出来,然后编写启动脚本

@echo off
java -jar xxx-service.jar

保存为startup.bat,双击文件即可执行.然后可以试着修改一下application.yml的配置再次运行看看效果

方式二、使用assembly插件

1.修改pom文件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <useUniqueVersions>false</useUniqueVersions>
                        <mainClass>com.xxx.StarterApplication</mainClass>
                    </manifest>
                    <manifestEntries>
                        <!--MANIFEST.MF 中 Class-Path 加入资源文件目录-->
                        <Class-Path>./resource/</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <!-- The configuration of the plugin -->
            <configuration>
                <!-- Specifies the configuration file of the assembly plugin -->
                <descriptors>
                    <descriptor>src/main/package.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <resources>
      <!--这里过滤xml文件,比如mybatis等配置还是打进jar包-->
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <!--这里过滤xml文件,比如mybatis等配置还是打进jar包-->
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <!--依赖jar包-->
        <resource>
            <directory>lib/</directory>
            <targetPath>lib</targetPath>
            <includes>
                <include>**/*.jar</include>
            </includes>
        </resource>
    </resources>
</build>
package.xml文件

然后在src/main/目录新建一个package.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>package</id>
    <formats>
      <!--ZIP格式,还可以添加tar.gz等格式-->
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <fileSets>
        <!--*.properties,*.yml配置文件输出到config目录-->
        <fileSet>
            <directory>${project.build.directory}/classes</directory>
            <outputDirectory>config</outputDirectory>
            <includes>
                <include>*.properties</include>
                <include>*.yml</include>
            </includes>
        </fileSet>
        <!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>
2.打包

然后执行mvn clearmvn install或直接mvn clean install,之后可以在target目录看到相应的包和文件

多了一个zip的包,解压出来可以看到

config目录里面的文件结构

3.执行
@echo off
java -jar xxx-service.jar --spring.config.location=config/application.yml

保存为startup.bat,试着修改一下application.yml的配置再次运行看看效果


参考:

https://www.jianshu.com/p/dbdece9062b3

https://blog.csdn.net/u013314786/article/details/81120240


2020-11-05 补充

一个项目一个jar包的配置

<build>
  <plugins>
      <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
         <version>2.2.6.RELEASE</version>
         <configuration>
             <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
         </configuration>
         <executions>
            <execution>
                <goals>
                  <goal>repackage</goal>
                </goals>
            </execution>
         </executions>
      </plugin>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.1.0</version>
          <configuration>
              <failOnMissingWebXml>false</failOnMissingWebXml>
              <warName>${project.artifactId}</warName>
          </configuration>
      </plugin>
  </plugins>
  <finalName>${project.artifactId}</finalName>
</build>
相关文章
|
8月前
|
XML Java 应用服务中间件
SpringBoot-打包&部署
SpringBoot 项目支持两种打包方式:WAR 包和 JAR 包。JAR 包内置 Tomcat,可直接运行;WAR 包需部署在外部 Tomcat 上。JAR 包通过 `mvn clean package` 打包并用 `java -jar` 运行,支持后台运行和 JVM 参数配置。WAR 包需修改 pom.xml 为 war 类型,移除嵌入式 Tomcat 依赖,添加 servlet-api,并继承 `SpringBootServletInitializer`。配置文件可通过外部 application.yml 覆盖,默认优先级高于 JAR 内部配置。
610 17
SpringBoot-打包&部署
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
944 1
|
8月前
|
Java 应用服务中间件 Maven
SpringBoot项目打包成war包
通过上述步骤,我们成功地将一个Spring Boot应用打包成WAR文件,并部署到外部的Tomcat服务器中。这种方式适用于需要与传统Servlet容器集成的场景。
669 8
|
9月前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
227 10
|
9月前
|
Java 应用服务中间件
SpringBoot工程打包部署
SpringBoot工程打包部署简介:SpringBoot项目可通过三种方式运行:可执行Jar包、可执行War包和标准War包。其中,可执行Jar/War包可独立运行,标准War包需部署在Tomcat中。具体步骤包括:1. 修改pom.xml添加构建依赖;2. 执行`mvn clean package`命令打包;3. 运行生成的Jar/War包(如`java -jar xxx.jar`)。对于标准War包,还需修改启动类并配置Tomcat依赖。
460 7
|
11月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
372 1
|
Java Docker 微服务
SpringBoot微服务打包Docker镜像
SpringBoot微服务打包Docker镜像
624 11
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
1021 0
|
Java 应用服务中间件 Maven
SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案
SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案
1009 0
|
监控 数据可视化 Java
springBoot:actuator&admin 图形可视化&spring 打包 (七)
本文介绍了Spring Boot Actuator及其图形化管理界面Spring Boot Admin的使用方法,包括依赖导入、服务端与客户端配置、以及如何打包为JAR和WAR文件并部署。通过这些步骤,可以实现应用的监控和管理功能。
524 0

热门文章

最新文章