美文网首页
Win10上Android Studio搭建自己的Nexus私服

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

作者: 小乌龟爸 | 来源:发表于2020-01-31 19:55 被阅读0次

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

相关文章

网友评论

      本文标题:Win10上Android Studio搭建自己的Nexus私服

      本文链接:https://www.haomeiwen.com/subject/pulgthtx.html