https://www.cnblogs.com/lixiangyang521/p/7760754.html
我们都知道,Android Studio导入jar包非常方便,一行代码搞定
dependencies {
compile'com.facebook.fresco:fresco:1.0.1'
}
相信大家对该种写法一定不陌生,这里用到的就是Maven(仓库)概念。
定义
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。简单来说管理jar包的
创建Maven项目
新建一个android library,这个module就是要提供给别人的。在build.gradle
添加如下:
apply plugin: 'maven'
uploadArchives {
repositories.mavenDeployer {
repository(url: LOCAL_REPO_URL)
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION
}
}
gradle.properties文件配置属性
#MAVEN需要的配置
GROUP=com.test.android
POM_ARTIFACT_ID=testUI
VERSION=1.0.0
//这里 指定生成的Maven路径
LOCAL_REPO_URL=file:///Users/caojiaming/StudioProjects/maven/
点一下 同步 (Sync Project with Gradle Files)
在Android Studio 右侧的Gradle Projects
一切正常的话会在gradle.properties
的LOCAL_REPO_URL
看到生成的文件,如图
至此本地已经发布成功,可以看到默认生成的是aar。接下来看一下如何引用
在需要此依赖的项目里build.gradle里添加
repositories {
maven {
url 'file:///Users/caojiaming/StudioProjects/maven/'
}
}
dependencies {
compile 'com.test.android:testUI:1.0.0'
}
有的gradle版本需要在版本后追加@aar(笔者没有遇到过)
dependencies {
compile 'com.test.android:testUI:1.0.0@aar'
}
compile的生成规则在前面配置的gradle.properties
的GROUP
、POM_ARTIFACT_ID
、VERSION
共同决定
以上都是在本地仓库玩的。但实际这并没什么用,至少你要发布到服务器上才会有切合实际的用处。这里先说一下发布到私有服务器上的步骤。
Nexus的搭建
什么是Nexus:Nexus Repository Manager是一个需要Java运行时环境的Java应用程序。运行Nexus Repository Manager时,您正在运行带有基于Web的用户界面的服务器应用程序。该应用程序本身与Eclipse Jetty servlet容器和Apache Karaf OSGi容器一起运行。更详细的介绍请参阅官方文档
下载地址:https://www.sonatype.com/download-oss-sonatype
启动Nexus服务
打开终端命令行依次输入
cd /Users/caojiaming/StudioProjects/nexus-3.3.2-02-mac/nexus-3.3.2-02/bin
(懒得配置环境变量)
./nexus start
你会看到Starting nexus
提示,证明服务已经启动
浏览器输入:http://localhost:8081
点击Sigin in
账号:admin 密码admin123
然后按照上图操作copy远程库的地址,稍后会用到
重新配置 gradle.properties
RELEASE_URL=http://127.0.0.1:8081/repository/maven-releases/
SNAPSHOT_URL=http://127.0.0.1:8081/repository/maven-snapshots/
NAME=admin
PASSWORD=admin123
还记得刚刚点击的copy吗,替换文中的地址即可。
在library module新建maven_push.gradle
apply plugin: 'maven'
apply plugin: 'signing'
configurations {
deployerJars
}
repositories {
mavenCentral()
}
// 判断版本是Release or Snapshots
def isReleaseBuild() {
return !VERSION.contains("SNAPSHOT");
}
// 获取仓库url
def getRepositoryUrl() {
return isReleaseBuild() ? RELEASE_URL : SNAPSHOT_URL;
}
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment {
MavenDeployment deployment -> signing.signPom(deployment)
}
pom.version = VERSION
pom.artifactId = POM_ARTIFACT_ID
pom.groupId = GROUP
repository(url: getRepositoryUrl()) {
authentication(userName: NAME, password: PASSWORD) // maven授权信息
}
}
}
}
// 进行数字签名
signing {
// 当 发布版本 & 存在"uploadArchives"任务时,才执行
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
在build.gradle
开头添加apply from: 'maven_push.gradle'
Gradle任务窗口再次点击
打开nexus查看上传文件
如何引用
之前提到过本地maven,替换url即可
repositories {
maven {
url 'file:///Users/caojiaming/StudioProjects/maven/'
}
}
替换后
repositories {
maven {
url 'http://127.0.0.1:8081/repository/maven-releases/'
}
}
compile无需改变,因为GROUP
、POM_ARTIFACT_ID
、VERSION
均无变化
到此全部工作完成。
写代码
新建GradleTest
类
package com.maven.studio.library;
public class GradleTest {
public void display(){
System.out.println("gradle test");
}
}
新建gradle.properties
在library
module 下新建gradle.properties
,并配置:
VERSION=1.0
GROUP_ID=com.maven.studo.library
ARTIFACT_ID=test
RELEASE_URL=http://192.168.86.130:8081/repository/{release仓库名}/
SNAPSHOT_URL=http://192.168.86.130:8081/repository/{snapshot仓库名}/
NAME=admin
PASSWORD=admin123
当然在工程目录下的gradle.properties
配置,也是可以的。192.168.86.130
是maven仓库ip地址。
新建gradle上传脚本
在library module下,新建maven_push.gradle
apply plugin: 'maven'
apply plugin: 'signing'
configurations {
deployerJars
}
repositories {
mavenCentral()
}
// 判断版本是Release or Snapshots
def isReleaseBuild() {
return !VERSION.contains("SNAPSHOT");
}
// 获取仓库url
def getRepositoryUrl() {
return isReleaseBuild() ? RELEASE_URL : SNAPSHOT_URL;
}
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment {
MavenDeployment deployment -> signing.signPom(deployment)
}
pom.version = VERSION
pom.artifactId = ARTIFACT_ID
pom.groupId = GROUP_ID
repository(url: getRepositoryUrl()) {
authentication(userName: NAME, password: PASSWORD) // maven授权信息
}
}
}
}
// 进行数字签名
signing {
// 当 发布版本 & 存在"uploadArchives"任务时,才执行
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
snapshot版是不需要进行数字签名的,但release必须数字签名。
更多任务
例如对工程生成javadoc.jar、上传source.jar,只要在maven_push.gradle
加上:
// type显示指定任务类型或任务, 这里指定要执行Javadoc这个task,这个task在gradle中已经定义
task androidJavadocs(type: Javadoc) {
// 设置源码所在的位置
source = android.sourceSets.main.java.sourceFiles
}
// 生成javadoc.jar
task androidJavadocsJar(type: Jar) {
// 指定文档名称
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
// 生成sources.jar
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
// 产生相关配置文件的任务
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
导入上传脚本
然后在library/build.gradle
导入maven_push.gradle
脚本:
apply from: 'maven_push.gradle'
执行gradle上传任务
然后Sync gradle
一下,会发现Gradle任务窗口,多了upload
任务快,里面有uploadArchives
task. 右键->Run 或 双击
uploadArchives
deploy
显示BUILD SUCCESS
后,打开nexus界面-> component
upload success
com.maven.studio.library
上传成功!
Gradle引入依赖
gradle配置
修改工程根目录build.gradle
:
allprojects {
repositories {
jcenter()
// maven { url "http://192.168.86.130:8081/repository/{release仓库名}/" }
maven { url "http://192.168.86.130:8081/repository/{snapshot仓库名}/" }
}
}
修改module下的build.gradle
dependencies {
...
// groupId : artifactId : version
compile 'com.maven.studio.library:test:1.0-SNAPSHOT'
}
Sync gradle
同步一下maven仓库,如果gradle build
完成,证明成功引入依赖了。