• 建立企业内部mavenserver并使用Android Studio公布公共项目



    由于Android Studio使用了Gradle构建工具,在library依赖的处理上是将被依赖的library作为一个module引入(拥有一份完整的library拷贝),而Eclipse的ADT则是直接将library作为外部项目依赖链接进来,两者各有各的优缺点。Android Studio的优点是能时刻保持项目的完整性,每个项目都包括了整个项目所须要的一切东西,当你把项目共享给别人的时候就不会由于落下某个library而导致别人无法正常打开你的项目。缺点则是多个项目都依赖同一个library,每个项目都有自己一份library代码拷贝,当这个library的代码须要更新的时候。每个项目中的library代码都须要更新一遍。而Eclipse的library依赖,仅仅是做了一个library链接,多个项目能够链接到同一个library,优点是library须要改动的时候仅仅须要改动一处代码,缺点时与他人共享项目的时候可能会落下library忘记共享。

    一般一个公司长期开发累积下来。都会总结出一套自己的SDK或者工具供自己的产品使用。假设使用Android Studio开发,一旦自己的SDK须要更新难免就会遇到前面说的问题。好在Android Studio除了library module依赖这样的方法之外,还提供了本地仓库或者(server)远程仓库依赖,通过Gradle工具自己主动从仓库中获取并管理项目所须要的library。

    Gradle支持maven仓库。早期的Android Studio直接使用的就是maven中央仓库,尽管正式版之后改用jcenter。可是依旧能够混用自己定义的maven仓库。

    总体上的解决思路分三个步骤:

    第一,就是在自己公司内部的server上搭建一个maven仓库

    第二。将自己公司的公共类库公布到公司内部server的maven仓库上

    第三,在公司其他项目中配置公司内部servermaven仓库地址。并引用所需的library,Gradle会自己主动从servermaven仓库中获取


    1、在自己公司内部server上搭建maven仓库


    server上的maven仓库能够使用Sonatype nexus oss来搭建。sonatype nexus oss 是一个maven仓库管理工具,并提供了web控制台。部署和使用都非常方便。


    1.1 下载sonatype nexus oss


    将sonatype nexus oss下载到公司内部server上,下载地址:http://www.sonatype.org/nexus/go


    1.2 安装并执行sonatype nexus oss


    首先确认server上是否已经安装JDK,nexus oss的执行须要JDK7或者JDK8。假设没有安装JDK,请先安装JDK。

    下载下来的nexus oss是一个zip或者tar.gz压缩包,须要将其解压。你能够将其解压到不论什么位置。nexus oss的执行对其所在位置没有什么特殊要求。解压后会看到两个文件夹,一个是nexus-x.xx.x-xx。一个sonatype-work。当中nexus-x.xx.x-xx是nexus oss的主文件夹。全部执行程序和配置文件都在里面。

    sonatype-work是nexus-oss的数据文件夹,nexus-oss执行过程的maven仓库数据都在这里面。

    进入nexus-x.xx.-x-xx/bin文件夹。window平台的server直接执行nexus.bat脚本就能够了。以下具体讲下linux平台的安装和执行。

    nexus oss官方建议将nexus-x.xx.x-xx安装到/usr/local文件夹下,并做个/usr/local/nexus链接指向nexus-x.xx.x-xx文件夹。方便以后nexus oss版本号升级。方法例如以下

    $ sudo cp nexus-x.xx.x-xx-bundle.tar.gz /usr/local
    $ cd /usr/local
    $ sudo tar xvzf nexus-x.xx.x-xx-bundle.tar.gz
    $ sudo ln -s nexus-x.xx.x-xx nexus
    假设你下载的是zip压缩包,则使用sudo unzip nexus-x.xx.x-xx-bundle.zip命令解压。

    为了方便以后使用,能够加入$NEXUS_HOME环境变量指向/usr/local/nexus。另外,默认配置sonatype-work文件夹与nexus-x.xx.x-xx在同一个文件夹下,假设你想讲sonatype-work迁移到其他指定路径,能够改动nexus-x.xx.x-xx/conf/nexus.properties配置文件里的nexus-work变量值。

    完毕之后,执行nexus oss仅仅须要执行nexus-x.xx.x-xx/bin/nexus脚本。參数能够为console或者start。

    console会在控制台打印出执行日志。假设有配置NEXUS_HOME环境变量,就能够在不论什么地方执行以下语句:

    $NEXUS_HOME/bin/nexus start

    1.3 配置sonatype nexus oss


    执行成功之后,在浏览器打开http://server地址:8081/nexus就能够看到nexus oss的控制面板。

    点击右上角login登录。默认账号password为admin/admin123。登录后能够看到下面界面:

    左边是功能面板,能够在Repositories里面查看全部的maven仓库,在User里面进行用户管理(改动password什么的)。点击Repositories,查看maven仓库:


    能够看到nexus oss默认已经建好了几个仓库,每一个仓库都有自己的一些属性。

    第一个重要属性是type仓库类型。

    主要有group、hosted、proxy、virtual四种类型。不同类型的仓库有不用的作用和工作模式。一般仅仅须要关注group、hosted、proxy三种类型。因为nexus oss上面能够有多个maven仓库,可是maven这个工具要求使用groupId:artifactId:version这三个參数就能唯一确定一个项目。因此nexus oss使用group类型的仓库来决定nexus oss上各个maven仓库的优先级,以解决不同maven拥有同样项目的冲突。

    proxy类型的仓库事实上仅仅是个代理,用于代理其它server上的maven仓库。hosted类型是nexus oss自己所在server本地的maven仓库,也是我们这次主要使用的仓库类型。

    Repository Path是仓库的地址,把自己的项目公布到maven和引用maven仓库中项目的时候须要用到。

    选择一个仓库后,能够在以下窗体中看到这个仓库的详细信息。当中Configuration标签页中能够对仓库进行设置。

    我们的目的是要将我们自己的项目公布到我们自己的server上去,因此我们要选择hosted类型的仓库,以免公司内部的代码外泄出去(当然server也得是内网的server,公网能訪问到的server,公布上去的代码也有一定的风险)。

    对于我们要使用的hosted类型的仓库,重点要看的是里面的Repository Policy仓库存储协议。有release和snapshot两种。release表示发行版,snapshot表示快照版本号。另一个Deployment Policy部署协议,有Allow Redeploy(同意部署)、Disable Redeploy(不同意部署)、Read Only(仅仅读)三种模式。仅仅有在Allow Redeploy模式下,我们才有权限能够将我们的项目公布到这个项目中。nexus oss默认已经建立了Releases和snapshots两个hosted仓库,我们检查一下配置就能够直接拿来用。当然你也能够自己建立hosted仓库。


    2、公布公共类库到servermaven仓库


    编辑须要公布的公共类库的module的build.gradle脚本,在末尾加入以下配置:

    apply plugin: 'maven'
    def isReleaseBuild() {
        return VERSION_NAME.contains("SNAPSHOT") == false
    }
    def getRepositoryUsername() {
        return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
    }
    def getRepositoryPassword() {
        return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
    }
    afterEvaluate { project ->
        uploadArchives {
            repositories {
                mavenDeployer {
                    pom.groupId = GROUP
                    pom.artifactId = POM_ARTIFACT_ID
                    pom.version = VERSION_NAME
                    repository(url: RELEASE_REPOSITORY_URL) {
                        authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                    }
                    snapshotRepository(url: SNAPSHOT_REPOSITORY_URL) {
                        authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                    }
                }
            }
        }
        task androidJavadocs(type: Javadoc) {
            source = android.sourceSets.main.java.srcDirs
            classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
        }
        task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
            classifier = 'javadoc'
            from androidJavadocs.destinationDir
        }
        task androidSourcesJar(type: Jar) {
            classifier = 'sources'
            from android.sourceSets.main.java.sourceFiles
        }
        artifacts {
            archives androidSourcesJar
            archives androidJavadocsJar
        }
    }

    相同在这个module下加入gradle.properties文件,文件内容例如以下:

    GROUP=相应maven的groupId值,假设名字中包括SNAPSHOT字符,项目将会公布到snapshots仓库。没有则公布到releases仓库
    VERSION_NAME=相应maven的version值
    POM_ARTIFACT_ID=相应maven的artifactId值
    
    SNAPSHOT_REPOSITORY_URL=前面配置的snapshots仓库地址
    RELEASE_REPOSITORY_URL=前面配置的releases仓库地址
    
    NEXUS_USERNAME=登录nexus oss的username
    NEXUS_PASSWORD=登录nexus oss的password

    改动完之后,在Android Studio右面的Gradle面板中找到相应的module,在这个module以下就能看到uploadArchive这个task:


    双击执行这个task。项目就公布到nexus oss相应的maven仓库中,在日志中能够看到类似这种信息:


    看到BUILD SUCCESSFUL表示公布成功,回过头来看nexus oss面板上的仓库,找到你公布上去的仓库。应该就能找到你的项目。比方我公布的项目:



    3、在其他项目用引用我们公布的类库


    方法非常easy,在须要加入依赖的module的build.gradle文件里找到dependencies对象,在当中加入我们自己mavenserver的url地址,然后依照前面我们公布项目时配置文件里的gradleId:archiveId:version方式应用就能够了,比方我自己的仓库和项目:

    加入后刷新同步下gradle,项目依赖就自己主动处理了。公共类库有改动,仅仅须要改动公共类库并改动下version版本,然后再公布一次代码到maven上去。

    其他项目仅仅须要改动下gradle脚本中的版本。代码就都自己主动更新上了。


  • 相关阅读:
    bzoj3224
    [洛谷日报第62期]Splay简易教程 (转载)
    bzoj1588
    codeforces467C
    codeforces616B
    codeforces379C
    codeforces545C
    codeforces285C
    codeforces659C
    快读代码level.2
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5275440.html
Copyright © 2020-2023  润新知