每一种技术,每一个框架都不是凭空产生,都是为了解决特定需求.因此使用什么技术取决于我们的需求,作为一个研发人员,我们不仅仅要懂得编码,更要有洞察真实需求的能力.
首先介绍一下我们公司的现状:我们公司有很多APP,每年会优化或者开发5个以上的APP,而这些APP有很多共同的部分,比如一些工具类,自定义UI,视频播放功能等甚至是框架.为了提高整体团队的开发效率,带领大家走出重复造车轮的困局,我设想把这些可以复用的代码通过一种特殊的方式进行管理.
1.实现模块化,不同功能模块可以单独引入,符合类似单一原则;
2.团队成员可以对各个模块进行版本迭代更新,优化实现方式;
3.引用模块要方面;
综合以上需求,我尝试过使用组件化/模块化开发,但是这些都用于一个大项目的开发,而我的需求更类似于模版开发,如同Gradle中依赖.基于这样的认识,我便想到了Maven项目构建方式.
Nexus下载地址:https://blog.sonatype.com/
本人使用的是最新版本:Nexus Repository Manager OSS 3.x - Windows
NEXUS REPOSITORY OSS [开源软件——免费]
NEXUS REPOSITORY Pro [专业版本——收费]
所以我们选择OSS即可 [点击GET REPOSITORY OSS]
选择Nexus的版本,进行下载,下载完毕之后解压文件.[这里我选择的是Nexus Repository Manager OSS 3.x - Windows
]
这个根据自己的操作系统进行选择,本人电脑是window系统,接下来的配置和使用都是基于window系统
(1).解压之后的文件目录结构:得到两个文件夹nexus-3.9.0-01和sonatype-work,其中第一个文件夹根据下载的版本不同而不同。
(2)配置Nexus路径:
将nexus-3.9.0-01目录下的bin添加到环境变量的Path中
(3)编辑nexus.vmoptions
打开bin文件夹下的nexus.vmoptions,配置Dkaraf.data和Djava.io.tmpdir两项,图中N:/nexus-3.9.0-01-win64/sonatype-work/nexus3
是我的zip解压路径,注意斜杠方向。其他的配置项我还没有研究,可自行研究下。
-Xms1200M
-Xmx1200M
-XX:MaxDirectMemorySize=2G
-XX:+UnlockDiagnosticVMOptions
-XX:+UnsyncloadClass
-XX:+LogVMOutput
-XX:LogFile=../sonatype-work/nexus3/log/jvm.log
-XX:-OmitStackTraceInFastThrow
-Djava.net.preferIPv4Stack=true
-Dkaraf.home=.
-Dkaraf.base=.
-Dkaraf.etc=etc/karaf
-Djava.util.logging.config.file=etc/karaf/java.util.logging.properties
-Dkaraf.data=N:/nexus-3.9.0-01-win64/sonatype-work/nexus3
-Djava.io.tmpdir=N:/nexus-3.9.0-01-win64/sonatype-work/nexus3/tmp
-Dkaraf.startLocalConsole=false
(4)编辑nexus-default.properties
另外在文件夹N:\nexus-3.9.0-01-win64\nexus-3.9.0-01\etc
下还有一个配置文件nexus-default.properties,有需要的也可以自行修改nexus-context-path这个参数,这个是nexus启动时的根路径,默认是“/”。
## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/etc/nexus.properties
##
# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
nexus-context-path=/
# Nexus section
nexus-edition=nexus-pro-edition
nexus-features=\
nexus-pro-feature
(5)启动
打开CMD,接下来执行命令:nexus.exe /run。 如果打印Started Sonatype Nexus OSS 3.9.0-01
[不同版本Nexus的版本号不同],说明启动成功
(6)查看网站
启动成功后,访问:localhost:8081。
默认的用户名和密码:admin/admin123
component name的一些说明:
maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar maven-releases:私库发行版jar maven-snapshots:私库快照(调试版本)jar maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。
component type的一些说明:
hosted:类型的仓库,内部项目的发布仓库 releases:内部的模块中release模块的发布仓库 snapshots:发布内部的SNAPSHOT模块的仓库 3rd party:第三方依赖的仓库,这个数据通常是由内部人员自行下载之后发布上去 proxy:类型的仓库,从远程中央仓库中寻找数据的仓库
(1)创建一个私有仓库
图1
图2
图3
图4
图5
(2)新建一个代理仓库
如图6,选择被代理仓库地址,其他选项在建立私有仓库时候已经介绍,没有介绍的一律默认
图6
(3)建立group
选择要放在本分组的仓库名,点击>即可加入该分组。<从本分组中移除仓库,如下图
在引用的时候可以直接引用group仓库
(1)建立gradle_maven_push.gradle
因为,Module比较多,我在项目根目录里写了一个 gradle 文件gradle_maven_push.gradle
来上传。代码如下:
apply plugin: 'maven'
//release 地址
def RELEASE_REPOSITORY_URL = "http://localhost:8081/repository/tdk_release/"
//snapshots 地址
def SNAPSHOT_REPOSITORY_URL = "http://localhost:8081/repository/tdk_Snapshot/"
//判断 VERSION_NAME 如果以`-SHAPSHOT`结尾,则上传地址为 snapshot 地址
def REPOSITORY_URL = VERSION_NAME.endsWith("-SNAPSHOT") ? SNAPSHOT_REPOSITORY_URL : RELEASE_REPOSITORY_URL;
def NEXUS_USERNAME = "admin"
def NEXUS_PASSWORD = "admin123"
logger.info("groupId = %s\t\nartifactId = %s\t\nversion = %s\t\nrepository = %s\t\n", GROUP, POM_ARTIFACT_ID, VERSION_NAME, REPOSITORY_URL)
afterEvaluate { project ->
uploadArchives {
repositories.mavenDeployer {
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION_NAME
repository(url: REPOSITORY_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
}
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
artifacts {
archives androidSourcesJar
}
}
(2)然后在你要上传 module 的build.gradle 文件引入。
如下图是我们baseutilslib Module 的 build.gradle:
apply plugin: 'com.android.library'
android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
ext.GROUP="com.tdk.baseutilslib"
ext.VERSION_NAME="1.1.0-SNAPSHOT"
ext.POM_ARTIFACT_ID="baseutilslib"
//引用gradle_maven_push.gradle
apply from: "${project.rootDir}/gradle_maven_push.gradle"
这里请关注下面的代码,GROUP,VERSION_NAME,POM_ARTIFACT_ID
和最后一行引入我们前面写的gradle_maven_push.gradle
。
GROUP
一般代表了你的组织名称,例如我的com.tdk.baseutilslib
POM_ARTIFACT_ID
:Library 的简称。
VERSION_NAME版本号,如果有-SNAPSHOT表示是快照版。
上面这三个也就组成了我们平常看见的引依赖 com.tdk.baseutilslib:baseutilslib:1.1.0-SNAPSHOT
(3)最后在terminal中执行gradle uploadArchives
,上传文件
(4)上传成功之后可以在web端看到你的上传文件的Maven形式
(1)在项目的gradle.build中配置maven私服的地址
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0-alpha09'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
//maven仓库组地址
maven{
url "http://localhost:8081/repository/tdk_group/"
}
jcenter()
google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
(2)在要使用仓库中组件的Moudle中配置依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation 'com.tdk:baseutilslib:1.1.1-release'
}
(3)在项目中导入使用,完毕。
注意:我们在编译项目的时候,有些包在我们自己的maven私服中不存在,这时proxy代理库会去我们代理的仓库中去查找并下载到本地,这样就可以加快我们的下载架包的速度,提高开发效率。所以有条件的伙伴,都可以在自己的电脑上搭建Maven私服,自己使用,提高效率。当然我们也可以,建立一个代理仓库去代理公司的仓库,然后可以共用一些“轮子”。
参考文档:
AndroidStudio使用进阶二:搭建自己的maven私服,并使用Gradle统一依赖管理
Android Studio上使用Nexus搭建Maven私服并上传JCenter
自建私有 Maven 仓库
Maven三种仓库的配置
Android studio Maven仓库使用