一、Maven
1.1 為什麼寫Maven
工欲善其事,必先利其器。如今Java相關開發,基本離不開Maven、Gradle、MAT、Hudson之類的玩意,是以把本文當作工具篇吧,後續有空再整理其他工具。
1.2 概述
Maven是優秀的建構工具,但不僅僅是能建構,還有着強大的倉庫管理、項目管理相關的功能。我這介紹這一句話,像詳細了解它的所有描述或者建構工具的介紹,請自行百度谷歌或參考官網。
1.3 安裝
依賴JDK:下載下傳JDK的壓縮包,解壓,配置環境變量JAVA_HOME=安裝目錄、PATH=$JAVA_HOME/bin:$PATH 即完成。
安裝Maven:同樣下載下傳Maven的壓縮包,解壓,配置MAVEN_HOME=安裝目錄、PATH=$MAVEN_HOME/bin:$PATH 即完成。
檢查JDK : java -version 。 檢查Maven: mvn -version。
安裝後需要了解的是:Maven項目最核心就是pom.xml檔案(建立項目後才有),需要在項目中配置的就是配置在pom檔案中,還有少數全局配置是配置在maven安裝目錄中conf下的setting.xml中。
1.4 常用Maven網站
- 官網:https://maven.apache.org/
- Maven包查詢:http://mvnrepository.com/ http://search.maven.org/
- Maven國内鏡像:http://maven.oschina.net/content/groups/public/
- Maven插件查詢:http://maven.apache.org/plugins/
注:國内鏡像也有好些,可以自己找。因為周邊大多數人都用了開源中國的鏡像,是以我這邊也推薦它。
1.5 建立Maven項目
(1)了解建立符合maven規範的項目結構,即src/main/java、src/main/resources那套。
(2)建立pom.xml檔案。
(3)指令行可以通過Archetype指令生成項目骨架。Eclipse等IDE內建Maven後也可以建立Maven項目(推薦!!! )。
(4)常用指令
1.6 Pom檔案變量屬性
maven定義了很多變量,常見的maven屬性,了解下自己可用,閱讀其他項目的時候可看懂。
${basedir} 項目根目錄
${project.name}項目名
${project.version}項目版本号
${project.groupId}項目groupId
${project.build.directory} target目錄
${project.build.finalName} 打包的名字
二、依賴管理
2.1 概述
通過在pom.xml配置依賴坐标,Maven會自動幫我們下載下傳依賴的構件。
Maven的依賴主要是通過groupId、artifactId和version三者一起來确定一個構件的坐标。
2.2 例子
<dependencies>
<dependency>
<groupId>junit</groupId> <!-- groupId 公司群組織的辨別 -->
<artifactId>junit</artifactId> <!-- artifactId 項目或者子產品ID,在該groupID下必須唯一 -->
<version>4.10</version> <!-- version 版本号,帶SNAPSHOT為快照版本 -->
<scope>test</scope> <!-- scope 依賴範圍,預設為compile -->
<exclusions> <!-- exclusions 用來排除傳遞性依賴 -->
<exclusion> <!-- exclusions指定排除的依賴的groupId和artifactId -->
....
</exclusion>
</exclusions>
</dependency>
<dependencies>
2.3 關于dependencyManagement
這個标簽主要起到依賴統一管理的作用。一般maven開發多個項目的時候,都會建立一個parent父子產品來配置pom檔案統一管理公用的東西,(下面聚合和繼承就是講這部分)。在dependencyManagement下也是通過在dependencies标簽下配置依賴的,但它上面在dependencies标簽配置不同。
不同之處是:在dependencyManagement中配置了,項目并不會直接下載下傳依賴的構件,而是要在子子產品或者目前子產品的dependencies中進行配置,表明目前子產品需要用到的依賴,但此時就不用再指定版本号了。dependencyManagement也是以此來確定各個子產品對相同構件可以用同一版本,也就利于統一更新版本号等等。
<dependencyManagement> <!-- 可以把它看成構件的版本聲明,并不會引發下載下傳 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.5.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies> <!-- 必須配置它才會進行依賴下載下傳 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
三、倉庫
3.1 本地倉庫
本地倉庫沒啥好說的,在maven安裝目錄下的conf/setting.xml中配置localRepository就可以指定路徑。預設路徑則是在使用者根目錄下的.m2/repository。
作用:maven編譯子產品的時候,依賴的子產品都會按照本地->遠端(一般是私服)->中央的順序依次查找構件。平常開發的子產品也是通過mvn install安裝到本地倉庫,其他編譯時才能使用;而如果跟其他人合作開發則要通過deploy釋出到遠端倉庫。釋出後,别人下載下傳依賴也會将通過遠端或者中央倉庫下載下傳來的構件儲存到别人的本地倉庫。
<localRepository>D:\repository</localRepository>
3.2 遠端倉庫
一般在項目中,會在<repositories>标簽下配置遠端倉庫,可以配置多個,但id必須唯一。中央倉庫預設的id為central,可以不用配置;但如果有其他倉庫用這個id,則會覆寫中央倉庫。(不過,像一般公司都會自己搭建私服,是以也可以把central覆寫成我們私服的倉庫,我們也這樣做)。
在pom.xml中配置遠端倉庫的例子如下:
<repositories>
<repository>
<id>repo.springsource.org</id>
<name>repo.springsource.org-releases</name>
<url>http://repo.springsource.org/libs-milestone-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>nexus</id> <!-- 私服倉庫 -->
<name>TeamNexusRepository</name>
<url>http://localhost:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
...
</repositories>
另外還可以指定插件的倉庫:
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>TeamNexusRepository</name>
<url>http://localhost:8081/nexus/content/groups/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
在pom.xml中配置的遠端倉庫,隻會在pom檔案對應的子產品有效,即使配置在parent的pom中用來被繼承,那也隻是目前項目各個子產品有效。如果多個項目實際上都想用一樣的遠端倉庫(實際場景就是私服),那需要在setting.xml中利用profile來進行配置。
在setting.xml中配置遠端倉庫的例子如下:
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles> <!-- 激活profile -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
3.3 倉庫鏡像
除了以上配置之外,我們還可以在setting.xml裡面配置倉庫的鏡像,一般用于當通路某個倉庫的時候,可能由于網絡不同或者其他原因需要轉換到另外一個位址,這個時候就可以配置這個倉庫的鏡像。例如你想覆寫中央倉庫的預設位址,可以在setting.xml裡面這樣配置:
<mirrors>
<mirror>
<id>maven-net-cn</id>
<name>MavenChinaMirror</name>
<url>http://maven.net.cn/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
這裡通過<mirrorOf>标簽指定為central倉庫做鏡像,就是通路central的url不再是國外那個位址,而會被轉為我們配置的鏡像位址http://maven.net.cn/content/groups/public/ (也可以配置為私服位址等等), 而如果想為所有的倉庫做鏡像那麼可以改為 <mirrorOf>*</mirrorOf>。
在我的項目中,由于一般會把central設定為我們的私服倉庫,是以大部分情況下也就不用配置鏡像了。如果确實有多個倉庫的話,那确實可以用<mirrorOf>*</mirrorOf>的方式指向私服。
3.4 釋出到倉庫
<distributionManagement>
<repository>
<id>nexus</id>
<name>releases</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>snapshots</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</snapshotRepository>
</distributionManagement>
四、插件
4.1 概述
4.2 生命周期
4.3 常見插件
4.4 例子
4.5 關于pluginManagement
這個标簽跟dependencyManagement标簽一樣,也是為了起到統一管理的作用,隻是它統一管理了插件。跟依賴管理一樣,一般也會在parent父子產品來配置pom來配置pluginManagement,統一描述好插件之後,在子子產品中就不用完整的配置插件已經綁定的生命周期和執行目标等等,隻需要指定插件的groupId 和 artifactId就可以完成插件的引用。下面給出例子。
父子產品(parent子產品)的pom.xml中配置:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<!-- 如果父子產品這裡配置的話,則所有子子產品都會引用該插件!!是以一般隻用于通用插件。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
</plugins>
-->
</build>
其他子子產品需要單獨引用插件的,可以在pom.xml中配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
</plugins>
</build>
五、聚合和繼承
5.1 繼承
先說繼承吧,其實繼承就是為了抽出相同的東西,然後給項目的其他子產品一起共用,而不用每個子產品的pom.xml檔案都寫很多重複的東西。如果光說重複的工作量也就算了,有個重點是類似spring-core這種多個子產品都可能用到的依賴,如果每個子產品都自己配置自己的依賴和版本好,那很容易就會犯錯或者依賴的版本不一緻導緻錯誤等等。是以,在拆分多子產品開發的時候,盡量考慮使用繼承。
如何使用Maven繼承呢?
(1)建立一個檔案夾,隻建立一個pom.xml檔案即可。
(2)然後把各個子產品通用的東西寫到這個pom.xml中,如屬性定義,工廠定義,依賴坐标定義等等。
(3)把這個pom.xml中的<packaging>的值設定為pom。
(4)在各個子子產品中使用<parent>标簽指明自己使用的父項目。
關于父子產品的依賴配置注意兩點:
(1)一般都是通過<dependencyManagement>來配置所有依賴及其版本号,然後子子產品,在自己的pom檔案中聲明依賴即可,不用再指定版本,以確定統一。
(2)父項目中什麼時候直接配置<dependencies>呢?就是确定每個子子產品基本都會用的依賴,統一配置,不用每個子子產品再單獨去配的,比如junit、log4j這種。
5.2 聚合
聚合的作用在于可以把一個項目的多個子產品一起配置,這樣可以一次性編譯、安裝和釋出多個子產品。
一般項目都會把聚合和繼承都會放到同一個pom.xml檔案進行管理。
如何使用Maven聚合呢?
(1)建立一個檔案夾,隻建立一個pom.xml檔案。
(2)然後在這個pom.xml檔案中,把這個pom.xml中的<packaging>的值設定為pom和配置<modules>标簽即可。
如果其他子產品跟父pom.xml是同一層的話,如下圖:
則子產品的配置方式為:
<modules>
<module>hello-world</module>
<module>hello-spring</module>
</modules>
六、插件開發
待更新