Maven 筆記
https://www.yiibai.com/maven/enable-proxy-setting-in-maven.html
目錄:
Maven 概念
中央和遠(yuǎn)程存儲(chǔ)庫配置和解釋,有些術(shù)語可能需要在 Maven 使用前理解。
- Maven本地資源庫
Maven 的本地資源庫是用來存儲(chǔ)項(xiàng)目的依賴庫,默認(rèn)的文件夾是 “.m2” 目錄,可能需要將其更改為另一個(gè)文件夾。 settings.xml中可配置 - Maven中央存儲(chǔ)庫http://repo1.maven.org/maven2/
Maven 中央存儲(chǔ)庫是 Maven 用來下載所有項(xiàng)目的依賴庫的默認(rèn)位置。不必配置, 可以在http://search.maven.org/#browse查找 - 如何從Maven遠(yuǎn)程存儲(chǔ)庫下載?,如何添加遠(yuǎn)程庫?
并非所有的庫存儲(chǔ)在Maven的中央存儲(chǔ)庫,很多時(shí)候需要添加一些遠(yuǎn)程倉庫來從其他位置,而不是默認(rèn)的中央存儲(chǔ)庫下載庫。pom.xml中可添加 - Maven依賴機(jī)制
這里的文章是關(guān)于傳統(tǒng)方式和Maven方式的依賴庫的不同,并說明 Maven 會(huì)從那里搜索這些庫。 - 定制庫到Maven本地資源庫
很多庫仍然不支持 Maven 的 pom.xml 的概念,這里有一個(gè)指南來說明如何包括“非Maven支持”庫到 Maven 本地資源庫中。
settings.xml
我們可以通過這個(gè)文件來定義本地倉庫、遠(yuǎn)程倉庫和聯(lián)網(wǎng)使用的代理信息等。這些在IDEA編輯器中也可以在用戶偏好中設(shè)置。
-
settings.xml位置
- 當(dāng)前用戶->.m2下面
- 全局 mvn安裝目錄conf/, 不存在則自建
-
settings.xml中主要包括以下元素:
-
localRepository:
表示Maven用來在本地儲(chǔ)存信息的本地倉庫的目錄。默認(rèn)是用戶家目錄下面的.m2/repository目錄。<settings>
</settings> ```
interactiveMode:表示是否使用交互模式,默認(rèn)是true;如果設(shè)為false,那么當(dāng)Maven需要用戶進(jìn)行輸入的時(shí)候,它會(huì)使用一個(gè)默認(rèn)值。
offline:表示是否離線,默認(rèn)是false。這個(gè)屬性表示在Maven進(jìn)行項(xiàng)目編譯和部署等操作時(shí)是否允許Maven進(jìn)行聯(lián)網(wǎng)來下載所需要的信息。
pluginGroups:在pluginGroups元素下面可以定義一系列的pluginGroup元素。表示當(dāng)通過plugin的前綴來解析plugin的時(shí)候到哪里尋找。pluginGroup元素指定的是plugin的groupId。默認(rèn)情況下,Maven會(huì)自動(dòng)把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。
proxies:其下面可以定義一系列的proxy子元素,表示Maven在進(jìn)行聯(lián)網(wǎng)時(shí)需要使用到的代理。當(dāng)設(shè)置了多個(gè)代理的時(shí)候第一個(gè)標(biāo)記active為true的代理將會(huì)被使用。
<proxies> <proxy> <id>xxx</id> <active>true</active> <protocol>http</protocol> <username>用戶名</username> <password>密碼</password> <host>代理服務(wù)器地址</host> <port>代理服務(wù)器的端口</port> <nonProxyHosts>不使用代理的主機(jī) </nonProxyHosts> </proxy> </proxies>
<!-- proxies | This is a list of proxies which can be used on this machine to connect to the network. | Unless otherwise specified (by system property or command-line switch), the first proxy | specification in this list marked as active will be used. |--> <proxies> <proxy> <id>optional</id> <active>true</active> <protocol>http</protocol> <username>yiibai</username> <password>password</password> <host>proxy.yiibai.com</host> <port>8888</port> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> </proxy> </proxies>
- servers:其下面可以定義一系列的server子元素,表示當(dāng)需要連接到一個(gè)遠(yuǎn)程服務(wù)器的時(shí)候需要使用到的驗(yàn)證方式。這主要有username/password和privateKey/passphrase這兩種方式。以下是一個(gè)使用servers的示例:
<servers> <server> <id>id</id> <username>用戶名</username> <password>密碼</password> </server> </servers>
- mirrors:用于定義一系列的遠(yuǎn)程倉庫的鏡像。我們可以在pom中定義一個(gè)下載工件的時(shí)候所使用的遠(yuǎn)程倉庫。但是有時(shí)候這個(gè)遠(yuǎn)程倉庫會(huì)比較忙,所以這個(gè)時(shí)候人們就想著給它創(chuàng)建鏡像以緩解遠(yuǎn)程倉庫的壓力,也就是說會(huì)把對遠(yuǎn)程倉庫的請求轉(zhuǎn)換到對其鏡像地址的請求。每個(gè)遠(yuǎn)程倉庫都會(huì)有一個(gè)id,這樣我們就可以創(chuàng)建自己的mirror來關(guān)聯(lián)到該倉庫,那么以后需要從遠(yuǎn)程倉庫下載工件的時(shí)候Maven就可以從我們定義好的mirror站點(diǎn)來下載,這可以很好的緩解我們遠(yuǎn)程倉庫的壓力。在我們定義的mirror中每個(gè)遠(yuǎn)程倉庫都只能有一個(gè)mirror與它關(guān)聯(lián),也就是說你不能同時(shí)配置多個(gè)mirror的mirrorOf指向同一個(gè)repositoryId
- id:是用來區(qū)別mirror的,所有的mirror不能有相同的id
- mirrorOf:用來表示該mirror是關(guān)聯(lián)的哪一個(gè)倉庫,其值為其關(guān)聯(lián)倉庫的id。當(dāng)要同時(shí)關(guān)聯(lián)多個(gè)倉庫時(shí),這多個(gè)倉庫之間可以用逗號(hào)隔開;當(dāng)要關(guān)聯(lián)所有的倉庫時(shí),可以使用“”表示;當(dāng)要關(guān)聯(lián)除某一個(gè)倉庫以外的其他所有倉庫時(shí),可以表示為“,!repositoryId”;當(dāng)要關(guān)聯(lián)不是localhost或用file請求的倉庫時(shí),可以表示為“external:*”。
- url:表示該鏡像的url。當(dāng)Maven在建立系統(tǒng)的時(shí)候就會(huì)使用這個(gè)url來連接到我們的遠(yuǎn)程倉庫。
-
```
<mirrors>
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>定義一個(gè)容易看懂的名稱 </name>
<url>http://my.repository.com/repo/path</url>
</mirror>
</mirrors>
```
遠(yuǎn)程倉庫
默認(rèn)情況下,Maven從Maven中央倉庫<>下載所有依賴關(guān)系。但是,有些庫丟失在中央存儲(chǔ)庫,只有在Java.net或JBoss的儲(chǔ)存庫遠(yuǎn)程倉庫中能找到。
修改pom.xml
<project ...>
<repositories> <!--Java.net-->
<repository>
<id>java.net</id>
<url>https://maven.java.net/content/repositories/public/</url>
</repository>
</repositories>
<repositories>
<repository> <!--JBoss-->
<id>JBoss repository</id>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
</repository>
</repositories>
</project>
現(xiàn)在,Maven的依賴庫查詢順序更改為:
在 Maven 本地資源庫中搜索,如果沒有找到,進(jìn)入第 2 步,否則退出。
在 Maven 中央存儲(chǔ)庫搜索,如果沒有找到,進(jìn)入第 3 步,否則退出。
在java.net Maven的遠(yuǎn)程存儲(chǔ)庫搜索,如果沒有找到,提示錯(cuò)誤信息,否則退出。
添加依賴jar包示例:
<dependencies>
<dependency>
<groupId>org.jvnet.localizer</groupId>
<artifactId>localizer</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
自定義jar包
mvn install:install-file -Dfile=jars/ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
Maven Pom
配置
- project dependencies
- plugins
- goals
- build profiles
- project version
- developers
- mailing list
所有的 POM 文件要項(xiàng)目元素必須有三個(gè)必填字段: groupId,artifactId,version
<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>
<groupId>com.yiibai.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<project>
-
超級(jí)POM
所有的POM繼承自父類(盡管明確界定)。這個(gè)基礎(chǔ)的 POM 被稱為超級(jí) POM,并包含繼承默認(rèn)值。 Maven使用有效的POM(超級(jí)POM加項(xiàng)目配置的配置)執(zhí)行有關(guān)目標(biāo)。它可以幫助開發(fā)人員指定最低配置的詳細(xì)信息寫在 pom.xml 中。mvn help:effective-pom
構(gòu)建生命周期
一個(gè)典型的 Maven 構(gòu)建生命周期是由下列順序的階段:
階段 | 處理 | 描述 |
---|---|---|
準(zhǔn)備資源 | 資源復(fù)制 | 資源復(fù)制可以進(jìn)行定制 |
編譯 | 執(zhí)行編譯 | 源代碼編譯在此階段完成 |
包裝 | 打包 | 創(chuàng)建JAR/WAR包如在 pom.xml 中定義提及的包 |
安裝 | 安裝 | 這一階段在本地/遠(yuǎn)程Maven倉庫安裝程序包 |
當(dāng) Maven 開始建立一個(gè)項(xiàng)目,它通過定義序列階段步驟和執(zhí)行注冊的每個(gè)階段的目標(biāo)。 Maven有以下三種標(biāo)準(zhǔn)的生命周期:
clean
default(或 build)
site
mvn clean dependency:copy-dependencies package
在這里,清潔的階段,將首先執(zhí)行,然后是依賴關(guān)系:復(fù)制依賴性的目標(biāo)將被執(zhí)行,并終于將執(zhí)行包階段。
clean(清潔生命周期)
在基于Maven的項(xiàng)目中,很多緩存輸出在“target”文件夾中。如果想建立項(xiàng)目部署,必須確保清理所有緩存的輸出,從面能夠隨時(shí)獲得最新的部署。
當(dāng)我們執(zhí)行命令 mvn clean 命令后,Maven 調(diào)用清潔的生命周期由以下幾個(gè)階段組成:
* pre-clean
* clean
* post-clean
當(dāng) mvn clean 命令執(zhí)行時(shí),Maven會(huì)刪除編譯目錄
####### default( 默認(rèn)(或生成)生命周期 )
maven compile
這是 Maven 主要的生命周期,用于構(gòu)建應(yīng)用程序。它有以下 23 個(gè)階段。
生命周期階段 | 描述 |
---|---|
validate | 驗(yàn)證項(xiàng)目是否正確,并且所有必要的信息可用于完成構(gòu)建過程 |
initialize | 建立初始化狀態(tài),例如設(shè)置屬性 |
generate-sources | 產(chǎn)生任何的源代碼包含在編譯階段 |
process-sources | 處理源代碼,例如,過濾器值 |
generate-resources | 包含在包中產(chǎn)生的資源 |
process-resources | 復(fù)制和處理資源到目標(biāo)目錄,準(zhǔn)備打包階段 |
compile | 編譯該項(xiàng)目的源代碼 |
process-classes | 從編譯生成的文件提交處理,例如:Java類的字節(jié)碼增強(qiáng)/優(yōu)化 |
generate-test-sources | 生成任何測試的源代碼包含在編譯階段 |
process-test-sources | 處理測試源代碼,例如,過濾器任何值 |
test-compile | 編譯測試源代碼到測試目標(biāo)目錄 |
process-test-classes | 處理測試代碼文件編譯生成的文件 |
test | 運(yùn)行測試使用合適的單元測試框架(JUnit) |
prepare-package | 執(zhí)行必要的任何操作的實(shí)際打包之前準(zhǔn)備一個(gè)包 |
package | 提取編譯后的代碼,并在其分發(fā)格式打包,如JAR,WAR或EAR文件 |
pre-integration-test | 完成執(zhí)行集成測試之前所需操作。例如,設(shè)置所需的環(huán)境 |
integration-test | 處理并在必要時(shí)部署軟件包到集成測試可以運(yùn)行的環(huán)境 |
pre-integration-test | 完成集成測試已全部執(zhí)行后所需操作。例如,清理環(huán)境 |
verify | 運(yùn)行任何檢查,驗(yàn)證包是有效的,符合質(zhì)量審核規(guī)定 |
install | 將包安裝到本地存儲(chǔ)庫,它可以用作當(dāng)?shù)仄渌?xiàng)目的依賴 |
deploy | 復(fù)制最終的包到遠(yuǎn)程倉庫與其他開發(fā)者和項(xiàng)目共享 |
- Maven是分階段運(yùn)行, 因此,執(zhí)行“package”階段的時(shí)候,所有階段 – “validate“, “compile” 和 “test“, 包括目前的階段“package”將被執(zhí)行。打包生成jar還是war取決于pom的配置, 建議 mvn clean package
- 將項(xiàng)目安裝到Maven本地資源庫 mvn install 建議 mvn clean install
site( 網(wǎng)站的生命周期 )
maven site
Maven的網(wǎng)站插件通常用于創(chuàng)建新的文檔,創(chuàng)建報(bào)告,部署網(wǎng)站等。目前沒啥太大作用, 不用太關(guān)注
階段
pre-site
site
post-site
site-deploy
maven 資源文件(沒太懂)
https://www.yiibai.com/maven/maven_build_profiles.html
生成配置文件是一組可以用來設(shè)置或覆蓋 Maven 構(gòu)建配置值的默認(rèn)值。使用生成配置文件,你可以針對不同的環(huán)境,如:生產(chǎn)V/S開發(fā)環(huán)境自定義構(gòu)建。
配置文件中指定 pom.xml 文件使用其配置文件/配置文件元素和多種方式來觸發(fā)。配置文件修改 POM 后,在編譯的時(shí)候是用來給不同的目標(biāo)環(huán)境參數(shù)(例如,開發(fā),測試和生產(chǎn)環(huán)境的數(shù)據(jù)庫服務(wù)器的路徑)。
-
創(chuàng)建配置文件的文件主要有三種類型:
類型 定義位置 Per Project 在項(xiàng)目中定義的POM文件, pom.xml Per User 定義在 Maven 中的設(shè)置 XML 文件(~/.m2/settings.xml) Global 定義在 Maven 中的全局設(shè)置 xml 文件 (Maven安裝目錄/conf/settings.xml) -
配置文件激活
Maven 構(gòu)建配置文件的文件,可以使用以下幾種方式來激活。
明確使用命令從控制臺(tái)輸入。 通過 Maven 設(shè)置。 基于環(huán)境變量(用戶/系統(tǒng)變量)。 OS設(shè)置(例如,Windows系列)。 呈現(xiàn)/丟失的文件。
-
現(xiàn)在下src/main/resources 有三個(gè)特定的文件:
文件名稱 描述 env.properties 如果沒有配置文件關(guān)聯(lián)則使用默認(rèn)配置 env.test.properties 當(dāng)測試配置文件用于測試配置 env.prod.properties 生產(chǎn)配置時(shí),prod信息被使用 pom.xml
<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>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<profiles>
<profile>
<id>test</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<!--看這里, 執(zhí)行了文件拷貝的工作,
實(shí)際代碼中讀env.properties這個(gè)文件
疑問是{project.build.outputDirectory}是哪一個(gè)目錄呢? 生成的build文件下?-->
<echo>Using env.test.properties</echo>
<copy file="src/main/resources/env.test.properties" tofile
="${project.build.outputDirectory}/env.properties"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
看上面的配置, 引入插件maven-antrun-plugin, 在test階段生效,如果非test是直接跳過的
通過配置文件名作為參數(shù)可使用 -P 選項(xiàng)。
mvn test -P test
mvn test -P prod 類似的
maven 插件
https://www.yiibai.com/maven/maven_plugins.html
https://www.cnblogs.com/AlanLee/p/6428859.html
Maven 是一個(gè)執(zhí)行插件的框架,每一個(gè)任務(wù)實(shí)際上是由插件完成的。Maven 插件通常用于:
創(chuàng)建 jar 文件
創(chuàng)建 war 文件
編譯代碼文件
進(jìn)行代碼單元測試
創(chuàng)建項(xiàng)目文檔
創(chuàng)建項(xiàng)目報(bào)告
Maven 提供以下兩種類型插件:
類型 | 描述 |
---|---|
構(gòu)建插件 | 在生成過程中執(zhí)行,并在 pom.xml 中的<build/> 元素進(jìn)行配置 |
報(bào)告插件 | 在網(wǎng)站生成期間執(zhí)行,在 pom.xml 中的 <reporting/> 元素進(jìn)行配置 |
以下是一些常見的插件列表:
插件 | 描述 |
---|---|
clean | 編譯后的清理目標(biāo),刪除目標(biāo)目錄 |
compiler | 編譯 Java 源文件 |
surefile | 運(yùn)行JUnit單元測試,創(chuàng)建測試報(bào)告 |
jar | 從當(dāng)前項(xiàng)目構(gòu)建 JAR 文件 |
war | 從當(dāng)前項(xiàng)目構(gòu)建 WAR 文件 |
javadoc | 產(chǎn)生用于該項(xiàng)目的 Javadoc |
antrun | 從構(gòu)建所述的任何階段運(yùn)行一組 Ant 任務(wù) |
示例:使用 maven-antrun-plugin 插件在例子中來在控制臺(tái)打印數(shù)據(jù)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>id.clean</id>
<phase>clean</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>clean phase</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
引入maven-antrun-plugin clean階段生效
-
一個(gè)插件通常提供了一組目標(biāo),可使用以下語法來執(zhí)行:
mvn [plugin-name]:[goal-name]
例如,一個(gè) Java 項(xiàng)目可以使用 Maven 編譯器插件來編譯目標(biāo),通過運(yùn)行以下命令編譯
mvn compiler:compile
解釋:
<id></id> <phase>對應(yīng)哪個(gè)構(gòu)建階段</phase> <goals>目標(biāo) <goal>目標(biāo)1<goal> <goal>目標(biāo)2<goal> ...... </goals> <configuration> <task> <echo></echo> <> <task> </configuration>
插件可在 pom.xml 使用的 plugin 元素來指定;
每個(gè)插件可以有多個(gè)目標(biāo);
從插件應(yīng)使用它的相位元素開始處理定義階段。這里已經(jīng)使用 clean 階段;
可以通過將它們綁定到插件的目標(biāo)來執(zhí)行配置任務(wù)。這里已經(jīng)綁定 echo 任務(wù)到 maven-antrun-plugin 的運(yùn)行目標(biāo); 可以執(zhí)行多條命令<>
就這樣,Maven將處理其余部分。如果沒有可用的本地存儲(chǔ)庫,它會(huì)下載這個(gè)插件;
mvn創(chuàng)建java項(xiàng)目
mvn archetype:generate
-DgroupId=com.companyname.bank
-DartifactId=consumerBanking
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
這告訴 Maven 來從 maven-archetype-quickstart 模板創(chuàng)建 Java 項(xiàng)目。如果忽視 archetypeArtifactId 選項(xiàng),一個(gè)巨大的 Maven 模板列表將列出。
項(xiàng)目目錄:
mvn archetype:generate + maven-archetype-quickstart 模板
project-name
|-src
|---main
|-----java
|-------com
|---------yiibai
|-----------App.java
|---test|-----java
|-------com
|---------yiibai
|-----------AppTest.java
|-pom.xml
打開pom.xml
<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>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
</project>
你可以看到 Maven 已經(jīng)添加了 Junit 測試框架。默認(rèn)情況下 Maven 增加了一個(gè)源文件 App.java,以及在前面的章節(jié)中討論的一樣,默認(rèn)目錄結(jié)構(gòu)中也有一個(gè)測試文件:AppTest.java。
mvn clean package
想下之前講的, 先clean目標(biāo)目錄(干掉build文件), 然后執(zhí)行默認(rèn)生命周期(直接到package步驟為止, 前面包含了編譯測試等工序)
現(xiàn)在我們已經(jīng)建立項(xiàng)目,并創(chuàng)建生成最終 jar 文件,以下是主要一些概念介紹:
我們給 maven 兩個(gè)目標(biāo),首先要清理目標(biāo)目錄(clean),然后打包項(xiàng)目生成 JAR(包)輸出 ;
打包的 JAR 可在 consumerBanking\target 文件夾找到文件:consumerBanking-1.0-SNAPSHOT.jar ;
測試報(bào)告在 consumerBanking\target\surefire-reports 文件夾中;
Maven 編譯的源代碼文件,然后測試源代碼文件;
然后 Maven 運(yùn)行測試用例;
最后 Maven 創(chuàng)建包;
cd target\classes
java com.companyname.bank.App
修改代碼后 重新編譯
mvn clean compile
cd target\classes
java -cp com.companyname.bank.App
添加外部依賴
舉一個(gè)例子,讓我們在 Maven創(chuàng)建項(xiàng)目 這一章節(jié)中創(chuàng)建的項(xiàng)目做以下的修改。
添加 lib 文件夾到 src 文件夾
復(fù)制任何的 jar 到 lib 文件夾。這里使用的是 ldapjdk.jar,這是 LDAP 操作的輔助庫。
<dependency>
<groupId>ldapjdk</groupId>
<artifactId>ldapjdk</artifactId>
<scope>system</scope>
<version>1.0</version>
<systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
</dependency>
它清除以下有關(guān)外部依賴的重要概念。
外部依賴(JAR庫的位置)可以在 pom.xml 中配置為與其他依賴的方式相同;
指定 groupId 同樣作為庫的名稱;
指定 artifactId 同樣作為庫的名稱
指定范圍的系統(tǒng);
指定相系統(tǒng)項(xiàng)目的位置;
Maven項(xiàng)目文檔
mvn site
cd target/site
index.html
Maven快照
快照(SNAPSHOT )是一個(gè)特殊版本,指出目前開發(fā)拷貝。不同于常規(guī)版本,Maven 每生成一個(gè)遠(yuǎn)程存儲(chǔ)庫都會(huì)檢查新的快照版本。
現(xiàn)在,數(shù)據(jù)服務(wù)團(tuán)隊(duì)將在每次發(fā)布代碼后更新快照存儲(chǔ)庫為:data-service:1.0-SNAPSHOT 替換舊的 SNAPSHOT jar。
快照與版本
在使用版本時(shí),如果 Maven 下載所提到的版本為 data-service:1.0,那么它永遠(yuǎn)不會(huì)嘗試在庫中下載已經(jīng)更新的版本1.0。要下載更新的代碼,data-service的版本必須要升級(jí)到1.1。
在使用快照(SNAPSHOT)時(shí),Maven會(huì)在每次應(yīng)用程序UI團(tuán)隊(duì)建立自己的項(xiàng)目時(shí)自動(dòng)獲取最新的快照(data-service:1.0-SNAPSHOT)。
在使用快照(SNAPSHOT)時(shí),Maven 自動(dòng)獲取最新的快照版本。不過我們也可以強(qiáng)制使用 -U 切換到任何 maven 命令來下載最新的快照版本。
mvn clean package -U
依賴方使用SNAPSHOT, 自動(dòng)更新1.0版本的最新SNAPSHOT
<dependencies>
<dependency>
<groupId>data-service</groupId>
<artifactId>data-service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
提供方, 不穩(wěn)定版本version提供為SNAPSHOT形式
<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>
<groupId>data-service</groupId>
<artifactId>data-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>health</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
Maven構(gòu)建自動(dòng)化
https://www.yiibai.com/maven/maven_build_automation.html#article-start
app-web-ui, app-desktop-ui分別依賴了bus-core-api項(xiàng)目
<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>
<groupId>app_web_ui</groupId>
<artifactId>app_web_ui</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>app_web_ui</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>bus_core_api</groupId>
<artifactId>bus_core_api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>C:\MVN\bus_core_api\target\bus_core_api-1.0-SNAPSHOT.jar</systemPath>
</dependency>
</dependencies>
</project>
現(xiàn)在,每當(dāng)bus-core-api項(xiàng)目的變化時(shí),app-web-ui和app-desktop-ui項(xiàng)目團(tuán)隊(duì)需要自己編譯過程。
使用快照確保可以使用最新的 bus-core-api 項(xiàng)目,但要滿足上面我們需要做一些額外的要求。
* 添加一個(gè)生成后的目標(biāo) bus-core-api POM的應(yīng)用程序是在 app-web-ui 和 app-desktop-ui 的基礎(chǔ)之上。
* 使用持續(xù)集成(CI)的服務(wù)器自動(dòng)管理構(gòu)建自動(dòng)化。
<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>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-invoker-plugin</artifactId>
<version>1.6</version>
<configuration>
<debug>true</debug>
<pomIncludes> <!--這里配置了哪些項(xiàng)目依賴于它-->
<pomInclude>app-web-ui/pom.xml</pomInclude> <pomInclude>app-desktop-ui/pom.xml</pomInclude>
</pomIncludes>
</configuration>
<executions>
<execution>
<id>build</id>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<build>
</project>
看上面的配置, 引入插件maven-invoker-plugin, 在build階段生效
cd bus-core-api
mvn clean package -U
maven會(huì)依次重新編譯打包三個(gè)項(xiàng)目的jar包
使用Maven持續(xù)集成服務(wù)
使用CI服務(wù)器更適合作為開發(fā)人員,每次創(chuàng)建一個(gè)新的項(xiàng)目不需要更新 bus-core-api 項(xiàng)目的 POM,例如 app-mobile-ui 添加作為 bus-core-api 項(xiàng)目相關(guān)的項(xiàng)目。Hudson 自動(dòng)管理使用 Maven 依賴管理構(gòu)建自動(dòng)化。
Hudson 認(rèn)每個(gè)項(xiàng)目生成的工作。一旦一個(gè)項(xiàng)目的代碼簽入到SVN(或映射到哈德森任何源管理工具),哈德森開始它的構(gòu)建工作,一旦這項(xiàng)工作得到完成,它會(huì)自動(dòng)啟動(dòng)其他相關(guān)工作(其他相關(guān)項(xiàng)目)。
在上面的例子中,當(dāng)bus-core-ui 源代碼SVN更新,Hudson 開始它的構(gòu)建。當(dāng)構(gòu)建成功,Hudson 自動(dòng)查找相關(guān)的項(xiàng)目,并開始構(gòu)建 app-web-ui 和app-desktop-ui 項(xiàng)目。
Maven依賴管理
https://www.yiibai.com/maven/maven_manage_dependencies.html#article-start
Maven自動(dòng)化部署
https://www.yiibai.com/maven/maven_deployment_automation.html
在項(xiàng)目開發(fā)中,通常是部署過程包含以下步驟
檢入代碼在建項(xiàng)目全部進(jìn)入SVN或源代碼庫中,并標(biāo)記它。
從SVN下載完整的源代碼。
構(gòu)建應(yīng)用程序。
生成輸出要么WAR或EAR文件存儲(chǔ)到一個(gè)共同的網(wǎng)絡(luò)位置。
從網(wǎng)絡(luò)獲取的文件和文件部署到生產(chǎn)現(xiàn)場。
更新日期和應(yīng)用程序的更新版本號(hào)的文件。
依賴相關(guān)配置
- 排除依賴
https://www.cnblogs.com/duanxz/p/6084494.html
用maven管理庫依賴,有個(gè)好處就是連同庫的依賴的全部jar文件一起下載,免去手工添加的麻煩,但同時(shí)也帶來了同一個(gè)jar會(huì)被下載了不同版本的問題,好在pom的配置里面允許用<exclusion>來排除一些不需要同時(shí)下載的依賴jar 。
補(bǔ)充:如果想把當(dāng)前依賴的所有傳遞依賴排除掉,可以使用通配符*
<dependency>
<groupId>com.jsun.test</groupId>
<artifactId>B</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.jsun.test</groupId>
<artifactId>C</artifactId>
</exclusion>
</exclusions>
</dependency>
-
依賴范圍
https://blog.csdn.net/javaloveiphone/article/details/52081464
依賴范圍由<dependency></dependency>標(biāo)簽中<scope></scope>標(biāo)簽來定義。項(xiàng)目如果要使用某個(gè)框架或依賴,需要把相關(guān)jar包引用到classpath中,maven項(xiàng)目提供了三個(gè)classpath:編譯、測試、運(yùn)行。
依賴的范圍用于控制依賴于三種classpath關(guān)系的,包括:compile、provided、runtime、test、system、import
compile:默認(rèn)范圍,編譯、測試、運(yùn)行都有效
provided:編譯和測試有效,最后運(yùn)行不會(huì)被加入,如tomcat依賴
runtime:在測試和運(yùn)行的時(shí)候有效,編譯不會(huì)被加入,比如jdbc驅(qū)動(dòng)jar
test:測試階段有效,比如junit
system:與provided一致,編譯和測試階段有效,但與系統(tǒng)關(guān)聯(lián),可移植性差
import:導(dǎo)入的范圍,它只是用在dependencyManagement中,表示從其它的pom中導(dǎo)入dependency的配置
compile
默認(rèn)就是compile,什么都不配置也就是意味著compile。compile表示被依賴項(xiàng)目需要參與當(dāng)前項(xiàng)目的編譯,當(dāng)然后續(xù)的測試,運(yùn)行周期也參與其中,是一個(gè)比較強(qiáng)的依賴。打包的時(shí)候通常需要包含進(jìn)去。
test
scope為test表示依賴項(xiàng)目僅僅參與測試相關(guān)的工作,包括測試代碼的編譯,執(zhí)行。比較典型的如junit。
runntime
runntime表示被依賴項(xiàng)目無需參與項(xiàng)目的編譯,不過后期的測試和運(yùn)行周期需要其參與。與compile相比,跳過編譯而已,說實(shí)話在終端的項(xiàng)目(非開源,企業(yè)內(nèi)部系統(tǒng))中,和compile區(qū)別不是很大。比較常見的如JSR×××的實(shí)現(xiàn),對應(yīng)的API jar是compile的,具體實(shí)現(xiàn)是runtime的,compile只需要知道接口就足夠了。oracle jdbc驅(qū)動(dòng)架包就是一個(gè)很好的例子,一般scope為runntime。另外runntime的依賴通常和optional搭配使用,optional為true。我可以用A實(shí)現(xiàn),也可以用B實(shí)現(xiàn)。
provided
provided意味著打包的時(shí)候可以不用包進(jìn)去,別的設(shè)施(Web Container)會(huì)提供。事實(shí)上該依賴?yán)碚撋峡梢詤⑴c編譯,測試,運(yùn)行等周期。相當(dāng)于compile,但是在打包階段做了exclude的動(dòng)作。
system
從參與度來說,也provided相同,不過被依賴項(xiàng)不會(huì)從maven倉庫抓,而是從本地文件系統(tǒng)拿,一定需要配合systemPath屬性使用。
例子
<dependency>
<groupIdjunit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!-- 只在測試階段使用該依賴 -->
<scope>test</scope>
</dependency>
<!-- 只在編譯、測試期有效,在運(yùn)行期無效,運(yùn)行期使用tomcat容器自己的jar包 -->
<!-- servlet support -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- jsp support -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
-
依賴沖突
**這個(gè)很重要 **
https://blog.csdn.net/javaloveiphone/article/details/52081464