Sonatype Nexus的安裝配置參見:CentOS系統中安裝Nexus並導入已有的構件庫。Nexus內置了Jetty容器,${NEXUS_HOME}/bin/jsw目錄下包含了各個操作系統的啟動腳本。當然,如果你不喜歡內置的Jetty容器,也可以下載Nexus的war包,部署在tomcat等容器中。
安裝部署后,比較重要的是能夠對其進行深入的管理和配置,本文將介紹一些關於Sonatype Nexus的高級配置技巧,方便您進行配置管理。
1、使用Maven上傳組件注意事項
- host類型的倉庫才允許上傳組件
- 倉庫需要開啟允許上傳功能,配置選項中的Deployment Policy選擇“Allow Redeploy”,見下圖
- Nexus用戶必須具有“Artifact Upload”的權限,Nexus內置了一些角色,比如“Nexus Deployment Role”,就可以上傳組件
- Maven主配置文件中需要配置用戶信息及上傳的倉庫信息,配置示例如下:
-
<server> <id>thirdparty</id> <username>deployment</username> <password>password</password> </server>
2、修改監聽端口
默認情況下,Nexus監聽端口8081。可以通過以下方法更改這個端口。
- 停止Nexus
- 編輯${NEXUS_HOME}/conf/plexus.properties文件,修改applicationPort的值
- 重啟Nexus。
3、使Nexus支持其它格式的包
Nexus默認支持jar、war、pom、ejb、ear、rar、par等類型的包,如果希望能添加一些其它類型的包,可以配置如下:
在${nexus-work}/conf/packaging2extension-mapping.properties配置文件中增加配置:
my-custom-packaging=myextension
如果該配置文件不存在則手動創建該文件。
4、更新倉庫索引
1)強制更新索引
nexus索引經常會出現與遠程倉庫索引不一致的情況,導致某些包不能正常下載,可以強制更新倉庫索引,保持索引同步:
- 以管理員身份登錄
- 右鍵點擊倉庫,選擇Expire Cache
- 右鍵點擊倉庫,選擇Update Index
2)定時更新索引
- 以管理員身份登錄
- 左側導航欄選擇Administration->Scheduled Tasks
- 點擊add添加一個計划任務
- 任務類型選擇:Update Repositories Index,Repository/Group選擇要更新的倉庫,Recurrence選擇計划任務的周期類型
5、調試組件下載過程
如果Nexus本地索引中包含組件,但是卻不能下載,可能的原因如下:
- 包含組件的組件庫不在group類型的組件庫中
- 路由規則封鎖了組件的下載
Nexus提供了可以調試組件下載過程的方法,在組件的下載全路徑后面增加參數“?describe”,示例如下:
http://localhost:8081/nexus/content/groups/public/foo/bar/1.0/bar-1.0.jar?describe
Nexus將會以json的形式返回調試的輸出結果,結果主要包括:
- 組件的地址
- 組件是否可以找到以及原因
- 如果能找到組件,統計查找組件的過程
示例返回結果如下:
{
"data":{
"requestUrl":"http://localhost:8081/nexus/content/groups/public/test/project/1.0/project-1.0.jar?describe",
"processingTimeMillis":471,
"request":{
"requestUrl":"http://localhost:8081/nexus/content
/groups/public/test/project/1.0/project-1.0.jar?describe",
"requestPath":"/test/project/1.0/project-1.0.jar",
"requestContext":[
"request.received.timestamp=1276286536595",
"request.address=0:0:0:0:0:0:0:1%0",
"request.remoteOnly=false",
"request.url=http://localhost:8081/nexus/content/groups/public/test/project/1.0/project-
1.0.jar?describe",
"request.localOnly=false",
"request.appRootUrl=http://localhost:8081/nexus"
]
},
"response":{
"responseType":"NOT_FOUND",
"processedRepositoriesList":[
"public",
"snapshots",
"thirdparty",
"central",
"java.net-m2",
"java.net-m1-m2",
"google",
"apache-snapshots",
"codehaus-snapshots"
],
"appliedMappings":[
"public repository applied [11b647d6117038d8=
[type=EXCLUSION, groupId=public, patterns=[.*/project/.*], mappedRepositories=[releases]]]"
]
}
}
}
注意查看其中的response節點,如上例中的"responseType":"NOT_FOUND"表示未找到組件,通過該方法可以詳細排查組件不能下載的原因。
再提供一個pom類型的包“mojo-parent-30.pom”的調試示例
{
"data": {
"requestUrl": "http://192.168.120.202:8081/nexus/content/groups/public/org/codehaus/mojo/mojo-parent/30/mojo-parent-30.pom?describe",
"processingTimeMillis": 1322,
"request": {
"requestUrl": "http://192.168.120.202:8081/nexus/content/groups/public/org/codehaus/mojo/mojo-parent/30/mojo-parent-30.pom?describe",
"requestPath": "/org/codehaus/mojo/mojo-parent/30/mojo-parent-30.pom",
"requestContext": [
"request.remoteOnly=false",
"request.localOnly=true"
]
},
"response": {
"responseType": "FILE",
"responseActualClass": "org.sonatype.nexus.proxy.item.DefaultStorageFileItem",
"responsePath": "/groups/public/org/codehaus/mojo/mojo-parent/30/mojo-parent-30.pom",
"responseUid": "central:/org/codehaus/mojo/mojo-parent/30/mojo-parent-30.pom",
"originatingRepositoryId": "central",
"originatingRepositoryName": "Central",
"originatingRepositoryMainFacet": "org.sonatype.nexus.proxy.maven.MavenProxyRepository",
"processedRepositoriesList": [ ],
"properties": [
"created=1333560570000",
"modified=1333560570000",
"lastRequested=1375255131976",
"remoteChecked=1375255131556",
"remoteUrl=http://repo1.maven.org/maven2/org/codehaus/mojo/mojo-parent/30/mojo-parent-30.pom",
"storedLocally=1375255131556",
"isExpired=false",
"readable=true",
"writable=true",
"virtual=false"
],
"attributes": [
"digest.md5=61a1f7765d45a51a6a7bb03bf410588f",
"digest.sha1=be742febdaa3cc7a971dacdf8cdc7ebd94b5765b",
"remote.sha1=be742febdaa3cc7a971dacdf8cdc7ebd94b5765b",
"request.address=192.168.120.121",
"request.user=anonymous",
"storageItem-checkedRemotely=1375255131556",
"storageItem-created=1333560570000",
"storageItem-expired=false",
"storageItem-generation=2",
"storageItem-lastRequested=1375255131976",
"storageItem-length=26627",
"storageItem-modified=1333560570000",
"storageItem-path=/groups/public/org/codehaus/mojo/mojo-parent/30/mojo-parent-30.pom",
"storageItem-readable=true",
"storageItem-remoteUrl=http://repo1.maven.org/maven2/org/codehaus/mojo/mojo-parent/30/mojo-parent-30.pom",
"storageItem-repositoryId=central",
"storageItem-storedLocally=1375255131556",
"storageItem-writable=true"
]
}
}
}