maven學習筆記

maven


------------------------------------------------------------------
POM


POM(項目對象模型):
描述性和聲明性的,它不像Ant或者Make那樣提供顯式的指令;
不是特定於Java的


POM包含了四類描述和配置:
項目總體信息:名稱,項目的URL,發起組織,以及項目的開發者貢獻者列表和許可證
構建設置:代碼位置,插件,插件目標,站點生成參數
構建環境:~/.m2/settings.xml
POM關係:依賴,繼承,座標,子模塊


超級POM:pom-4.0.0.xml


項目版本:<主版本>.<次版本>.<增量版本>-<限定版本> 
限定版本用來標識里程碑構建:alpha和beta發佈    1.2.3-alpha-02


SNAPSHOT版本:只用於開發過程 
一個快照版是一個處於開發過程中的組件的版本
如果一個版本包含字符串“SNAPSHOT”,Maven就會在安裝或發佈這個組件的時候
將該符號展開爲一個日期和時間值,轉換爲UTC(協調世界時)


LATEST是指某個特定構件最新的發佈版或者快照版(snapshot),最近被部署到某個特定倉庫的構件
RELEASE是指倉庫中最後的一個非快照版本
在構件中使用任何一個自定義非核心插件的時候,都應該顯式的指定版本號


Maven提供了三個隱式的變量,可以用來訪問環境變量,POM信息,和Maven Settings:
env:操作系統或者shell的環境變量
project:POM ${project.artifactId}
settings:Maven settings ${settings.offline}
除了這三個隱式的變量,你還可以引用系統屬性,以及任何在Maven POM中和構建profile中自定義的屬性組:
Java系統屬性:所有可以通過java.lang.System中getProperties()方法訪問的屬性
x:通過pom.xml或者settings.xml中的properties元素


項目依賴:
外部依賴:如Plexus,SpringFramework,或者Log4J的類庫
內部依賴:就像另外一個包含服務類,模型類,或者持久化邏輯的項目


依賴範圍scope:
compile(編譯範圍):默認,在所有的classpath中可用,同時它們也會被打包
provided(已提供範圍):在編譯classpath(不是運行時)可用,不會被打包
runtime(運行時範圍):運行和測試系統的時候需要,但在編譯的時候不需要
test(測試範圍):編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用
system(系統範圍):與provided類似,不推薦使用


可選依賴:<optional>true</optional>


依賴版本界限:<version>[3.8,4.0)</version>  <version>[,3.8.1]</version>


排除並替換一個傳遞性依賴:
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<version>1.1</version>
</dependency>
</dependencies>


dependencyManagement元素:和一個環境變量一樣,
能讓你在一個項目下面的任何地方聲明一個依賴而不用指定一個版本號
只有在子項目沒有直接聲明一個版本的時候,dependencyManagement定義的版本纔會被使用


項目座標:
groupId:歸類了一組相關的構件,類似於一個Java包名,被翻譯成路徑
artifactId:項目的主要定義符
version:版本號
classifier:分類器,用於生成多個不同的構件;常用於打包構件的源碼,JavaDoc或者二進制集合


多模塊項目:
打包類型:pom jar
<modules> <module>sub-group</module> <module>project-c</module> </modules>
爲“模塊”而不是“子項目”


項目繼承:
<parent>
<groupId>com.training.killerapp</groupId>
<artifactId>a-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>


相對位置:<relativePath>../a-parent/pom.xml</relativePath>


POM最佳實踐:
依賴歸類:
<dependency>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>persistence-deps</artifactId>
<version>1.0</version>
<type>pom</type>
多模塊 vs. 繼承:
一個父項目是指它把所有的值傳給它的子項目
一個多模塊項目只是說它管理一組子模塊,或者說一組子項目
使用父子關係的最主要原因是爲了給一組邏輯關聯的項目共享依賴和通用配置
所有模塊都是子模塊是爲了方便,要構建整個系統,
只要到big-system項目目錄下運行mvn package
------------------------------------------------------------------------------------
生命週期


三種:clean default site


clean:pre-clean clean(clean:clean) post-clean
目標clean:clean通過刪除構建目錄刪除整個構建的輸出


default:validate ... compile ... test . package ... varify install deploy


site:pre-site site(site:site) post-site site-deploy(site:deploy)


綁定到每個階段的特定目標默認根據項目的打包類型設:
jar POM(生成的構件只是它本身) Maven Plugin EJB war ear(Java EE結構體) NAR(本地歸檔Flash和Flex)


通用生命週期目標:
process-resources:resources:resources目標 處理資源並將資源複製到輸出目錄 
資源過濾
<resource>
<filtering>true</filtering>
<directory>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
<includes>
<include>run.bat</include>
<include>run.sh</include>
</includes>
<targetPath>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
</resource>


compile:compile:compile 編譯所有的源碼並複製到構建輸出目錄
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
<sourceDirectory>src/java</sourceDirectory>
<outputDirectory>classes</outputDirectory>


Process Test Resources:和process-resources有一些微小的差別,但大部分是一樣的


Test Compile:test-compile階段基本上和compile階段一致,
唯一的不同是會調用compile:testCompile編譯測試源代碼目錄至測試構建構建輸出目錄


Test:surefire:test
<testFailureIgnore>true</testFailureIgnore>
整個的跳過測試:$ mvn install -Dmaven.test.skip=true


Install:install:install 將項目的主要構件安裝到本地倉庫


Deploy:deploy:deploy 將一個構件部署到遠程Maven倉庫
-------------------------------------------------------------------
Profile
Profile能讓你爲一個特殊的環境自定義一個特殊的構建;profile使得不同環境間構建的可移植性成爲可能


Maven profile可以覆蓋幾乎所有pom.xml中的配置


$ mvn clean install -Pproduction -X


默認的構建是針對開發環境設計的,而production profile的存在就是爲了爲產品環境提供配置


激活profile:
<activation>
<activeByDefault>false</activeByDefault>#
<jdk>1.5</jdk>#
<os><name>Windows XP</name>#</os>
<property><name>mavenVersion</name>#<value>2.0.5</value></property>
<file>
<exists>file2.properties</exists>#
<missing>file1.properties</missing>
</file>
</activation>
屬性缺失激活:
<property>
<name>!environment.type</name>
</property>


外部profiles.xml


定義激活的Settings Profile
<settings>
...
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
</settings>
該設置只會激活settings


定義用戶特定的Setting Profile (~/.m2/settings.xml)
<settings>
<profiles>
<profile>
<id>dev</id>
<plugin>
<groupId>...


local/maven/conf/settings.xml中定義一組全局profile


列出活動的Profile:$ mvn help:active-profiles


使用profile,構建可以變得容易移植,沒有必要爲一個新的環境重寫你的構建
邏輯,只需要重寫那些需要變化的配置,共享那些可以被共享的配置
-----------------------------------------------------------------------
Maven套件(Assembly):創建一個自定義格式的歸檔文件或目錄


“分發(distribution)”意思是,根據項目將會如何被使用,爲不同的人(或項目)提供不同的東西


assembly:assembly目標被設計成直接從命令行調用,它永遠不應該被綁定到生命週期階段
single mojo被設計成作爲你每日構建的一部分,應該被綁定到項目生命週期的某個階段


預定義的套件描述符:
bin:包裹該主構件和項目的LICENSE, README, 和NOTICE文件,最可能小的二進制分發包。
jar-with-dependencies:帶有主項目jar文件和所有項目運行時依賴未解開內容的JAR歸檔文件
project:簡單的將你文件系統或者版本控制中的項目目錄結構整個的歸檔
src:包含你項目源碼,pom.xml文件,以及項目根目錄中所有LICENSE,README,和NOTICE文件的歸檔


<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
<executions>
<execution>
<id>create-executable-jar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.sonatype.mavenbook.App</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章