且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-09-08 15:06:37

由于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。登录后能够看到下面界面:

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

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

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

能够看到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:

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

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

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

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

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


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


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

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

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

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






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5275440.html,如需转载请自行联系原作者