maven 打包jar_Maven一定要会的这几个知识!
點擊上方藍字關注我們
作者:CansluckCSDN博客:https://blog.csdn.net/xgx120413
一、Maven概念
? ? ? ? Maven是一個項目管理和整合工具。Maven為開發者提供了一套完整的構建生命周期框架。開發團隊幾乎不用花多少時間就能夠自動完成工程的基礎構建配置,因為Maven使用了一個標準的目錄結構和一個默認的構建生命周期。
? ? ? ??若有多個開發團隊環境的情況下,Maven能夠在很短的時間內使得每項工作都按照標準進行。因為大部分的工程配置都非常簡單且可復用,在創建報告、檢查、構建和測試自動配置時,Maven可以讓開發者的工作變得更簡單。
Maven的主要目的是為開發者提供:
一個可復用、可維護、更易理解的工程綜合模型,與這個模型交互的插件或工具
Maven工程結構和內容定義在一個xml文件中(一般是pom.xml)
利用Maven構建項目過程階段:
二、Maven安裝配置
1.?JDK安裝
? ? ? ??Maven是基于Java的工具,所以配置Maven要做的第一件事就是安裝JDK
2.?Windows安裝
? ? ? ? Maven下載地址:http://maven.apache.org/download.html
? ? ? ??下載解壓后,添加環境變量即完成
3. Linux安裝
? ? ? ??① 配置yum源
# sudo yum install -y yum-utils# yum-config-manager --add-repo http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo????????②?安裝Maven
# yum install -y apache-maven完成安裝后,通過mvn --version?檢驗安裝版本
三、Maven初體驗
Maven主要是用來打jar、war包以及管理jar包
1. 原始的javac打包方式
假如我們有一個Hello.java文件,想要將它打成可執行jar包,一般這樣做。
使用 javac 命令和 jar 命令打包:
生成的jar包文件,由兩部分組成,class文件和META-INF目錄,如下:
此時的jar包,是不可直接運行的,需要指定入口main類
進入META-INF目錄,編輯MANIFEST.MF文件,如下:
運行此jar包,得到運行結果:
2.?maven打包
在pom文件內配置入口類
執行maven打包命令
mvn package
運行生成的jar,結果與原始方式無區別
四、POM結構
五、Maven流程
1.?maven的理想
maven像一種什么設計模式?答案:模板方法模式
自動走完標準的構建流程:清理->編譯->測試->報告->打包->部署
統一入口,所有配置在一個pom里搞定
2.?maven的約定
約定的目錄(不可改):
src/main/java –存放項目的.java文件 |
src/main/resources –存放項目資源文件。比方spring,hibernate配置文件 |
src/test/java –存放全部測試.java文件,比方JUnit測試類 |
src/test/resources ---測試資源文件 |
target ---項目輸出位置,編譯完畢后的東西放到這里面 |
pom.xml |
3.?maven的生命周期
maven的構建生命周期,只是一個抽象的規范流程。周期內的每個階段的具體執行,是在插件里面來實現的。
各個生命周期預設的定義如下:
階段 | 處理 | 描述 |
驗證 validate | 驗證項目 | 驗證項目是否正確且所有必須信息是可用的 |
編譯 compile | 執行編譯 | 源代碼編譯在此階段完成 |
測試 Test | 測試 | 使用適當的單元測試框架(例如JUnit)運行測試。 |
包裝 package | 打包 | 創建JAR/WAR包如在 pom.xml 中定義提及的包 |
檢查 verify | 檢查 | 對集成測試的結果進行檢查,以保證質量達標 |
安裝 install | 安裝 | 安裝打包的項目到本地倉庫,以供其他項目使用 |
部署 deploy | 部署 | 拷貝最終的工程包到遠程倉庫中,以共享給其他開發人員和工程 |
運行任何一個階段,都會從其所在生命周期的第一個階段開始,順序執行到指定的階段,如:
mvn package(本義:執行default周期的package階段,maven會自動從process-resources階段開始運行到package階段結束)
4.?maven的插件
插件plugin是綁定到生命周期,承擔實際功能的組件。mvn運行時,自動關聯插件來運行
下圖是maven默認的各階段對應的插件列表:
生命周期 | 生命周期階段 | 插件目標 | 執行任務 |
clean | pre-clean | ||
clean | maven-clean-plugin:clean | 刪除項目的輸出目錄。 | |
post-clean | |||
site | pre-site | ||
site | maven-site-plugin:site | ||
post-site | |||
site-deploy | maven-site-plugin:deploy | ||
default | process-resources | maven-resources-plugin:resources | 復制主資源文件至主輸出目錄 |
compile | maven-compiler-plugin:compile | 編譯主代碼至主輸出目錄 | |
process-test-resources | maven-resources-plugin:testResources | 復制測試資源文件至測試輸出目 | |
test-compile | maven-compiler-plugin:testCompile | 編譯測試代碼至測試輸出目錄 | |
test | maven-surefire-plugin:test | 執行測試用例 | |
package | maven-jar-plugin:jar(ejb:ejb jar:jar rar:rar war:war) | 創建項目jar包 | |
install | maven-install-plugin:install | 將項目輸出構件安裝到本地倉庫 | |
deploy | maven-deploy-plugin:deploy | 將項目輸出構件部署到遠程倉庫 |
六、常用Maven命令
mvn clean? 清理
mvn compile 編譯主程序
mvn package 打包
mvn install 安裝jar到本地庫
使用maven命令生成項目(idea和eclipse生成項目最終也是依賴maven插件生成的):
mvn archetype:generate -DgroupId=enjoy -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart??-Dversion=1.0
mvn archetype:generate -DgroupId=enjoy -DartifactId=simple-web -DarchetypeArtifactId=maven-archetype-webapp -Dversion=1.0??
七、Maven插件開發
可以自定義插件,來擴展maven的功能。插件的開發步驟如下:
1.?引入maven api依賴
2.?編寫簡單Mojo類(繼承AbstractMojo)
3.?執行插件
mvn com.enjoy:enjoy-plugin:1.0:log
4.?關聯插件到生命周期來執行
構建項目對應的生命周期
八、Maven坐標與依賴
1.?坐標
--------在數學中, 任何一個坐標可以唯一確定一個“點”
Maven 中坐標是Jar包的唯一標識
坐標元素包括groupId、artifactId、version、packaging:
| 元素 | 描述 | 說明 |
| groupId | 定義當前模塊隸屬的實際 Maven項目 | 中小企業常常直接對應公司、組織 |
| artifactId | 定義實際項目中的一個Maven模塊 | 唯一標識一個模塊 |
| version | 定義當前項目所屬版本 | SNAPSHOT:表示不穩定版本 LATEST:指最新發布的版本,可能是個發布版,也可能是一個snapshot版本 RELEASE:指最后一個發布版 |
| packaging | 定義Maven項目打包方式 | 有jar(默認)、war、pom、maven-plugin等 |
| dassifier | 附屬構建(如javadoc、sources) | 須有附加插件的幫助 |
2.?依賴
依賴即:A->B,B->C,C->D這種項目間的依存關系。
在java的jvm內,依賴的最終表現是,項目A啟動時,其依賴的jar包必須都對應放入其classpath路徑內。
3.?依賴傳遞
上述過程中,項目Mall歸結起來,依賴的fastjson會有三個版本。
而我們的jvm最終肯定只能接受一個版本的jar,所以必須有所取舍。
maven默認的取舍規則是:
1、路徑最短原則:product和customer里的fastjson引用路徑較短,路徑為兩步;pay項目里的fastjson引用路徑較長,路徑為三步。因此pay中的fastjson被淘汰;
2、同路徑長度下,誰先聲明誰優先:product和customer中的fastjson路徑相同,那么就看在pom中是先聲明product還是先聲明customer,誰先用誰的。
4.?依賴沖突及解決
在依賴傳遞里,我們看到,maven根據自己的規則為我們取舍出了一個版本的jar,但此jar版本選擇可能會與我們的項目預期不符:
例如:我們最終想的版本是fastjson:1.2.30版本(但它在第一步即被淘汰掉了)
當出現此類情況時,我們項目運行可能會出錯(項目中使用到了1.2.30版本的特性),此問題即是我們常遇到的jar包沖突問題。
補救方式:使用exclusions將product和customer中的fastjson包排除掉,用法如下圖:
當發生jar沖突程序報錯時,可以使用mvn命令查出項目最終依賴的jar包樹,看版本是否是我們預期的:
命令:mvn dependency:tree
5. 依賴范圍scope
mvn在運行時,生命周期的不同階段,會有不同的依賴范圍,一般有以下依賴范圍scope:
- compile:默認范圍,用于編譯(依賴的jar在打包時會包含進去) ? ? ?
- provided:類似于編譯,但支持你期待jdk或者容器提供,類似于classpath(依賴的jar在打包時不會包含進去)
- runtime:在執行時需要使用(依賴的jar在打包時會包含進去)
- test:用于test任務時使用(依賴的jar在打包時不會包含進去)
- system:需要外在提供相應的元素。通過systemPath來取得(一般禁止使用)
每個scope實際上是配置了一個不同的classpath,jvm根據選擇不同的classpath來達到依賴不同
九、環境激活-profiles使用
在springmvc項目中,開發/測試/線上三個不同環境,配置文件往往也不同。
打包時需要對配置文件做出選擇(maven提供了profiles機制供我們使用)。
1. profiles的場景
這個選擇,實際發生在default生命周期的resource階段(maven-resources-plugin執行過程里)
2.?定義profiles
為了指導插件將對應的resource文件打入classpath里,先定出profiles
此定義即指,當mvn命令執行時,我們需要通過 -P dev或者-P test方式傳入我們的意圖:
dev/test選擇,會導致properties里的變量值含義不同,我們主要關注package.environment變量
3.?資源插件的配置指定
配置maven-resources-plugin插件執行時,要復制的目錄資源
4.?mvn約定的資源中需要過濾掉環境目錄
需要將mvn約定的資源目錄里,過濾掉環境目錄
5.?小屬性更輕便的用法
對于簡單的屬性,我們可以選擇更輕便的用法
①?直接在環境中定義屬性值
②?項目屬性文件配置
③?約定的資源啟用替換過濾
更多精彩敬請關注公眾號
Java極客思維
微信掃一掃,關注公眾號
總結
以上是生活随笔為你收集整理的maven 打包jar_Maven一定要会的这几个知识!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipad写python_ipad怎么写p
- 下一篇: 数组排序c语言函数_C语言如何写出返回数