Win10上Android Studio搭建自己的Nexus私服

Nexus介绍

Nexus是一个强大的Maven仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。

demo地址: https://github.com/fanzhangvip/NexusDemo

Nexus私服的部署安装

需求环境:jdk1.8、maven3

java环境

  1. 安装java的JDK

http://www.oracle.com/technetwork/java/javase/downloads/index.html

  1. 设置 JAVA_HOME


    VNM`(~OEC~~}8C0_0Y$O(0D.png
  2. Windows打开命令控制台


    U8DETDGGLY90I4CH$K$S@AW.png

Maven安装

  1. 下载Maven最新版本

http://maven.apache.org/download.html

  1. 解压文件到你想要的位置来安装 Maven


    CR_7{UJ80HC7_0V7BD7DH@B.png
  2. 设置 Maven 环境变量
    添加 M2_HOME、M2、MAVEN_OPTS 到环境变量中


    DHYBJD63{GBCILYVY4MY%GK.png

添加 Maven bin 目录到系统路径中


mavenbin
  1. 验证 Maven 安装


    maven --version

Nexus3部署

  1. 下载Nexus3

https://www.sonatype.com/download-oss-sonatype

  1. 解压到你想放的位置


    PK~NW5B1MOP4L52(LYT~4C0.png
  2. 修改nexus-default.properties


    L%AQLWXIV8FPO@BRH{5EYUG.png
8R5KY_TTZHUA1MSJCXEU)@Q.png
  1. 安装nexus服务


    nexus
9_}7P{V6)$QZB40ABDJL728.png

先要安装服务 nexus /install nexus

nexus安装成功

配置阿里云私服代理

http://maven.aliyun.com/nexus/content/groups/public

D1%THA9(~68)L(J0M(%TAIP.png

配置阿里云私服代理的google仓库

  1. 这里必须配置,不然在build.gradle中就必须添加google()
  2. https://maven.aliyun.com/repository/google
SSR$1(4)ATXQ$@_{6YKGW66.png

配置自己的仓库组

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 
    }
}
}

上传私有类库

  1. 自定义了一个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
    }
  1. 编写上传脚本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')
}
  1. 在comm的build.gradle的最后添加upload.gradle
//apply from: '../upload.gradle'
apply from: 'upload.gradle'

注意点,如果你的upload.gradle在项目的根目录,与要上传的module的build.gradle不处于同一级目录,在需要这么写:

  1. 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

上传时遇到的问题

  1. 我的项目用的是kotlin,不是Java,所以无法使用javadoc生成doc文档


    2BI~Z0~G{%IL(DH9CN16D%U.png

解决方案 使用dokka: https://github.com/Kotlin/dokka

  1. 使用dokka插件时遇到的问题


    9280~}CE}A7EF10MPY43TN9.png

原因:
这个异常首先是因为请求一个网址,比如android.com去拿一个package-list时因为网络原因请求失败.而dokka需要这个package-list;
解决方案:

  1. 自己提供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")
    }
}
  1. 配置外网的代理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
  1. 忽略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.png

Nexus的缓存问题

如果你的nexus是安装在C盘,然后随着你的Nexus使用时间增长,你会发现C盘不经意就爆满了,悲剧~~~

解决方案,修改Blob Stores


@NVVFL4AQ~0VA1W(KF7ID(M.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容