1. 程式人生 > >當執行mvn package的時候,maven是怎麼打包的

當執行mvn package的時候,maven是怎麼打包的

為了優化需要,我需要看一下我的maven專案(一個java服務)在打包的時候是如何把專案打包成一個tar.gz包的,gz包裡的各個檔案又是哪來的。
也就是說,我需要知道maven是怎麼把專案從這樣:

變成這樣的:

我的工程是有一個父模組三個子模組的java服務,用maven管理相關的依賴。
mvn package命令打成的gz包有app、bin、conf、lib四個資料夾:
  • bin裡面有一堆指令碼,啟動、停止之類的。我最想弄明白的其實就是這裡面的指令碼是怎麼生成的,現在遇到的優化專案就需要調整這裡面的啟動指令碼。
  • conf裡是一堆配置檔案。
  • lib裡是所有相關的jar包。

探尋過程

一,pom檔案

在父模組的pom檔案裡,我找到了maven的打包外掛:

<plugin>
	<groupId>com.dangdang</groupId>
	<artifactId>dd-assembly-plugin</artifactId>
	<version>2.0.1</version>
</plugin>

在子模組tms-bms-bootstrap的pom檔案裡,我找到了使用父模組打包外掛的程式碼:

<plugin>
    <groupId>com.dangdang</groupId>
    <artifactId>dd-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>assembly</goal>
            </goals>
        </execution>
    </executions>
</plugin>


二,maven打包外掛

在我本地的maven倉庫中,根據pom檔案裡配置的groupId、artifactId和version組成的路徑:com\dangdang\dd-assembly-plugin\2.0.1找到了dd-assembly-plugin-2.0.1.jar。
dd-assembly-plugin-2.0.1.jar是maven的打包外掛,和maven自己的打包外掛名字不一樣,因為這個屬於公司框架,是在那基礎上改過的,這個jar包的結構是這樣的:

三,打包外掛的配置檔案

在assemblies目錄下有dd-frame-assemby.xml(不一定非要叫這麼個名字),是打包的描述檔案,這個檔案描述了在打包的時候maven會怎樣操作,是maven打包外掛的關鍵配置,這個檔案的內容如下:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 
                        http://maven.apache.org/xsd/assembly-1.1.2.xsd" >
    <id>assembly</id>
    <formats>
        <format>tar.gz</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>classpath:assemblies/bin/properties/jmx_config</directory>
            <outputDirectory>bin/properties/jmx_config</outputDirectory>
            <includes>
                <include>jmxremote.password</include>
            </includes>
            <fileMode>0600</fileMode>
        </fileSet>
        <fileSet>
            <directory>classpath:assemblies/bin</directory>
            <outputDirectory>bin</outputDirectory>
            <fileMode>0755</fileMode>
        </fileSet>
        <fileSet>
            <directory>classpath:assemblies/app</directory>
            <outputDirectory>app</outputDirectory>
            <fileMode>0644</fileMode>
        </fileSet>
        <fileSet>
            <directory>classpath:assemblies/conf</directory>
            <outputDirectory>conf</outputDirectory>
            <fileMode>0644</fileMode>
        </fileSet>
        <fileSet>
            <directory>src/main/resources/conf</directory>
            <includes>
                <include>*.properties</include>
                <include>*/*.properties</include>
                <include>logback.xml</include>
            </includes>
            <excludes>
                <exclude>*.private.properties</exclude>
                <exclude>*/*.private.properties</exclude>
            </excludes>
            <outputDirectory>conf</outputDirectory>
            <fileMode>0644</fileMode>
        </fileSet>
    </fileSets>
    
    <dependencySets>
        <!-- copy all dd-frame and third party jars to lib folder. -->
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <excludes>
                <exclude>com.dangdang:*</exclude>
                <exclude>com.dang:*</exclude>
            </excludes>
        </dependencySet>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <includes>
                <include>com.dangdang:apimonitor</include>
                <include>com.dangdang:ddschedule</include>
                <include>com.dangdang:dd-assembly-plugin</include>
                <include>com.dangdang:dd-common</include>
                <include>com.dangdang:dd-container</include>
                <include>com.dangdang:dd-soa</include>
                <include>com.dangdang:dd-job</include>
                <include>com.dangdang:dd-job-tbschedule</include>
                <include>com.dangdang:dd-rdb</include>
                <include>com.dangdang:dd-reg</include>
                <include>com.dangdang:dd-log</include>
                <include>com.dangdang:dd-web</include>
                <include>com.dangdang:dd-test</include>
                <include>com.dangdang:dd-package</include>
                <include>com.dangdang:elastic-job-core</include>
                <include>com.dangdang:elastic-job-spring</include>
            </includes>
            <fileMode>0644</fileMode>
        </dependencySet>
        
        <!-- copy all dangdang jars to app folder. -->
        <dependencySet>
            <outputDirectory>app</outputDirectory>
            <includes>
                <include>com.dangdang:*</include>
                <include>com.dang:*</include>
            </includes>
            <excludes>
                <exclude>com.dangdang:apimonitor</exclude>
                <exclude>com.dangdang:ddschedule</exclude>
                <exclude>com.dangdang:dd-assembly-plugin</exclude>
                <exclude>com.dangdang:dd-common</exclude>
                <exclude>com.dangdang:dd-container</exclude>
                <exclude>com.dangdang:dd-soa</exclude>
                <exclude>com.dangdang:dd-job</exclude>
                <exclude>com.dangdang:dd-job-tbschedule</exclude>
                <exclude>com.dangdang:dd-rdb</exclude>
                <exclude>com.dangdang:dd-reg</exclude>
                <exclude>com.dangdang:dd-log</exclude>
                <exclude>com.dangdang:dd-web</exclude>
                <exclude>com.dangdang:dd-test</exclude>
                <exclude>com.dangdang:dd-package</exclude>
                <exclude>com.dangdang:elastic-job-core</exclude>
                <exclude>com.dangdang:elastic-job-spring</exclude>
            </excludes>
            <fileMode>0644</fileMode>
        </dependencySet>
        
        <!-- 
            Copy all dangdang jar's '*.properties' and profiles's '*.properties' to conf folder, exclude '*.private.properties'.
        -->
        <dependencySet>
            <includes>
                <include>com.dangdang:*</include>
                <include>com.dang:*</include>
            </includes>
            <excludes>
                <exclude>com.dangdang:apimonitor</exclude>
                <exclude>com.dangdang:ddschedule</exclude>
                <exclude>com.dangdang:dd-assembly-plugin</exclude>
                <exclude>com.dangdang:dd-common</exclude>
                <exclude>com.dangdang:dd-container</exclude>
                <exclude>com.dangdang:dd-soa</exclude>
                <exclude>com.dangdang:dd-job</exclude>
                <exclude>com.dangdang:dd-job-tbschedule</exclude>
                <exclude>com.dangdang:dd-rdb</exclude>
                <exclude>com.dangdang:dd-reg</exclude>
                <exclude>com.dangdang:dd-log</exclude>
                <exclude>com.dangdang:dd-web</exclude>
                <exclude>com.dangdang:dd-test</exclude>
                <exclude>com.dangdang:dd-package</exclude>
                <exclude>com.dangdang:elastic-job-core</exclude>
                <exclude>com.dangdang:elastic-job-spring</exclude>
            </excludes>
            <unpack>true</unpack>
            <unpackOptions>
                <includes>
                    <include>conf/*.properties</include>
                    <include>conf/*/*.properties</include>
                    <include>conf/logback.xml</include>
                    <include>conf/includedLogbackConfig.xml</include>
                </includes>
                <excludes>
                    <exclude>conf/*.private.properties</exclude>
                    <exclude>conf/*/*.private.properties</exclude>
                </excludes>
            </unpackOptions>
            <fileMode>0644</fileMode>
        </dependencySet>
        <!-- 
            If app jar does not have includedLogbackConfig.xml, copy default includedLogbackConfig.xml to conf folder. For ddframe package only.
        -->
        <dependencySet>
            <includes>
                <include>com.dangdang:dd-log</include>
            </includes>
            <unpack>true</unpack>
            <unpackOptions>
                <includes>
                    <include>includedLogbackConfig.xml</include>
                </includes>
            </unpackOptions>
            <fileMode>0644</fileMode>
            <outputDirectory>conf/</outputDirectory>
        </dependencySet>
    </dependencySets>
</assembly>


對這個檔案的部分內容說明如下:
  • <formats>表示打包後的檔案格式,現在寫的tar.gz就表示打包後會生成一個xxx.tar.gz的壓縮包,還可以設定為war什麼的。
  • <fileSets>表示要生成的包下有什麼目錄,目錄裡有哪些檔案,多個目錄可以用多個<fileSet>標籤來表示。
  • <fileSets>標籤下的<directory>表示從哪個目錄獲取檔案,classpath:xxxx表示從打包外掛的jar包中獲取檔案,比如20行的<directory>classpath:assemblies/bin</directory>(打包後的bin目錄下的指令碼就來自這裡,我的目的達到了),而35行的<directory>src/main/resources/conf</directory>代表從專案路徑中獲取檔案。
  • <fileSet>標籤下的<includes>代表了那些檔案要被打包,<excludes>標籤功能相反,代表哪些檔案在打包時將被忽略。
  • <fileSet>標籤下的<outputDirectory>代表了將要生成的包下的目錄名字,比如打包後生成tar.gz包裡有bin目錄,就是用這個標籤設定的。
  • <fileSet>標籤下的<fileMode>可能是目錄許可權,我不太確定。
  • <dependencySets>標籤代表了專案的maven依賴的jar包的處理方式,以及這些jar包將要被放到目標的那個目錄下,多個目錄可以用多個<dependencySet>標籤來表示。
  • <dependencySet>下的<outputDirectory>功能和<fileSet>下的同名標籤功能相同,指定了目標路徑。
  • <dependencySet>下的<includes>功能和<fileSet>下的同名標籤功能相同,指定了哪些jar包將被放入目標目錄。
  • <dependencySet>下的<excludes>功能和<fileSet>下的同名標籤功能相同,指定了哪些jar包將被忽略。

maven打包外掛的這個配置檔案其實實現了更多的功能,使用者可以自行配置,我只研究到這裡,大概就可以知道maven打包的時候都是按照什麼規則進行的。

相關推薦

執行mvn package的時候maven是怎麼打包

為了優化需要,我需要看一下我的maven專案(一個java服務)在打包的時候是如何把專案打包成一個tar.gz包的,gz包裡的各個檔案又是哪來的。 也就是說,我需要知道maven是怎麼把專案從這樣: 變成這樣的: 我的工程是有一個父模組三個子模組的java服務,用maven

maven將專案達成jar包並執行mvn packagejava -jar 專案jar包

一、使用mvn package命令打包 yaomingyangdeMacBook-Pro:ggauthority yaomingyang$ mvn package [INFO] Scanning for projects... [INFO]

Spring-boot構建多模組依賴工程時maven打包異常:程式包xxx不存在

在qizhi專案改版的時候, 所有程式碼都遷移好了, 但是compile的時候報程式包*****不存在, 具體到某一個類就是: 找不到符號. 下面這篇文章是正解 http://hbxflihua.iteye.com/blog/2431537 具體內容如下: =======================

Spring-boot構建多模塊依賴工程時maven打包異常:程序包xxx不存在

core 核心 === 指定 apach 模塊 spring plugin fig 在qizhi項目改版的時候, 所有代碼都遷移好了, 但是compile的時候報程序包*****不存在, 具體到某一個類就是: 找不到符號. 下面這篇文章是正解 http://hbxflihu

SpringBoot異常:IDEA+SpringBoot+Mybatis使用generatorConfig.xml生成xmlMaven打包異常

IDEA+SpringBoot+Mybatis專案,使用generatorConfig.xml生成xml在Maven打包的時候出現異常在maven package打包時,竟然運行了generatorConfig.xml,把已經修改的java類和xml原件覆蓋掉了,導致問題出現

idea在執行時正常打包成一個jar執行檔案時出現Could not load JNR C Library問題

在通過java連線cassandra時,其中com.datastax.driver.core是通過maven加入的,通過Idea執行時是正常的,在匯出jar時如果不是將所有的jar打包成一個jar時也是正常的,但是如果將所有的第三方打包成jar,則會出現如下錯誤: 17:3

ideamaven打包spark程式(scala)的jar檔案

1.new-->project--->maven 填入GroupId和ArtifactId(相當於給你的專案起名字) 2.在pom.xml中<project>標籤中建立</dependencies>標籤 3.在http://mvnr

Jenkins Android APP 持續整合體系建設二—自動部署、執行測試任務關聯打包任務

經過上一遍部落格我們知道了怎麼使用Jenkins自動打包,但打完包之後,我們還需要對新包進行迴歸測試,確定新包有沒有問題,然後才能釋出包,那麼,話不多說,我們先來新建個自動化迴歸測試任務 #新包自動化迴歸任務 ##1、新建一個測試新包的專案 ![](https://img2020.cnblogs.com/bl

maven打包後flash檔案變大無法正常執行

最近一個老專案重構,前臺使用了swfupload來實現多檔案上傳,這是一個用flash實現的外掛。 開發階段,打包測試時均無問題。測試階段,在伺服器部署後,該外掛就莫名失效了。 經過排查最終確認是maven打測試包時,加上了資源過濾導致swfupload.swf檔案變大。  

Maven打包Java版的spark程式到jar包本地Windows測試上傳到叢集中執行

作者:翁鬆秀 Maven打包Java版的spark程式到jar包,本地Windows測試,上傳到叢集中執行 文章目錄 Maven打包Java版的spark程式到jar包,本地Windows測試,上傳到叢集中執行 Step1

maven 打包web專案成jar 可放在伺服器上執行

1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation

在 Jenkins 中使用 maven 打包package xxx does not exist 問題的解決方法

1 發現問題 今天打算使用 Jenkins 給一些舊專案打包,編譯時報以下錯誤: ... [ERROR] /var/lib/jenkins/workspace/fsti-pipe/src/main/java/com/fsti/oss/service/sy

安裝Maven,執行mvn -v後出現 Error: JAVA_HOME is set to an invalid directory.(圖片可能太大無法顯示有時間再上傳)

問題: 1.看到這個有點懵逼,剛開始以為是JDK是不是出問題了。所以: 恩,沒問題。繼續想,既然報錯了就去找這個maven的bin目錄下都有啥,cmd開啟的,自然看這個: 既然是JAVA_HOM

非web專案maven工程整合spring+mabits打包為可執行jar包

廢話不多說,直接開幹吧。 spring和mybatis如何整合這裡就不多說了,主要說如何在非web專案中用到這兩種,其中主要用到了 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String

利用MAVEN打包執行jar包包括依賴的第三方包

看下專案pom.xml的配置,首先要配置maven-jar-plugin,把自己的程式碼編譯打包成jar檔案,然後配置maven-assembly-plugin,把整個專案打包成一個釋出包。 Xml程式碼  收藏程式碼 <build>       <pl

Jenkins 通過maven打包發現resource下的properties 配置檔案未生成 導致在執行時報錯

場景: Jenkins 構建WebDriver 專案時,報如下圖錯誤: idea 執行時是沒問題的,經過對比發現是因為Jenkins構建時,發現resource下的properties 配置檔案未生成,找到不所以才提示錯誤 解決方法: 程式碼路徑: 在pom.x

maven建立專案執行到Choose a number or apply filter :敲入回車後不出現list的問題

問題描述: 用maven建立專案, 敲入mvn archetype:generate, 當執行到Choose a number or apply filter (format: [groupId:

maven打包pom.xml配置mvn命令另附常用清除lastUpdated檔案的指令碼

<build><plugins><!-- compiler外掛, 設定JDK版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-

安裝maven執行mvn help:system報Non-parseable錯誤

不bb,原因是你在匯入本地倉庫之後加了</settings>,如:<localRepository>F:\soft\m2\repository</localReposit

maven打包成jar並排除指定文件

pat addclass fig ani logs archive exc arc mave maven打包成jar,配置如下 <plugin> <groupId>org.apache.maven.plugins