springboot 项目 配置文件打包到jar外部 -- 代码和依赖jar包分开打包

pom打包插件需要如下  pom详解

 <!-- 打包插件 -->
           <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>
                   <excludes>
                       <exclude>mappers/*.xml</exclude>
                       <exclude>*.xml</exclude>
                       <exclude>*.yml</exclude>
                       <exclude>*.properties</exclude>
                   </excludes>
                   <archive>
                       <manifest>
                           <addClasspath>true</addClasspath>
                           <classpathPrefix></classpathPrefix>
                           <mainClass>com.tgxun.RunApp</mainClass>
                       </manifest>
                   </archive>
                   <!-- <outputDirectory>${project.build.directory}/${自定义software.name}</outputDirectory> -->
               </configuration>
           </plugin>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-assembly-plugin</artifactId>
               <!-- The configuration of the plugin -->
               <configuration>
                   <descriptors>
                       <descriptor>src/main/resources/package.xml</descriptor>
                   </descriptors>
                   <!--<finalName>${project.artifactId}</finalName>-->
               </configuration>
               <executions>
                   <execution>
                       <id>make-assembly</id>
                       <phase>package</phase>
                       <goals>
                           <goal>single</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>

增加配置文件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>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <fileSets>
        <!-- 把项目相关的说明文件,打包进zip文件的根目录 -->
        <fileSet>
            <directory>${project.basedir}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <!--<include>*.sql</include>-->
                <include>*.bat</include>
                <include>*.md</include>
                <!--<include>README*</include>-->
                <!--<include>LICENSE*</include>-->
                <!--<include>NOTICE*</include>-->
                <!--<include>build.info</include>-->
            </includes>
        </fileSet>

        <fileSet>
            <directory>${project.basedir}/src/main/resources</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>mappers/*.xml</include>
                <include>*.yml</include>
                <include>*.properties</include>
            </includes>
        </fileSet>
        <!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

微服务中配置文件若有@xxx.xxx.xx@的配置没有被替换为值,那么可能是如下原因

1.profile替换在编译阶段完成,完成之后,替换好的文件放在target/classes下面;
2.使用assembly插件打包时,不能再从src/main/resources下查找文件,应该从target/classes下面查找配置文件;

那么package中 配置改变如下

<fileSet>
    <directory>${project.basedir}/target/classes</directory>
    <!--<directory>${project.basedir}/src/main/resources</directory>-->
    <outputDirectory>/</outputDirectory>
    <includes>
        <include>mappers/*.xml</include>
        <include>*.yml</include>
        <include>*.properties</include>
    </includes>
</fileSet>

如果需要将配置文件打包到某个文件夹下,需要注意:

1.项目结构中,将需要打包出来的配置文件放在叫config的文件夹下  resources/config(此步骤可以不要)

2.maven-jar-plugin的excludes 增加<exclude>config/</exclude> 排除打在jar包中(上一步若省略,此处也可省略)

3.package.xml中更改为

<fileSet>
    <directory>${project.basedir}/target/classes/config</directory>
    <!--<directory>${project.basedir}/src/main/resources</directory>-->
    <outputDirectory>/config</outputDirectory> <!-- ${file.separator}config -->
    <includes>
        <!--<include>mappers/*.xml</include>-->
        <include>*.yml</include>
        <include>*.properties</include>
    </includes>
</fileSet>

为什么要叫config文件夹而不是别的名字?

boot读取配置有一个优先级,jar包外面config目录优先级最高,主要是便于从外部修改配置,而不是改jar包中的application.yml文件。优先级如下: 

  • 当前目录的config目录下
  • 当前目录
  • classpath的config目录下
  • classpath的根目录

第一种是在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下; 
第二种是直接把配置文件放到jar包的同级目录; 
第三种在classpath下建一个config文件夹,然后把配置文件放进去; 
第四种是在classpath下直接放配置文件。

代码和依赖jar包分开打包 -- maven-dependency-plugin

<build>==<plugins>注释掉如下

<plugin>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

 

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-dependency-plugin</artifactId>
	<executions>
	 <execution>
	     <id>copy-installed</id>
	     <phase>package</phase>
	     <goals>
	         <goal>copy</goal>
	     </goals>
	     <configuration>
	         <artifactItems>
	             <artifactItem>
	                 <groupId>${project.groupId}</groupId>
	                 <artifactId>${project.artifactId}</artifactId>
	                 <version>${project.version}</version>
	                 <type>${project.packaging}</type>
	             </artifactItem>
	         </artifactItems>
	         <outputDirectory>target/lib</outputDirectory>
	     </configuration>
	 </execution>
	 <execution>
	     <id>copy-lib</id>
	     <phase>prepare-package</phase>
	     <goals>
	         <goal>copy-dependencies</goal>
	     </goals>
	     <configuration>
	         <outputDirectory>${project.build.directory}/lib</outputDirectory>
	         <overWriteReleases>false</overWriteReleases>
	         <overWriteSnapshots>false</overWriteSnapshots>
	         <overWriteIfNewer>true</overWriteIfNewer>
	         <includeScope>compile</includeScope>
	     </configuration>
	 </execution>
	</executions>
</plugin>

配置文件分开打包的另一种方式

归档位jar/zip/tag.gz  依然需要使用 maven-assembly-plugin

<!-- 该插件的作用是用于复制指定的文件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
                <executions>
                    <execution>
                        <!-- 复制配置文件 -->
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>target/classes</directory>
                                    <includes>
                                        <include>application.properties</include>
                                        <include>application-${active}.properties</include>
                                    </includes>
                                    <excludes>
                                        <exclude>banner.txt</exclude>
                                        <exclude>bootstrap.properties</exclude>
                                        <exclude>log4j.properties</exclude>
                                        <exclude>logback-spring.xml</exclude>
                                    </excludes>
                                </resource>
                            </resources>
                            <outputDirectory>
                                ${project.build.directory}/${software.name}/config
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你使用Spring Boot打包项目生成一个包含-SNAPSHOT版本号的JAR(例如 `-SNAPSHOT.jar`)时,通常情况下这个JAR文件会自动包含一个Maven或Gradle的主清单(`Manifest.MF`),该清单包含了应用程序的基本元数据,如主类(Main-Class)等。然而,如果你发现打包后的JAR没有主清单,可能是因为以下原因: 1. **配置问题**:在构建配置(Maven的pom.xml或Gradle的build.gradle)中,没有明确指定主类或者没有正确配置打包行为。检查是否有`<mainClass>`标签在Maven的`<jar>`元素中,或者Gradle的`jar`任务。 2. **插件问题**:某些插件可能没有正确处理打包过程,尤其是对于自定义构建流程的配置,比如使用Spring Boot的插件或第三方构建工具时。 3. **排除清单**:如果你手动排除了主清单文件,或者配置了不包含主清单的打包选项,这可能导致主清单缺失。 4. **IDE构建**:某些IDE(如IntelliJ IDEA)可能会根据项目的设置自动处理打包,如果没有正确配置,也可能会导致缺少主清单。 解决这个问题,你可以按照以下步骤检查: - **检查构建脚本**:确保主类被正确配置,并且没有排除主清单文件。 - **更新插件和配置**:确保使用的构建工具(如Maven或Gradle)和Spring Boot插件是最新的,并且配置正确。 - **重新构建**:尝试清理并重新构建项目,有时IDE缓存的问题可能会导致意外的结果。 - **查看日志**:查找编译或打包过程中可能的错误信息。 相关问题: 1. 如何在Spring Boot的Maven/Gradle配置中添加主清单? 2. 如果主清单不存在,IDE如何手动配置添加主类信息? 3. 如何在打包命令行中确认是否正确指定了主类?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值