文章大綱
引言
在前面的系列文章中總結了開發Gradle插件的三種形式以及上傳Java項目及Android 項目至本地倉庫和遠程JCenter倉庫的核心步驟和方法,其實除了前面的三種形式,我們還可以把自己的Java項目和Android項目上傳到我們自己的內部的Nexus私服僅供內部人員使用,其實無論是把使用何種倉庫存儲何種構件核心步驟都是大同小異的。簡而言之,Maven倉庫可以放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven項目可以從同一個Maven倉庫中獲取自己所需要的依賴JAR,這節省了磁盤資源,能幫助我們管理構件,而Nexus是maven倉庫管理器軟件系統,可以用於管理多個Maven倉庫,用來構建maven的本地服務器,接下來我將以Windows 搭建Nexus 3私服爲例。
- Android 進階——自定義Gradle插件的三種方式初探與上傳至本地倉庫完全攻略(一)
- Android 進階——上傳Java項目及Android AAR至JCenter遠程倉庫完全攻略(二)
- Android 進階——上傳Java項目及Android AAR至JCenter遠程倉庫完全攻略(三)
- Android 進階——上傳Java項目及Android AAR至個人Nexus 3私服倉庫完全攻略(四)
一、搭建Nexus 3私服
進入官網或者下載其他版本選擇對應的系統下載Nexus 安裝包並解壓到指定目錄即可。
如下圖所示
會看到有兩個文件夾:其中nexus-xx是Nexus 運行自身的一些庫的依賴的核心目錄所在;而sonatype-work目錄包含Nexus運行環境的配置文件、日誌文件、倉庫文件、索引文件、插件文件、緩存文件等。默認情況下使用的端口號是8081,如果你想要修改的話可以在sonatype-work\nexus3\etc目錄下的修改nexus.properties文件。
最簡單的情況下,這些都不需要去配置,你電腦安裝了JDK之後,就可以通過nexus.exe /run運行Nexus了(你可以把對應的目錄配置到環境變量或者寫到一個批處理文件中,這些只是讓你更便捷操作而已)
window 批處理文件 nexus.bat
第一次啓動可能需要等待一些時間,你看到Started Sonatype Nexus OSS 3.xxx就說明已經啓動成功了,此時可以通過http://localhost:8081訪問你本地的私服了(如果是運行在服務器上的話換成對應的IP和端口號即可),通過默認用戶admin(默認密碼爲admin123)登錄之後就會看到以下網頁:
至此,Nexus可以正常工作了,接下來就是對Nexus網頁系統上的各種操作了(比如根據自己的需求修改用戶、增加用戶、創建倉庫repo、配置權限、上傳構建等等,),不過如果你想進行個性化的配置,以讓其運行更高效,還可以修改nexus-3.16.2-01\bin\nexus.vmoptions文件配置虛擬機的運行參數(因爲它也是需要運行在虛擬機中的)
創建自己的倉庫repo
至於Nexus的更多知識不在本篇討論。
二、上傳Java項目至Nexus 私服
其實Nexus私服也可以直接通過它的圖形界面系統把我們自己的項目上傳到私服上,不過我更喜歡使用腳本上傳,所以這裏簡單介紹使用下步驟(其實和簽名上傳到JCenter差不多)
1、apply plugin: ‘maven-publish’ 引入插件
//groovydoc需要依賴groovy支持,所以需要引入groovy插件支持
apply plugin: 'groovy'
2、創建自定義task 打包要上傳到Nexus的產物
這裏可能需要依賴groovydoc 任務,而java項目默認是沒有引入groovy支持的,我們得自己去引入groovy插件(具體參見前面文章)
3、 配置maven-publish插件的publications節點和repositories
最終完整版的上傳到Nexus的腳本文件uploadjar2nexus.gradle如下:
group "com.crazymo"
version 1.0
apply plugin:'maven-publish'
/***************自定義增加額外的產出 start******************/
/**
* 源代碼打包任務(名爲hiplugin-1.0-source.jar)
*/
task sourcesJar(type:Jar){
baseName "hiplugin"
//分類器,用於區別其他jar包
classifier "sources"
//從main源集中的所有代碼
from sourceSets.main.allSource
}
/**
* 把自動生成的DOc打包成Jar包
* 這個docJar 依賴於系統的兩個任務,因爲只有這兩個任務生成doc之後才能把它們的產出打包到一起
*/
task docJar(type: Jar,dependsOn:[javadoc,groovydoc]){
baseName "hiplugin"
classifier "doc"
//從系統javadoc和groovydoc的Doc產出
from javadoc.destinationDir,groovydoc.destinationDir
}
/**
* 配置工程工件 即jar產出的配置,默認有java jar包,沒有sourcesJar和docJar
*/
artifacts{
archives sourcesJar
archives docJar
}
/*****************自定義增加額外的產出 end****************/
publishing{
publications{
//其中plugin爲任意名稱,components.java表示打包編譯後的產物即jar包
plugin(MavenPublication){
from components.java
//不指定的話默認爲項目名
artifactId 'nuxes-java'
/*********************把sourcesJar、docJar添加到上傳內容****************************/
artifact sourcesJar
artifact docJar
/*********配置pom的內容,pom本身就是以xml數據格式的結構組織的**************/
pom.withXml() {
//拿到pom文件的根節點
def root=asNode()
//把license節點添加到root節點下的licenses節點
def licenseNode=root.appendNode("licenses").appendNode('license')
licenseNode.appendNode("name","Apache License,Version 2.0")
licenseNode.appendNode("url","https://www.apache.org/license/LICENSE-2.0.txt")
licenseNode.appendNode("distribution","repo")
licenseNode.appendNode("comments","A business-friendly OSS license ")
}
}
}
//配置上傳的倉庫
repositories{
//上傳到Maven倉庫
maven{
//可以隨意取最終會生成一個對應的任務,對應artifactId
name 'j2nexus'
//Nexus私服中的倉庫地址,如果是服務器就把localhost替換成主機的IP地址,這也是將來使用時在allprojects的repositories下需要配置的地址
url 'http://localhost:8081/repository/CrazyMo/'
//上傳者的身份驗證
credentials{
username='admin'
password='admin123'
}
}
}
}
如果腳本沒有問題,編譯之後就會生成一個publishXxxPublicationToXxxRepository的任務。
執行這個任務之後就會自動上傳到Nexus倉庫中
4、使用Nexus 倉庫的庫
由於是使用Gradle語法來引入的所以還是根據group:artifactsId:version形式引入的,核心步驟與使用未上傳到JCenter公共庫時一樣,也是需要指定地址和對應的classpath 或者直接在構建腳本下的allprojects節點下配置地址。
引入成功之後,同樣會在默認的遠程緩存庫中看到有三個目錄分別存放pom、sourcesJar、docJar文件
就可以在我們的主Module中使用了
三、上傳Android項目至Nexus 私服
核心步驟大同小異,這裏不再詳細列出,使用android-maven插件上傳Android項目至Nexus的完整腳本uploadaar2nexus.gradle:
apply plugin: 'com.github.dcendents.android-maven'
group "com.crazymo.aar"
version 1.0
/**************生成構件***************/
/**
* 源代碼打包任務
*/
task sourcesJar(type:Jar){
//如果這裏不配置的話會自動以Module名稱命名
// baseName "jcaar"
//分類器,用於區別其他jar包
classifier "sources"
//從android main源集中的所有代碼,對應構建腳本中的子節點sourceSets 中的信息
from android.sourceSets.main.java.srcDirs
}
/**
* 自定義task 創建android 文檔,因爲Android項目沒有類似Java項目中的[javadoc,groovydoc]
* 因此需要自己定義task 創建文檔,根據Gradle提供的Javadoc 類傳入指定的參數即可
* @param Javadoc org.gradle.api.tasks.javadoc
*/
task myjavadoc(type: Javadoc){
failOnError false //必須添加以免出錯
options{
//如果你的項目裏面有中文註釋的話,必須將格式設置爲UTF-8,不然會出現亂碼
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
}
source = android.sourceSets.main.java.srcDirs
//這裏傳入的不是classifier分類器,因爲這個任務的產出不是jar包,把編譯時所有的calsspath傳遞到Javadoc中
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
/**
* 把自動生成的DOc打包成Jar包,
* 這個docJar 依賴於系統的兩個任務,因爲只有這兩個任務生成doc之後才能把它們的產出打包到一起
*/
task docJar(type: Jar,dependsOn:[myjavadoc]){
classifier 'doc' //分類器 區分其他jar包
from myjavadoc.destinationDir
}
/**************生成構件 end***************/
/**
* 配置工程工件 即jar產出的配置,默認有java jar包,沒有sourcesJar和docJar
*/
artifacts{
archives sourcesJar
archives docJar
}
// project homepage我這裏隨便亂寫的,如果託管在gayHub或者碼雲上可以寫碼雲的位置
def siteUrl = 'https://blog.csdn.net/CrazyMo_'
def gitUrl = 'https://blog.csdn.net/CrazyMo_' // project git
//這裏直接影響POM文件的結構
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging 'aar'
name 'Jtest for Android'
url siteUrl
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
developers {
developer { //填寫的一些基本信息
id 'crazymo'
name 'Crazy.Mo'
email '[email protected]'
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
uploadArchives {
repositories {
mavenDeployer {
repository(url: "http://localhost:8081/repository/CrazyMo/"){
authentication(userName: 'admin', password: 'admin123')
}
pom.project {
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
}
}
}
}
如果腳本沒有錯的話,就會看到在Gradle Task欄下看到uploadArchives任務
成功執行這個任務就可以上傳到Nexus了
至於使用Nexus的AAR步驟也和使用Nexus的Jar 一樣,不再列出。