| Table of Contents What is Maven? Maven 中央庫 如何將jar包發布到Maven中央庫 註冊Maven中央庫帳號 向Maven中央庫申請一個倉庫 本地Maven配置(官方說明) 使用GPG對java項目包進行簽名(官方說明) 使用mvn(Maven)進行打包上傳 正式 Release 項目 如果是第一次發布,需要通知管理員啟用該倉庫和Maven中央庫的同步 注意的問題 |
What is Maven?
Maven就是一套專案管理架構:
一個項目物件模型 (Project Object Model),
一組標準集合,
一個專案生命週期(Project Lifecycle),
一個依賴管理系統(Dependency Management System),
和用來運行定義在生命週期階段(phase)中外掛程式(plugin)目標(goal)的邏輯。 Maven 中央庫
Maven可以自己搭建,也可以使用線上搭建好的Maven平台,Maven 中央庫就是一個線上提供java項目託管的Maven平台。將項目發布到Maven中央庫後,其他人就可以根據項目的名稱或Id直接擷取到相應的jar包,同時Maven還解決了項目依賴的問題。(類似Python社區的pypi) 如何將jar包發布到Maven中央庫 註冊Maven中央庫帳號
在 [http://oss.sonatype.org] 註冊帳號(註:Sonatype是Maven中央庫的管理系統),註冊之後獲得使用者名稱,密碼。 向Maven中央庫申請一個倉庫
在Sonatype的JIRA系統中,建立一個issue(選擇Project: Community Support - Open Source Project Repository Hosting; Issue Type: New Project),告訴Sonatype管理員,你想託管一個項目到Sonatype上。注意該Issue建立完之後,只有管理員有更改許可權,因此,小心不要寫錯資訊(詳見官方說明)。建立完之後,需要等待Sonatype管理員審核,一般不超過2個工作日,一旦審核通過,會在該Issue上標明Resolved,這就是說中央庫已經準備好,可以隨時上傳自己的檔案了。 本地Maven配置(官方說明)
本地需要安裝工具:JDK && Maven,Maven安裝方法詳見文檔,以及GPG簽名工具
告訴Maven我們之前在Maven中央庫上申請的帳號,即在maven工具的設定檔~/.m2/settings.xml中添加如下:
<server> <id>sonatype-nexus-snapshots</id> <username>USERNAME</username> <password>PASSWORD</password> </server> <server> <id>sonatype-nexus-staging</id> <username>USERNAME</username> <password>PASSWORD</password> </server>
然後就是修改位於項目根目錄的pom.xml檔案,這個檔案是Maven行為的總指揮設定檔,類似於Makefile,用來告訴Maven關於項目編譯,打包,簽名,依賴對象在Maven中央庫上的位置等重要訊息。
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.coaku</groupId> <artifactId>sdk</artifactId> <version>1.1.1-SNAPSHOT</version> <packaging>jar</packaging> <name>java-sdk</name> <url>http://www.coaku.com/</url> <description> Qiniu Resource (Cloud) Storage SDK demo for Java</description> <licenses> <license> <name>The MIT License</name> <url>http://opensource.org/licenses/MIT</url> </license> </licenses> <parent> <groupId>org.sonatype.oss</groupId> <artifactId>oss-parent</artifactId> <version>7</version> </parent> <scm> <connection>scm:git:git@github.com:coaku/java-sdk.git</connection> <developerConnection>scm:git:git@github.com:coaku/java-sdk.git</developerConnection> <url>git@github.com:coaku/java-sdk.git</url> </scm> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>utf-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal>sign</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <denpendencies> ... </denpendencies> </project>
使用GPG對java項目包進行簽名(官方說明)
> gpg --gen-key // 填寫一系列資訊後產生一對公密鑰,這期間需要手動輸入一個passphrase密碼,後面簽名時會用到 > gpg --list-keys // 列出產生的key資訊 /home/coaku/.gnupg/pubring.gpg ------------------------------ pub 2048R/11FCA5B2 2013-07-10 uid Qiniu Resource Storage <qbox.team@gmail.com> sub 2048R/DAE43050 2013-07-10 > gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 11FCA5B2 // 將公開金鑰上傳到一台公開金鑰伺服器供別人下載 其他人可以通過如下方式擷取公開金鑰: > gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 11FCA5B2
使用mvn(Maven)進行打包上傳
maven上的發布分為兩種發布版本,一種是SNAPSHOT版本,一種是正式RELEASE版本,這兩種發布過程不一樣,但都要求pom.xml配置中項目的版本號碼後面要帶有"-SNAPSHOT"格式,只是在正式RELEASE時候,maven會自動將"-SNAPSHOT"尾碼去掉。
上傳SNAPSHOT版本:
> mvn clean deploy -Dgpg.passphrase=<PASSPHRASE> // <passphrase>即之前產生gpg公密鑰時候手動輸入的密碼,下面也是
上傳正式RELEASE版本:
> mvn release:clean > mvn release:prepare -Darguments=-Dgpg.passphrase=<PASSPHRASE> > mvn release:perform -Darguments=-Dgpg.passphrase=<PASSPHRASE>
正式 Release 項目
在Sonatype的管理員將上傳的項目正式同步到Maven中央庫之前,項目會存在於一個中間狀態的倉庫中(Staging Repository),起始狀態為open,我們需要將它變為close。步驟如此.
在狀態變為close的過程中,Maven會對項目進行一系列的檢查,如果通過了檢查,狀態會順利切換到close。
切換到close後,就能夠正式release這個項目,切換方法同close一樣,點擊release按鈕即可。 如果是第一次發布,需要通知管理員啟用該倉庫和Maven中央庫的同步
回到之前發布的那個issue上,回複給管理員,說自己的倉庫已經release了,管理員在收到回複後會啟用這個倉庫和Maven中央庫的同步工作。 注意的問題
1. pom.xml中項目版本號碼一定要是"x.x.x-SNAPSHOT"格式
2. pom.xml中對scm(軟體組態管理)的配置要正確,如果是github,那麼需要以ssh認證的方式配置對github的訪問,詳情,因為mvn在上傳過程中涉及到對github的push動作。
3. 在使用mvn進行上傳之前,要確保本地的代碼和scm中的最新版本的一致。