此種方式可避免resource節點對compile階段的影響,compile階段會讀取resource節點的信息但是不會讀取assembly的配置文件
1. pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.skd</groupId> <artifactId>client</artifactId> <version>1.0</version> <name>client</name> <description>client for file monitor</description> <properties> <encoding>UTF-8</encoding> <maven-compiler-plugin-version>3.8.0</maven-compiler-plugin-version> <maven-jar-plugin-version>3.1.0</maven-jar-plugin-version> <maven-source-plugin-version>3.0.1</maven-source-plugin-version> <maven-assembly-plugin-version>3.1.0</maven-assembly-plugin-version> <maven-dependency-plugin-version>3.1.0</maven-dependency-plugin-version> <maven-resources-plugin-version>3.1.0</maven-resources-plugin-version> </properties> <dependencies> <!--spring boot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!--test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--log4j2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!--http client--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!--json--> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.2.2</version> <classifier>jdk15</classifier> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--configuration--> <!-- 通過資源文件注入屬性配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <!-- 生成的項目壓縮包的名字--> <finalName>client</finalName> <!--源代碼路徑--> <sourceDirectory>src/main/java</sourceDirectory> <!--maven-resources-plugin 插件打包resource文件時會參考此節點的配置--> <plugins> <!--編譯插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin-version}</version> <configuration> <encoding>${encoding}</encoding> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <!--將項目的源代碼的class文件打包到一個jar包--> <!--jar包默認在target目錄下--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>${maven-jar-plugin-version}</version> <configuration> <archive> <!-- 生成的jar中,不要包含pom.xml和pom.properties這兩個文件 --> <addMavenDescriptor>true</addMavenDescriptor> <manifest> <!-- 是否要把第三方jar放到manifest的classpath中 --> <addClasspath>true</addClasspath> <!-- 生成的manifest中classpath的前綴,填寫依賴jar包相對於項目jar包的路徑--> <!--我會把項目的jar包也打到lib目錄下,所以這里使用當前目錄--> <classpathPrefix>./</classpathPrefix> <!-- 應用的main class --> <mainClass>com.skd.client.ClientApplication</mainClass> </manifest> <!--將資源文件目錄添加到classpath中,打包后運行項目時則會在該目錄下加載配置文件--> <manifestEntries> <!--填寫配置文件相對於項目jar包的路徑--> <!--我的項目jar包在lib目錄下,配置文件在和lib同級的conf目錄下--> <Class-Path>../conf/</Class-Path> </manifestEntries> </archive> <!--項目打包為jar包時排除這些文件,如果將配置文件打到jar包,則會優先讀取jar包中的配置文件,不會讀取conf目錄下的配置文件--> <!--注意這玩意從編譯結果目錄開始算目錄結構--> <excludes> <exclude>/*.yaml</exclude> <exclude>/*.yml</exclude> <exclude>/*.xml</exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>${maven-assembly-plugin-version}</version> <configuration> <!--jar包名字是否在finalName后追加AssemblyId--> <appendAssemblyId>true</appendAssemblyId> <descriptors> <!--xml文件中配置了打包的相關配置--> <descriptor>src/main/assembly/assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <!--名字任意--> <id>make-assembly</id> <!-- 綁定到package生命周期階段上 --> <phase>package</phase> <goals> <!-- 只運行一次 --> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
2. assembly的xml配置文件
<assembly > <!--此處是打包名稱的設置,最后是會生成一個finalName-id.format 文件在目錄 target下--> <!--appendAssemblyId為false時則壓縮包名稱不追加id,默認下追加--> <id>assembly</id> <!-- 最終打包成一個用於發布的zip文件 --> <formats> <format>tar.gz</format> </formats> <dependencySets> <dependencySet> <!--是否將項目jar包打包到指定目錄--> <useProjectArtifact>true</useProjectArtifact> <!--將依賴jar包打到lib目錄--> <outputDirectory>lib</outputDirectory> <!--將依賴jar包不解壓直接打包到目錄--> <unpack>false</unpack> </dependencySet> </dependencySets> <fileSets> <!--通過fileSet節點可以將制定目錄的指定文件打包到壓縮文件的制定目錄--> <fileSet> <!-- 把項目的配置文件,打包到壓縮文件的conf目錄 --> <directory>${project.basedir}/src/main/resources</directory> <outputDirectory>conf</outputDirectory> </fileSet> <!--打包腳本文件到根目錄--> <fileSet> <directory>${project.basedir}/src/main/bin</directory> <outputDirectory>/</outputDirectory> </fileSet> </fileSets> </assembly>
3. 打包后的 target 目錄結構
解壓后目錄結構如下:
項目jar包在lib目中中
4. 運行項目
啟動腳本
執行啟動腳本