美文网首页
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