1. 程式人生 > >使用 Sonatype Nexus 3 搭建 Maven 私服、本地私有 Maven 倉庫,Gradle 打包 jar 、arr 後自動上傳到 Nexus Maven 倉庫配置

使用 Sonatype Nexus 3 搭建 Maven 私服、本地私有 Maven 倉庫,Gradle 打包 jar 、arr 後自動上傳到 Nexus Maven 倉庫配置

1 下載 Nexus 3

官網截圖
這裡寫圖片描述

注:Nexus 3 版本的執行需要 jdk1.8

解壓

這裡寫圖片描述

得到 2 個資料夾

// Nexus 執行時所需要的檔案,如啟動指令碼
nexus-3.9.0-01  
// Nexus生成的配置檔案,日誌檔案,倉庫檔案
sonatype-work

這裡寫圖片描述

修改埠
【1】配置 nexus3 埠目錄:

\nexus-3.9.0-01-win64\sonatype-work\nexus3\etc\nexus.properties

這裡寫圖片描述

【2】或者修改全域性目錄:

\nexus-3.9.0-01-win64\nexus-3.9.0-01\etc\nexus
-default.properties

這裡寫圖片描述

2 安裝 Nexus 3

【1】將 \nexus-3.9.0-01-win64\nexus-3.9.0-01\bin 的絕對路徑加入系統的 PATH 環境變數,方便使用 cmd 命令
【2】或者也可以直接通過命令 切換到當前資料夾執行

//安裝 Nexus 3 服務
nexus /install
//啟動 Nexus 3 
nexus /start
//停止 Nexus 3 
nexus /stop
//解除安裝 Nexus 3 服務
nexus /uninstall
//啟動 Nexus 3 列印日誌
nexus /run
//其他命令 未測試
run-redirect
status
restart
force-reload

注:cmd 需要 以管理員方式執行,否則會報錯
對比圖

這裡寫圖片描述
注:安裝與執行需要一點時間

nexus /run 示意圖
這裡寫圖片描述

3 執行管理後臺

//埠號按照實際的來
http://127.0.0.1:8085/ 
//或
http://localhost:8085/
  • 主頁面 左側
    Browse
    ~Welcome
    ~Search
    ~Browse 瀏覽檢視資源或元件

這裡寫圖片描述

  • 主頁面右側 Sign In 登入
//預設賬號密碼
admin
admin123

登入後就可以通過 Repostitory —> Repostitories 進行元件的管理了
預設有幾個比較常用的庫

maven-releases:發行版元件, hosted 型別
maven-snapshots:快照(除錯版本)元件, hosted 型別
maven-central:maven 中央庫,就是代理

https://repo1.maven.org/maven2/,proxy 型別
maven-public:倉庫分組概念,虛擬的 把上面三個倉庫合併形成一個組,方便引用, group 型別

下圖 最下面就是 group 將三個倉庫合併成一個組了
這裡寫圖片描述

  • 代理 maven 中央庫

遠端倉庫的元件包快取, 下載過 jar 包,就無需再到網際網路上遠端的倉庫中下載, 而可以直接下載nexus 快取的那一份

這裡寫圖片描述

  • 工作示意圖

這裡寫圖片描述

4 Gradle 使用 Maven 私服

//常用中央庫彙總
//阿里雲
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public'}
//
google() : https://dl.google.com/dl/android/maven2/
//或者
 maven {
            url 'https://maven.google.com/'
            name 'Google'
}
//
jcenter() : https://jcenter.bintray.com/
mavenCentral() : https://repo.maven.apache.org/maven2/
//其他
https://jitpack.io/
https://repo1.maven.org/maven2/
http://repo1.maven.org/maven2/
//--只有 http
http://repo2.maven.org/maven2/ 
http://repository.jboss.org/nexus/content/groups/public/
http://uk.maven.org/maven2/
http://mirrors.ibiblio.org/pub/mirrors/maven2/    

//常用中央庫搜尋彙總
http://mvnrepository.com/
http://search.maven.org/
http://maven.aliyun.com/nexus/#welcome
https://maven-repository.com/

//本地
mavenLocal()  /.m2/settings.xml 配置的 localRepository 地址

統一使用 Maven 私服

 /*   google()
        jcenter()*/
        maven{
            url 'http://localhost:8085/repository/android-maven-public/'
        }

android-maven-public 是 group 組合了一系列 hosted 和 proxy

這裡寫圖片描述

5 上傳自定義元件到庫

【1】圖形化上傳

這裡寫圖片描述

上傳的結果
這裡寫圖片描述

將 \apache-maven-3.5.3-bin\apache-maven-3.5.3\bin 的絕對路徑加入系統的 PATH 環境變數,方便使用 cmd 命令,或者也可以直接通過命令 切換到當前資料夾執行

(2)配置 servers 賬戶密碼

配置 \apache-maven-3.5.3-bin\apache-maven-3.5.3\conf\settings.xml
或者 C:\Users\<User>\.m2\settings.xml 中的
<servers>  
   <server>  
      <id>releases</id>  
      <username>admin</username>   
      <password>admin123</password>  
  </server>   
  <server>   
     <id>snapshots</id>   
     <username>admin</username>  
     <password>admin123</password>   
     </server>  
</servers>  

注: 使用 mvn -X 命令 可以外掛當前生效的 settings.xml 路徑
這裡寫圖片描述

(3)上傳 (DrepositoryId 要和上面 server 配置的 id 一致,另外執行命令需要去掉換行)

 mvn deploy:deploy-file 
-DartifactId=zzz 
-Dversion=1.0.0  
-Dpackaging=jar 
-Dfile=D:\com-xxx-yyy-zzz-1.0.0.jar  
-Durl=http://127.0.0.1:8085/repository/maven-releases/ 
-DrepositoryId=releases 

這裡寫圖片描述

【3】Gradle uploadArchives
(1) 專案 gradle.properties 檔案加入


NEXUS_MAVEN_URL=http://localhost:8085/repository/maven-releases/
NEXUS_MAVEN_SNAPSHOT_URL=http://localhost:8085/repository/maven-snapshots/
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
# 'groupId:artifactId:version' 或 'groudId:artifactId:version@aar' 形式
POM_NAME=test_arr_name
POM_ARTIFACT_ID=test_arr
POM_GROUP_ID=com.louisgeek
POM_PACKAGING=aar
POM_DESCRIPTION=test_dependences_lib
POM_VERSION=1.0.0

(2)library build.gradle 加入

apply plugin: 'com.android.library'
//add maven plugin
apply plugin: 'maven'
android {
...
    uploadArchives {
        configuration = configurations.archives
        repositories {
            mavenDeployer {
                repository(url: NEXUS_MAVEN_URL) {
                    authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
                }
                snapshotRepository(url: NEXUS_MAVEN_SNAPSHOT_URL) {
                    authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
                }
                //'groupId:artifactId:version''groudId:artifactId:version@aar' 形式
                pom.project {
                    name POM_NAME
                    version POM_VERSION
                    artifactId POM_ARTIFACT_ID
                    groupId POM_GROUP_ID
                    packaging POM_PACKAGING
                    description POM_DESCRIPTION
                }
            }
        }
    }
    // 生成sources.jar  寫 artifacts {} 之前
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.srcDirs
    }
    artifacts {
        //編譯的原始碼型別
        archives androidSourcesJar
        //archives androidJavadocsJar
    }
   ...
   }

執行上傳

這裡寫圖片描述

結果

Executing tasks: [uploadArchives]

Configuration on demand is an incubating feature.
:library:androidSourcesJar UP-TO-DATE
:library:preBuild UP-TO-DATE
:library:preReleaseBuild UP-TO-DATE
:library:compileReleaseAidl UP-TO-DATE
:library:compileReleaseRenderscript UP-TO-DATE
:library:checkReleaseManifest UP-TO-DATE
:library:generateReleaseBuildConfig UP-TO-DATE
:library:generateReleaseResValues UP-TO-DATE
:library:generateReleaseResources UP-TO-DATE
:library:packageReleaseResources UP-TO-DATE
:library:platformAttrExtractor UP-TO-DATE
:library:processReleaseManifest UP-TO-DATE
:library:generateReleaseRFile UP-TO-DATE
:library:prepareLintJar UP-TO-DATE
:library:generateReleaseSources UP-TO-DATE
:library:javaPreCompileRelease UP-TO-DATE
:library:compileReleaseJavaWithJavac UP-TO-DATE
:library:extractReleaseAnnotations UP-TO-DATE
:library:mergeReleaseConsumerProguardFiles UP-TO-DATE
:library:mergeReleaseShaders UP-TO-DATE
:library:compileReleaseShaders UP-TO-DATE
:library:generateReleaseAssets UP-TO-DATE
:library:packageReleaseAssets UP-TO-DATE
:library:packageReleaseRenderscript NO-SOURCE
:library:processReleaseJavaRes NO-SOURCE
:library:transformResourcesWithMergeJavaResForRelease UP-TO-DATE
:library:transformClassesAndResourcesWithSyncLibJarsForRelease UP-TO-DATE
:library:compileReleaseNdk NO-SOURCE
:library:mergeReleaseJniLibFolders UP-TO-DATE
:library:transformNativeLibsWithMergeJniLibsForRelease UP-TO-DATE
:library:transformNativeLibsWithSyncJniLibsForRelease UP-TO-DATE
:library:bundleRelease UP-TO-DATE
:library:uploadArchives

BUILD SUCCESSFUL in 1s
25 actionable tasks: 1 executed, 24 up-to-date
0:03:33: Task execution finished 'uploadArchives'.

這裡寫圖片描述

【4】常見錯誤

(1)
Could not find metadata com.louisgeek:test_arr/maven-metadata.xml in remote (http://localhost:8085/repository/maven-releases/)

第一次執行 uploadArchives 會報,包也上傳成功了,第二次就不報錯了,不知道為啥,暫時距記錄一下

(2)
Return code is: 401, ReasonPhrase: Unauthorized. -> [Help 1]

解放方案:見 “(2)配置 servers 賬戶密碼 ”

(3)
Return code is: 400, ReasonPhrase: Repository does not allow upd ating assets: maven-releases.

解放方案:maven-releases 倉庫預設不允許重複部署,進入maven-releases的配置介面,將Deployment policy 由 Disable redeploy 策略 改為 Allow redeploy 策略
這裡寫圖片描述

6 簡單備份遷移

備份遷移以下檔案

//包含 maven 快取和配置
C:\Users\<User>\.m2
//包含 gradle 快取和配置
C:\Users\<User>\.gradle
//包含 nexus 快取和配置
\nexus-3.9.0-01-win64

至新裝置,同時此法針對只有內網裝置同樣可用(所以私服也是可以用來解決只有內網的裝置使用 Maven 和 Gradle 開發的一種方案)