Nexus介绍
Nexus是一个强大的Maven仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。
Nexus私服的部署安装
需求环境:jdk1.8、maven3
java环境
- 安装java的JDK
http://www.oracle.com/technetwork/java/javase/downloads/index.html
-
设置 JAVA_HOME
VNM`(~OEC~~}8C0_0Y$O(0D.png -
Windows打开命令控制台
U8DETDGGLY90I4CH$K$S@AW.png
Maven安装
- 下载Maven最新版本
-
解压文件到你想要的位置来安装 Maven
CR_7{UJ80HC7_0V7BD7DH@B.png -
设置 Maven 环境变量
添加 M2_HOME、M2、MAVEN_OPTS 到环境变量中
DHYBJD63{GBCILYVY4MY%GK.png
添加 Maven bin 目录到系统路径中
mavenbin
-
验证 Maven 安装
maven --version
Nexus3部署
- 下载Nexus3
-
解压到你想放的位置
PK~NW5B1MOP4L52(LYT~4C0.png -
修改nexus-default.properties
L%AQLWXIV8FPO@BRH{5EYUG.png
-
安装nexus服务
nexus
nexus安装成功先要安装服务 nexus /install nexus
配置阿里云私服代理
D1%THA9(~68)L(J0M(%TAIP.png
配置阿里云私服代理的google仓库
SSR$1(4)ATXQ$@_{6YKGW66.png
- 这里必须配置,不然在build.gradle中就必须添加google()
- https://maven.aliyun.com/repository/google
配置自己的仓库组
public-zero在build.gradle里面配置私服zero-public
WPF2{4H0{AHB2J{J7J4`}I3.png全局配置的脚本init.gradle
//并保存到 USER_HOME/.gradle/文件夹下即可
allprojects {
repositories {
mavenLocal()
maven{
url 'http://192.168.0.107:8083/repository/zero-public/'
name "zero-public"
}
}
buildscript{
repositories {
mavenLocal()
maven{
url 'http://192.168.0.107:8083/repository/zero-public/'
name "zero-public"
}
}
}
task showRepos(group:'Help',
description:'Show all of the repository that had been config'){
repositories.each {
println it.name
println "\t"+it.url
}
}
}
上传私有类库
- 自定义了一个jks签名
OXXF(SZ`00LBG3`H(}JA0H4.png
2.在build.gradle中添加org.jetbrains.dokka:dokka-android-gradle-plugin
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// classpath "org.jetbrains.dokka:dokka-gradle-plugin:0.10.0"
classpath "org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.18"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
- 编写上传脚本upload.gradle
////安装到.m2本地仓库
//install {
// repositories.mavenInstaller {
// pom.version = "$project.version"
// pom.artifactId = "$artifactId"
// pom.groupId = "$project.group"
// }
//}
apply plugin: 'maven'
apply plugin: 'signing'
//apply plugin: 'org.jetbrains.dokka'
apply plugin: 'org.jetbrains.dokka-android'
signing {//签名
required { gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
uploadArchives {
configuration = configurations.archives
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment)
}
repository(url: 'http://192.168.0.107:8083/repository/zero/') {
authentication(userName: 'admin', password: 'admin')
}
pom.project {
version '1.0.0'//版本号
artifactId 'common'
groupId 'com.example.zerocomm'
packaging 'aar'
description 'common-1.0.0'
}
}
}
}
//这是kotlin的
task generateSourcesJar(type: Jar) {
group = 'jar'
from android.sourceSets.main.java.srcDirs
archiveClassifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
//task dokkaJavadoc(type: dokka.getClass()) {
// outputFormat = "javadoc"
// outputDirectory = javadoc.destinationDir
// noStdlibLink = true
// noJdkLink = true
// noAndroidSdkLink = true
//}
dokka {
outputFormat = "javadoc"
outputDirectory = javadoc.destinationDir
// outputFormat = 'html'
// outputDirectory = "$buildDir/docs"
noStdlibLink = true
noJdkLink = true
noAndroidSdkLink = true
// The fix
externalDocumentationLink {
url = new URL("https://developer.android.com/reference/")
packageListUrl = new URL("file:///${rootDir}/package-list")
}
}
task generateJavadoc(type: Jar, dependsOn: dokka) {
group = 'jar'
archiveClassifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives generateJavadoc
archives generateSourcesJar
}
// 这是java的
//task androidJavadocs(type: Javadoc) {
// source = android.sourceSets.main.java.srcDirs
// classpath += project.files(android.getBootClasspath() .join(File.pathSeparator))
//}
//
//task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
// archiveClassifier = 'javadoc'
// from androidJavadocs.destinationDir
//}
//
//task androidSourcesJar(type: Jar) {
// archiveClassifier = 'sources'
// from android.sourceSets.main.java.srcDirs
//}
//
//artifacts {
// archives androidSourcesJar
// archives androidJavadocsJar
//}
gradle如何将指定内容打成jar
// 将项目指定的 _tmp 文件夹下的内容打成 jar
task makeJar(type: Jar) {
baseName = "common"
version = "1.0.0"
extension = "jar"
from('build/intermediates/classes/debug/')
from('build/tmp/kotlin-classes/debug/')
include('com/example/zero/utils/_tmp/**')
destinationDir = file('build/_tmp')
}
- 在comm的build.gradle的最后添加upload.gradle
//apply from: '../upload.gradle'
apply from: 'upload.gradle'
注意点,如果你的upload.gradle在项目的根目录,与要上传的module的build.gradle不处于同一级目录,在需要这么写:
- upload.gradle
afterEvaluate { project ->
task xxxx(){
....
}
....
}
2.module下的build.gradle
//写在build.gradle的最后
apply from: '../upload.gradle'
upload.gradle的位置问题
使用Nexus私服上的库
ZRS}$R2VL58I05CV2C~}B)4.png在要使用comm的module的build.gradle下添加
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.0.2'
//使用Nexus私服的库
implementation 'com.example.zerocomm:common:1.0.0@aar'
}
KH8S0O3MYI2T~5VDKC@N12W.png
上传时遇到的问题
-
我的项目用的是kotlin,不是Java,所以无法使用javadoc生成doc文档
2BI~Z0~G{%IL(DH9CN16D%U.png
解决方案 使用dokka: https://github.com/Kotlin/dokka
-
使用dokka插件时遇到的问题
9280~}CE}A7EF10MPY43TN9.png
原因:
这个异常首先是因为请求一个网址,比如android.com去拿一个package-list时因为网络原因请求失败.而dokka需要这个package-list;
解决方案:
- 自己提供package-list 并做配置
dokka {
outputFormat = "javadoc"
outputDirectory = javadoc.destinationDir
// outputFormat = 'html'
// outputDirectory = "$buildDir/docs"
// The fix
externalDocumentationLink {
url = new URL("https://developer.android.com/reference/")
packageListUrl = new URL("file:///${rootDir}/package-list")
}
}
- 配置外网的代理Proxy
在这个 .gradle目录下可以如此操
这个文件的作用是在build前设置好系统变量,让gradle使用
systemProp.http.proxyPort=eg.8080
systemProp.http.proxyUser=username
systemProp.http.proxyPassword=password
systemProp.http.nonProxyHosts=*.**.com, 10.* 正则配置
systemProp.http.proxyHost=***.**.com 之类
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=username
systemProp.https.proxyPassword=password
systemProp.https.nonProxyHosts=*.**.com, 10.*
systemProp.https.proxyHost=**.**.com
- 忽略doc输出时的错误
task dokkaJavadoc(type: dokka.getClass()) {
outputFormat = "javadoc"
outputDirectory = javadoc.destinationDir
noStdlibLink = true
noJdkLink = true
noAndroidSdkLink = true
}
Nexus知识点扫盲
nexus默认的这几个仓库,先解释一下:
- maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar;
- maven-releases:私库发行版jar,初次安装请将Deployment policy设置为Allow redeploy
- maven-snapshots:私库快照(调试版本)jar
- maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。
Nexus默认的仓库类型有以下四种:
- group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;
- hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库);
hosted 是宿主仓库 ,是自己的私有库地址,这个就是自己的。这个有 releases 和snapshots 两种类型,你如果自己创建的时候,需要指定 ,一个是正式发布地址,一个是开发中地址。
Hosted是宿主机的意思,就是怎么把第三方的Jar放到私服上。
Hosted有三种方式,Releases、SNAPSHOT、Mixed
Releases: 一般是已经发布的Jar包
Snapshot: 未发布的版本
Mixed:混合的
- proxy(代理类型):从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的Configuration页签下Remote Storage属性的值即被代理的远程仓库的路径);
这里就是代理的意思,代理中央Maven仓库,当PC访问中央库的时候,先通过Proxy下载到Nexus仓库,然后再从Nexus仓库下载到PC本地。
这样的优势只要其中一个人从中央库下来了,以后大家都是从Nexus私服上进行下来,私服一般部署在内网,这样大大节约的宽带
- virtual(虚拟类型):虚拟仓库(这个基本用不到,重点关注上面三个仓库的使用);
Policy(策略): 表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库;
Nexus仓库分类的概念
image.pngNexus的缓存问题
如果你的nexus是安装在C盘,然后随着你的Nexus使用时间增长,你会发现C盘不经意就爆满了,悲剧~~~
解决方案,修改Blob Stores
@NVVFL4AQ~0VA1W(KF7ID(M.png
网友评论