當執行mvn package的時候,maven是怎麼打包的
也就是說,我需要知道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 package,java -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生成xml,Maven打包異常
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
idea,maven打包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