Maven 是基於項目對象模型(POM project object model),能夠經過一小段描述信息(配置)來管理項目的構建,報告和文檔的軟件項目管理工具,簡單的說就是用來管理項目所須要的依賴且管理項目構建的工具。html
MAVEN_HOME
爲 Maven 的解壓目錄。PATH
中。<localRepository />
來指定本地倉庫路徑。mvn -version
驗證時是否成功。
打開 Idea 的配置面板,找到 Maven 配置頁。java
Maven home directory
:設置爲本地的 Maven 路徑User settings file
:勾選後面的 Override 能夠自定義 settings 文件,能夠指向 Maven 路徑下的 conf/settings.xml
Local repository
:勾選 Override 一樣能夠自定義倉庫路徑,默認會從配置的 settings 文件中讀取。Maven 經過 groupId、artifactId、version 三個變量來惟一肯定一個具體的依賴,俗稱 GAV。git
在 pom.xml 中咱們經過 dependency 來聲明座標信息(GAV),如咱們須要聲明對 4.2.6.RELEASE 版本 spring-core 包的依賴。spring
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.6.RELEASE</version> </dependency>
使用 <exclusions>
標籤下的 <exclusion>
標籤指定 GA 信息來排除,例如:排除 xxx.jar 傳遞依賴過來的 yyy.jardocker
<dependency> <groupId>com.xxx</groupId> <artifactId>xxx</artifactId> <version>x.version</version> <exclusions> <exclusion> <groupId>com.xxx</groupId> <artifactId>yyy</artifactId> </exclusion> </exclusions> </dependency>
進入工程根目錄,在命令行中運行shell
mvn dependency:tree
命令會列出依賴關係樹及各級依賴關係mvn dependency:analyze
分析依賴關係
Maven 項目有其餘標準的目錄組織結構,如上圖所示:apache
|- project: 項目目錄 |- src: 源碼目錄 |- src/main/java: 項目 java 源碼文件存放目錄 |- src/main/resources: 項目資源文件存放目錄 |- src/test/java: 項目單元測試源碼文件存放目錄 |- src/test/resources: 項目單元測試資源文件存放目錄 |- target: 項目編譯/打包後存放的目標路徑 |- pom.xml: 項目依賴管理配置文件
Maven 有 3 套生命週期,每套生命週期都包含了一些階段,這些階段是有序的,後面的階段依賴前面的階段。這三套生命週期是相互獨立的,能夠僅僅調用 clean 生命週期的某個階段, 或者調用 default 生命週期的某個階段,而不會對其餘生命週期產生任何影響。編程
default:構建項目後端
生命週期的執行:api
# 清理項目 mvn clean # 打包項目 mvn package # 打包並安裝到本地倉庫 mvn install
能夠組合各階段進行執行:
# 清理項目後打包併發布到遠程倉庫 mvn clean package deploy
settings 是用來設置 Maven 參數的配置文件,而且,settings.xml 是 Maven 的全局配置文件。settings.xml 中包含相似本地倉庫、遠程倉庫和聯網使用的代理信息等配置。
全局配置:${MAVEN_HOME}/conf/settings.xml
用戶配置:${user.home}/.m2/settings.xml
其實相對於多用戶的 PC 機而言,在 Maven 安裝目錄的 conf 子目錄下面的 settings.xml 纔是真正的全局的配置。而用戶目錄的 .m2 子目錄下面的 settings.xml 的配置只是針對當前用戶的。當這兩個文件同時存在的時候,那麼對於相同的配置信息用戶目錄下面的 settings.xml 中定義的會覆蓋 Maven 安裝目錄下面的 settings.xml 中的定義。用戶目錄下的 settings.xml 文件通常是不存在的,可是 Maven 容許咱們在這裏定義咱們本身的 settings.xml,若是須要在這裏定義咱們本身的 settings.xml 的時候就能夠把 Maven 安裝目錄下面的 settings.xml 文件拷貝到用戶目錄的 .m2 目錄下,而後改爲本身想要的樣子。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository/> <interactiveMode/> <usePluginRegistry/> <offline/> <pluginGroups/> <servers/> <mirrors/> <proxies/> <profiles/> <activeProfiles/> </settings>
該值表示構建系統本地倉庫的路徑。其默認值:~/.m2/repository
。
通常,倉庫的下載和部署是在 pom.xml 文件中的 repositories 和 distributionManagement 元素中定義的。然而,通常相似用戶名、密碼(有些倉庫訪問是須要安全認證的)等信息不該該在 pom.xml 文件中配置,這些信息能夠配置在 settings.xml 中。
<!--配置服務端的一些設置。一些設置如安全證書不該該和pom.xml一塊兒分發。這種類型的信息應該存在於構建服務器上的settings.xml文件中。 --> <servers> <!--服務器元素包含配置服務器時須要的信息 --> <server> <!--這是server的id(注意不是用戶登錄的id),該id與distributionManagement中repository元素的id相匹配。 --> <id>server001</id> <!--鑑權用戶名。鑑權用戶名和鑑權密碼錶示服務器認證所須要的登陸名和密碼。 --> <username>my_login</username> <!--鑑權密碼 。鑑權用戶名和鑑權密碼錶示服務器認證所須要的登陸名和密碼。密碼加密功能已被添加到2.1.0 +。詳情請訪問密碼加密頁面 --> <password>my_password</password> <!--鑑權時使用的私鑰位置。和前兩個元素相似,私鑰位置和私鑰密碼指定了一個私鑰的路徑(默認是${user.home}/.ssh/id_dsa)以及若是須要的話,一個密語。未來passphrase和password元素可能會被提取到外部,但目前它們必須在settings.xml文件以純文本的形式聲明。 --> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <!--鑑權時使用的私鑰密碼。 --> <passphrase>some_passphrase</passphrase> <!--文件被建立時的權限。若是在部署的時候會建立一個倉庫文件或者目錄,這時候就可使用權限(permission)。這兩個元素合法的值是一個三位數字,其對應了unix文件系統的權限,如664,或者775。 --> <filePermissions>664</filePermissions> <!--目錄被建立時的權限。 --> <directoryPermissions>775</directoryPermissions> </server> </servers>
用於定義一系列的遠程倉庫的鏡像。對於一個 Maven 項目,若是沒有特別聲明,默認使用 Maven 的 central 庫,url 爲 http://repo.maven.apache.org/...。可是這些遠程庫每每須要鏈接互聯網訪問,因爲訪問互聯網的限制或安全控制的須要,在企業內部每每須要創建對遠程庫的鏡像,即遠程庫的 mirror。
注意:
- 定義多個遠程倉庫鏡像時,只有當前一個 mirror 沒法鏈接的時候,纔會去找後一個,相似於備份和容災。
- mirror 也不是按 settings.xml 中寫的那樣的順序來查詢的。所謂的第一個並不必定是最上面的那個。當有 id 爲 B、A、C 的順序的 mirror 在 mirrors 節點中,Maven 會根據字母排序來指定第一個,因此無論怎麼排列,必定會找到 A 這個mirror來進行查找,當A沒法鏈接,出現意外的狀況下,纔會去B查詢。
當 Maven 須要到的依賴 jar 包不在本地倉庫時,就須要到遠程倉庫下載。這個時候若是 settings.xml 中配置了鏡像,並且鏡像配置的規則中匹配到目標倉庫時,Maven 認爲目標倉庫被鏡像了,不會再去被鏡像倉庫下載依賴 jar包,而是直接去鏡像倉庫下載。簡單而言,mirror 能夠攔截對遠程倉庫的請求,改變對目標倉庫的下載地址。
<mirrors> <!-- 給定倉庫的下載鏡像。 --> <mirror> <!-- 該鏡像的惟一標識符。id 用來區分不一樣的 mirror元素。 --> <id>mirrorId</id> <!-- 鏡像名稱 --> <name>PlanetMirror Australia</name> <!-- 該鏡像的URL。構建系統會優先考慮使用該URL,而非使用默認的服務器URL。 --> <url>http://downloads.planetmirror.com/pub/maven2</url> <!-- 被鏡像的服務器的id。例如,若是咱們要設置了一個 Maven 中央倉庫(http://repo.maven.apache.org/maven2/)的鏡像,就須要將該元素設置成 central。這必須和中央倉庫的id central徹底一致。 --> <mirrorOf>repositoryId</mirrorOf> </mirror> </mirrors>
使用鏡像能夠解決遠程依賴下載慢的問題。
<mirrors> <!--國內阿里雲提供的鏡像,很是不錯--> <mirror> <!--This sends everything else to /public --> <id>aliyun_nexus</id> <mirrorOf>central</mirrorOf> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> </mirrors>
在 settings.xml 中配置如上 mirrors,遠程的依賴就會從阿里雲鏡像中下載。
爲了知足一些複雜的需求,Maven 還支持更高級的鏡像配置:
<mirrorOf>*</mirrorOf>
:匹配全部遠程倉庫。<mirrorOf>external:*</mirrorOf>
:匹配全部遠程倉庫,使用 localhost 的除外,使用 file://
協議的除外。也就是說,匹配全部不在本機上的遠程倉庫。<mirrorOf>repo1,repo2</mirrorOf>
:匹配倉庫 repo1 和 repo2,使用逗號分隔多個遠程倉庫。<mirrorOf>*,!repo1</miiroOf>
:匹配全部遠程倉庫,repo1 除外,使用感嘆號將倉庫從匹配中排除。我的的 Maven 配置了阿里的鏡像,而項目中須要使用到一些第三方 jar 包,爲了方便引入,已上傳到192.168.0.201 的 nexus 私服下。但因爲我的 Maven 阿里的鏡像配置爲 <mirrorOf>*</mirrorOf>
,全部的倉庫都被鏡像,不會再去 192.168.0.201 下下載第三方 jar 包。
上傳的第三方 jar 包目標路徑:
http://192.168.0.201:8081/nexus/content/groups/public/com/alipay/sdk-java/20170615110434/sdk-java-20170615110434.pom
被鏡像後路徑:
http://maven.aliyun.com/nexus...
因此須要修改鏡像的 mirrorOf 規則,避免默認從鏡像中下載。
Maven的 conf/settings.xml
<mirrors> <!--國內阿里雲提供的鏡像,很是不錯--> <mirror> <!--This sends everything else to /public --> <id>aliyun_nexus</id> <!--對全部倉庫使用該鏡像,除了一個名爲maven_nexus_201的倉庫除外--> <!--這個名爲maven_nexus_201的倉庫能夠在javamaven項目中配置一個repository--> <mirrorOf>*,!maven_nexus_201</mirrorOf> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> </mirrors>
Maven 項目下的 pom.xml 配置一個遠程倉庫
<repositories> <!-- 192.168.0.201遠程倉庫 --> <repository> <id>maven_nexus_201</id> <name>maven_nexus_201</name> <layout>default</layout> <url>http://192.168.0.201:8081/nexus/content/groups/public/</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
<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/maven-v4_0_0.xsd "> <parent /> <!-- 聲明項目描述符遵循哪個 POM 模型版本。模型自己的版本不多改變,雖然如此,但它仍然是必不可少的, 這是爲了當 Maven 引入了新的特性或者其餘模型變動的時候,確保穩定性。 --> <modelVersion /> <groupId /> <artifactId /> <version /> <packaging /> <name /> <url /> <description /> <prerequisites /> <issueManagement /> <ciManagement /> <inceptionYear /> <mailingLists /> <developers /> <contributors /> <licenses /> <scm /> <organization /> <build /> <profiles /> <modules /> <repositories /> <pluginRepositories /> <dependencies /> <reports /> <reporting /> <dependencyManagement /> <distributionManagement /> <properties /> </project>
<!-- 父項目的座標。若是項目中沒有規定某個元素的值,那麼父項目中的對應值即爲項目的默認值。 座標包括group ID,artifact ID和 version。 --> <parent> <!-- 被繼承的父項目的構件標識符 --> <artifactId>xxx</artifactId> <!-- 被繼承的父項目的全球惟一標識符 --> <groupId>xxx</groupId> <!-- 被繼承的父項目的版本 --> <version>xxx</version> <!-- 父項目的pom.xml文件的相對路徑。相對路徑容許你選擇一個不一樣的路徑。默認值是../pom.xml。 Maven首先在構建當前項目的地方尋找父項目的pom,其次在文件系統的這個位置(relativePath位置), 而後在本地倉庫,最後在遠程倉庫尋找父項目的pom。 --> <relativePath>xxx</relativePath> </parent>
<!-- 項目的全球惟一標識符,一般使用全限定的包名區分該項目和其餘項目。而且構建時生成的路徑也是由今生成, 如com.mycompany.app生成的相對路徑爲:/com/mycompany/app --> <groupId>xxx</groupId> <!-- 構件的標識符,它和group ID一塊兒惟一標識一個構件。換句話說,你不能有兩個不一樣的項目擁有一樣的artifact ID 和groupID;在某個特定的group ID下,artifact ID也必須是惟一的。構件是項目產生的或使用的一個東西,Maven 爲項目產生的構件包括:JARs,源碼,二進制發佈和WARs等。 --> <artifactId>xxx</artifactId> <!-- 項目當前版本,格式爲:主版本.次版本.增量版本-限定版本號 --> <version>1.0-SNAPSHOT</version> <!-- 項目產生的構件類型,例如jar、war、ear、pom。插件能夠建立他們本身的構件類型,因此前面列的不是所有構件類型 --> <packaging>jar</packaging>
<packaging>
默認構件類型爲 jar,看成爲父級 Maven 項目的時候,構件類型爲 pom。
<!-- 模塊(有時稱做子項目) 被構建成項目的一部分。列出的每一個模塊元素是指向該模塊的目錄的相對路徑 --> <modules> <!--子項目相對路徑--> <module></module> </modules>
經過 <modules>
Maven 項目之間能夠造成父子關係,能夠有多個層級。
<!-- 發現依賴和擴展的遠程倉庫列表。 --> <repositories> <!-- 包含須要鏈接到遠程倉庫的信息 --> <repository> <!-- 如何處理遠程倉庫裏發佈版本的下載 --> <releases> <!-- true 或者 false 表示該倉庫是否爲下載某種類型構件(發佈版,快照版)開啓。 --> <enabled><enabled> <!-- 該元素指定更新發生的頻率。Maven 會比較本地 POM 和遠程 POM 的時間戳。 這裏的選項是:always(一直),daily(默認,每日),interval:X(這裏X是以分鐘爲單位的時間間隔),或者never(從不)。 --> <updatePolicy></updatePolicy> <!-- 當Maven驗證構件校驗文件失敗時該怎麼作:ignore(忽略),fail(失敗),或者warn(警告)。 --> <checksumPolicy></checksumPolicy> </releases> <!-- 如何處理遠程倉庫裏快照版本的下載。有了 releases 和 snapshots 這兩組配置,POM 就能夠在每一個單獨的倉庫中, 爲每種類型的構件採起不一樣的策略。例如,可能有人會決定只爲開發目的開啓對快照版本下載的支持。 --> <snapshots> <enabled><enabled> <updatePolicy></updatePolicy> <checksumPolicy></checksumPolicy> </snapshots> <!-- 遠程倉庫惟一標識符。能夠用來匹配在 settings.xml 文件裏配置的遠程倉庫 --> <id>banseon-repository-proxy</id> <!-- 遠程倉庫名稱 --> <name>banseon-repository-proxy</name> <!-- 遠程倉庫 URL,按 protocol://hostname/path 形式 --> <url>http://192.168.1.169:9999/repository/</url> <!-- 用於定位和排序構件的倉庫佈局類型-能夠是 default(默認)或者legacy(遺留)。Maven 2爲其倉庫提供了一個默認 的佈局;然而,Maven 1.x 有一種不一樣的佈局。咱們可使用該元素指定佈局是 default(默認)仍是 legacy(遺留)。 --> <layout> default </layout> </repository> </repositories>
<id>
能夠配合 settings.xml 中的遠程倉庫配置進行使用,見上一節中的案例。
<!-- 以值替代名稱,Properties 能夠在整個 POM 中使用,也能夠做爲觸發條件。格式是<name>value</name>。 --> <properties> <name>value</name> </properties>
<!-- 該元素描述了項目相關的全部依賴。 這些依賴組成了項目構建過程當中的一個個環節。它們自動從項目定義的倉庫中下載。 --> <dependencies> <dependency> <!-- 依賴的group ID --> <groupId>org.apache.maven</groupId> <!-- 依賴的artifact ID --> <artifactId>maven-artifact</artifactId> <!-- 依賴的版本號。 在 Maven 2 裏,也能夠配置成版本號的範圍。 --> <version>3.8.1</version> <!-- 依賴類型,默認類型是jar。它一般表示依賴的文件的擴展名,但也有例外。一個類型能夠被映射成另一個擴展 名或分類器。類型常常和使用的打包方式對應,儘管這也有例外。一些類型的例子:jar,war,ejb-client和test-jar。 若是設置extensions爲 true,就能夠在plugin裏定義新的類型。因此前面的類型的例子不完整。 --> <type>jar</type> <!-- 依賴的分類器。分類器能夠區分屬於同一個POM,但不一樣構建方式的構件。分類器名被附加到文件名的版本號後面。例如, 若是你想要構建兩個單獨的構件成JAR,一個使用Java 1.4編譯器,另外一個使用Java 6編譯器,你就可使用分類器來生 成兩個單獨的JAR構件。 --> <classifier></classifier> <!-- 依賴範圍。在項目發佈過程當中,幫助決定哪些構件被包括進來。欲知詳情請參考依賴機制。 - compile :默認範圍,用於編譯 - provided:相似於編譯,但支持你期待jdk或者容器提供,相似於classpath - runtime: 在執行時須要使用 - test: 用於test任務時使用 - system: 須要外在提供相應的元素。經過systemPath來取得 - systemPath: 僅用於範圍爲system。提供相應的路徑 - optional: 當項目自身被依賴時,標註依賴是否傳遞。用於連續依賴時使用 --> <scope>test</scope> <!-- 僅供system範圍使用。注意,不鼓勵使用這個元素,而且在新的版本中該元素可能被覆蓋掉。該元素爲依賴規定了文件 系統上的路徑。須要絕對路徑而不是相對路徑。推薦使用屬性匹配絕對路徑,例如${java.home}。 --> <systemPath></systemPath> <!-- 當計算傳遞依賴時,從依賴構件列表裏,列出被排除的依賴構件集。即告訴 Maven 你只依賴指定的項目,不依賴項目的 依賴。此元素主要用於解決版本衝突問題 --> <exclusions> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> <!-- 可選依賴,若是你在項目 B 中把 C 依賴聲明爲可選,你就須要在依賴於 B 的項目(例如項目 A)中顯式的引用對 C 的依賴。 可選依賴阻斷依賴的傳遞性。 --> <optional>true</optional> </dependency> </dependencies>
<!-- 繼承自該項目的全部子項目的默認依賴信息。這部分的依賴信息不會被當即解析,而是當子項目聲明一個依賴 (必須描述 groupId 和 artifactId 信息),若是 group ID 和 artifact ID 之外的一些信息沒有 描述,則經過 group ID 和 artifact ID 匹配到這裏的依賴,並使用這裏的依賴信息。 --> <dependencyManagement> <dependencies> <!-- 參見dependencies/dependency元素 --> <dependency> </dependency> </dependencies> </dependencyManagement>
<build> <!-- 該元素設置了項目源碼目錄,當構建項目的時候,構建系統會編譯目錄裏的源碼。 該路徑是相對於 pom.xml 的相對路徑。 --> <sourceDirectory></sourceDirectory> <!-- 該元素設置了項目單元測試使用的源碼目錄,當測試項目的時候,構建系統會編譯目錄裏的源碼。 該路徑是相對於 pom.xml 的相對路徑。 --> <testSourceDirectory></testSourceDirectory> <!-- 被編譯過的應用程序 class 文件存放的目錄。 --> <outputDirectory></outputDirectory> <!-- 被編譯過的測試 class 文件存放的目錄。 --> <testOutputDirectory></testOutputDirectory> <!-- 這個元素描述了項目相關的全部資源路徑列表,例如和項目相關的屬性文件, 這些資源被包含在最終的打包文件裏。 --> <resources> <!-- 這個元素描述了項目相關或測試相關的全部資源路徑 --> <resource> <!-- 是否使用參數值代替參數名。參數值取自 properties 元素或者文件裏配置的屬性,文件在 filters 元素裏列出。 --> <filtering></filtering> <!-- 描述存放資源的目錄,該路徑相對 pom.xml 路徑 --> <directory></directory> <!-- 包含的模式列表,例如**/*.xml. --> <includes> <include></include> </includes> <!-- 排除的模式列表,例如**/*.xml --> <excludes> <exclude></exclude> </excludes> </resource> </resources> <!-- 子項目能夠引用的默認插件信息。該插件配置項直到被引用時纔會被解析或綁定到生命週期。 給定插件的任何本地配置都會覆蓋這裏的配置 --> <pluginManagement> <!-- 參見 dependencies 元素 --> <plugins> </plugins> </pluginManagement> <!-- 該項目使用的插件列表 。 --> <plugins> <!-- plugin 元素包含描述插件所須要的信息。 --> <plugin> <!-- 插件在倉庫裏的 group ID --> <groupId></groupId> <!-- 插件在倉庫裏的 artifact ID --> <artifactId></artifactId> <!-- 被使用的插件的版本(或版本範圍) --> <version></version> <!-- 在構建生命週期中執行一組目標的配置。每一個目標可能有不一樣的配置。 --> <executions> <!-- execution元素包含了插件執行須要的信息 --> <execution> <!-- 執行目標的標識符,用於標識構建過程當中的目標,或者匹配繼承過程當中須要合併的執行目標 --> <id></id> <!-- 綁定了目標的構建生命週期階段,若是省略,目標會被綁定到源數據裏配置的默認階段 --> <phase></phase> <!-- 配置的執行目標 --> <goals></goals> <!-- 做爲DOM對象的配置 --> <configuration></configuration> </execution> </executions> <!-- 項目引入插件所須要的額外依賴 --> <dependencies> <!-- 參見dependencies/dependency元素 --> <dependency> </dependency> </dependencies> <!-- 做爲 DOM 對象的配置 --> <configuration></configuration> </plugin> </plugins> </build>
Nexus 是一個強大的 Maven 倉庫管理器,它極大的簡化了本地內部倉庫的維護和外部倉庫的訪問。
咱們採用 Docker 方式來安裝:
1. 拉取 nexus3 鏡像
# 拉取 nexus3 鏡像 docker pull sonatype/nexus3:3.16.0
2. 啓動 nexus3 容器
# 經過鏡像啓動容器 docker run -d --name nexus -p 8081:8081 -v /Users/linfuyan/Develop/nexus-data:/nexus-data sonatype/nexus3:3.16.0
-d:後臺模式運行容器--name:容器命名爲 nexus
-p:映射本地 8081 端口到容器內的 8081 端口
-v:將容器內的 /nexus-data 目錄掛載到本地目錄
3. 瀏覽器中訪問 localhost:8081 就能夠看到 Nexus 頁面了。
注意:3.6.0 版本的 sonatype/nexus3 沒法查看到 upload 頁面。
3.27.0 版本的 sonatype/nexus3 在我電腦上跑不起來,並且初始密碼存在 admin.password 文件中。
最終選擇了 3.16.0 版本。
經過右上角的 sign in 按鈕,輸入默認帳號密碼 admin/admin123
能夠對倉庫等進行管理。
可選 Maven2 group、hosted、proxy 類型。
hosted:本地倉庫,一般咱們會部署本身的構件到這一類型的倉庫。好比公司的第二方庫。
proxy:代理倉庫,它們被用來代理遠程的公共倉庫,如 Maven 中央倉庫。
group:倉庫組,用來合併多個hosted/proxy倉庫,當你的項目但願在多個 repository 使用資源時就不須要屢次引用了,只須要引用一個 group 便可。
新建 hosted 類型倉庫
把 craft4j 添加到 maven-public 中。
上傳成功之後,就能夠在對應的遠程倉庫中查看到上傳完成的組件信息。
➜ ron-jwt git:(master) ✗ mvn deploy:deploy-file -DgroupId=io.craft4j -DartifactId=checkstyle -Dversion=1.0.1-SNAPSHOT -Dpackaging=jar -Dfile=/Users/linfuyan/Code/java-lab/airplan-java-server/codestyle/checkstyle-7.0-all.jar -DrepositoryId=craft4j -Durl=http://127.0.0.1:8081/repository/craft4j/ [INFO] Scanning for projects... [INFO] [INFO] ------------------< org.apache.maven:standalone-pom >------------------- [INFO] Building Maven Stub Project (No POM) 1 [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] --- maven-deploy-plugin:2.7:deploy-file (default-cli) @ standalone-pom --- Downloading from remote-repository: http://127.0.0.1:8081/repository/craft4j/io/craft4j/checkstyle/1.0.1-SNAPSHOT/maven-metadata.xml Downloaded from remote-repository: http://127.0.0.1:8081/repository/craft4j/io/craft4j/checkstyle/1.0.1-SNAPSHOT/maven-metadata.xml (770 B at 3.7 kB/s) Uploading to remote-repository: http://127.0.0.1:8081/repository/craft4j/io/craft4j/checkstyle/1.0.1-SNAPSHOT/checkstyle-1.0.1-20200910.081245-2.jar Uploading to remote-repository: http://127.0.0.1:8081/repository/craft4j/io/craft4j/checkstyle/1.0.1-SNAPSHOT/checkstyle-1.0.1-20200910.081245-2.pom
repositoryId 依賴 settings.xml 中的 server 配置,主要是用戶名與密碼。
在上面的步驟中,已經將新建的 craft4j 倉庫添加到 maven-public 倉庫組中。
在 settings.xml 中修改配置:
<servers> <server> <id>nexus-releases</id> <username>dev</username> <password>dev123</password> </server> <server> <id>craft4j</id> <username>dev</username> <password>dev123</password> </server> </servers>
在項目 pom.xml 中修改配置:
<distributionManagement> <repository> <id>maven-releases</id> <name>Nexus Release Repository</name> <url>http://127.0.0.1:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <id>craft4j</id> <name>Nexus Snapshot Repository</name> <url>http://127.0.0.1:8081/repository/craft4j/</url> </snapshotRepository> </distributionManagement>
pom.xml 中的 repository id 與 settings.xml 中的 server id 相對應,須要保持一致。
在須要發佈的項目中執行 mvn deploy
,看到以下日誌,就說明發布成功了,一樣能夠在 Nexus 的倉庫瀏覽頁中查看。
➜ ron-jwt git:(master) ✗ mvn clean deploy [INFO] Scanning for projects... [INFO] [INFO] ---------------------------< io.ron:ron-jwt >--------------------------- [INFO] Building ron-jwt 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] ... [INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ ron-jwt --- Downloading from craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/1.0-SNAPSHOT/maven-metadata.xml Uploading to craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/1.0-SNAPSHOT/ron-jwt-1.0-20200910.071640-1.jar Uploaded to craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/1.0-SNAPSHOT/ron-jwt-1.0-20200910.071640-1.jar (15 kB at 21 kB/s) Uploading to craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/1.0-SNAPSHOT/ron-jwt-1.0-20200910.071640-1.pom Uploaded to craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/1.0-SNAPSHOT/ron-jwt-1.0-20200910.071640-1.pom (1.3 kB at 2.6 kB/s) Downloading from craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/maven-metadata.xml Uploading to craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/1.0-SNAPSHOT/maven-metadata.xml Uploaded to craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/1.0-SNAPSHOT/maven-metadata.xml (757 B at 2.0 kB/s) Uploading to craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/maven-metadata.xml Uploaded to craft4j: http://127.0.0.1:8081/repository/craft4j/io/ron/ron-jwt/maven-metadata.xml (271 B at 1.0 kB/s) [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 5.243 s [INFO] Finished at: 2020-09-10T15:16:42+08:00 [INFO] ------------------------------------------------------------------------
使用 Maven 做爲依賴管理工具,通常咱們對於依賴的版本號,常見兩種類型:一種以「-RELEASE」結尾,另外一種以「-SNAPSHOT」結尾。
私服中,會存在 snapshot 快照倉庫和 release 發佈倉庫,snapshot 快照倉庫用於保存開發過程當中的不穩定版本,release 正式倉庫則是用來保存穩定的發行版本。
Maven 會根據模塊的版本號(pom 文件中的 version)中是否帶有「-SNAPSHOT」(注意這裏必須是所有大寫)來判斷是快照版本仍是正式版本。若是是快照版本,那麼在 mvn deploy 時會自動發佈到私服的快照版本庫中;若是是正式發佈版本,那麼在 mvn deploy 時會自動發佈到正式版本庫中。
快照版本的依賴,Maven 編譯打包的時候不管本地是否存在,都會去私服拉取最新的,而正式版本的依賴,若是本地倉庫已經存在,Maven 不會去私服拉取最新的版本,因此咱們要基於快照版本進行開發,可是上線的時候必定記得變成正式版,不然若是本地正在進行開發另外一個功能,提交到私服的代碼有可能會被誤上線。
那咱們有什麼好的方法來避免這種狀況呢?
1. 在 settings.xml 中修改私服配置,經過 updatePolicy 爲 always 強制更新。
<profile> <id>nexus</id> <repositories> <repository> <id>nexus</id> <name>Nexus</name> <url>http://127.0.0.1:8081/repository/groups/maven-public/</url> <releases> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> </pluginRepository> </pluginRepositories> </profile>
2. 在構建的時候加上「-U」參數,強制拉取全部依賴的最新代碼
mvn clean install -U
3. 語義化版本
首先,咱們在團隊協做時,要定義好開發中的依賴必定不要忘記升級版本號,而後開發的過程當中還要保持版本號以「-SNAPSHOT」結尾,來把該依賴做爲快照版本進行開發,這樣每次別人更新完上傳到私服之後,你本地打包時會自動拉取最新代碼,從而方便咱們的開發和維護。
參考與致謝
若是你看完本文有收穫,歡迎關注微信公衆號:精進Java(ID: craft4j),更多 Java 後端與架構的乾貨等你一塊兒學習與交流。