我认为许多人都需要在另一个项目中重用其Android应用程序的各个模块。 解决此问题的方法很简单,例如,使用JitPack公开托管您的Android库。 该解决方案非常好,但是如果您需要将磁带库私下放置,则必须付费,而且关税通常取决于所放置物品的数量。 此解决方案并不适合所有人。
下面,我将使用Sonatype Nexus Repository OSS提供针对此问题的简单解决方案。引言
本文并非旨在全面,仅反映了基本解决方案。 结果,您将在主机上安装了用于管理工件的软件,用于发布Android库的脚本,能够从本地maven存储库中实现应用程序中的依赖项的功能。 也许在Habré上已经有这类出版物,但是我没有找到Android开发人员可以理解的教程,这促使我与您共享信息。 如果它对工作真的有用,我将感到高兴。
步骤1.准备
首先,您需要确定Nexus的安装位置。 如果这是一台服务器是合乎逻辑的,那么在开发过程中您将始终可以访问该服务器。 在本文中,我们将Nexus安装在我们正在开发的同一主机上。 在服务器上安装时的区别仅在于我们将访问存储库的IP地址中。
在安装Nexus之前,您需要
下载并安装JRE。 仅Oracle JRE适用,仅1.8版(尝试10,但Nexus宣誓效忠),
在文档中明确指出了这一点。 切记在PATH中将路径添加到JRE可执行文件。
接下来,您需要
从官方网站下载Nexus 。 在撰写本文时,这是版本3.12
第2步:安装和配置Nexus
可以在方便的地方解压缩下载的存档文件。 然后,您可以启动程序并开始工作。 为了长期方便地使用,您需要将Nexus注册为服务并在操作系统启动时运行它。
文档中非常清楚地
描述了如何执行此操作。 在我们的情况下,只需转到“
nexus-3.12/bin/
”
nexus-3.12/bin/
然后从命令行运行nexus文件。
对于c Windows:
nexus.exe /run
对于Unix:
./nexus run
因此,您应该看到有关成功启动的通知,看起来像这样:
现在该测试Nexus的功能了。 为此,只需转到链接
http:// localhost:8081 。 如您所知,对于服务器而言,您需要指定服务器的IP地址,而不是“
localhost
”,并且Nexus使用端口8081起作用。您将看到以下页面:
首先,您需要登录,单击右上角的“
Sign in
”
Sign in
然后输入
admin
的登录名(
admin
)和密码(
admin123
)。 之后,通过点击齿轮图标,我们进入设置。
在设置屏幕上,您会看到指向
Blob Stores
和
Repositories
链接。
Blob Stores
是存储库数据的存储库。 在每个存储库的设置中,您可以指定一个特定的
Blob Store
来存储信息。 默认情况下,一个就足够了。
Repositories
是我们感兴趣的存储库,这些库将存储在其中。
但是,在继续介绍存储库之前,有必要为用户进行基本设置。 让我们转到“
Roles
”部分。
除了管理员和匿名用户的角色之外,我建议分配“
Downloader
”类型的角色(用于将依赖项加载到项目中),分配“
Contributor
”类型的角色,用于将库发送到Nexus。
单击“创建角色”,然后选择“ Nexus角色”,为“下载程序”输入数据,如以下屏幕截图所示:
什么特权负责
文档中详细描述
的内容 。 我们需要选择一个带有“
repository-view
”标记的特权(它负责处理存储库的数据),该特权还应赋予读取存储库数据的权限,这就是“
read
”标记,并且由于在Android中我们使用maven存储库,因此值得停留在“
maven2
”标志上,以防止用户使用其他类型的存储库。 点击“
Create role
”。
以此类推,我们创建了“
Contributor
”角色。 唯一的区别是,我们将从“
Downloader
”角色(在页面底部设置)继承读取权限,并且我们将拥有编辑,向存储库添加工件以及通过Web界面查看存储库数据的特权。
接下来,创建将为其分配已配置角色的用户。 我们转到“
Users
”部分(在窗口左侧),然后单击“
Create local user
”。 为了进行验证,您可以设置类似于标准管理员密码的密码,即“
downloader123
”和“
contributor123
”。 屏幕上的样品填充:
由于我们的目标是私人工作,因此值得匿名用户访问存储库数据,为此,请转到用户“
anonimous
”并将其状态从“
Active
”更改为“
Disabled
”。 在这种情况下,将无法匿名获取Android项目中的依赖关系,而只能使用特定的用户名和密码来获取依赖关系,但仍可以通过Web界面下载数据。
为了禁止匿名用户通过Web界面查看存储库的内容,请转到“
Allow anonymous users to access the server
”部分,然后取消选中“
Allow anonymous users to access the server
”选项。 记住要保存更改。
最后一步仍然是-建立存储库。 转到“
Repositories
”部分,查看在那里创建的默认存储库。 其中有存储库“
maven2
”,如果仔细查看,您会看到不同的类型:“代理”,“组”,“托管”。 如果代理存储库只是将用户转发到另一个存储库,则在预先配置的“
maven-central
”的情况下,这是指向
https://repo1.maven.org/maven2/的链接,“组”可能包含多个存储库,并且“托管”已经是Nexus中存储的特定存储库。 它们现在对我们有用。
为工件的“发行”和“快照”版本创建存储库。 单击“
Create repository
”,选择“
maven2 (hosted)
”。 我们将第一个存储库称为“ android”,只需保存它而不更改设置即可:
我们将第二个存储库称为“ android_snapshot”,将“
Version policy
”更改为“ Spapshot”,将“
Deployment policy
”更改为“允许重新部署”。
如果不清楚这会影响什么,则可以
在此处阅读。 实际上,“ android”存储库将无法重复下载相同版本的库,这是例如与maven-central通信时的常见行为。 对于android_snapshot存储库,版本名称必须以SNAPSHOT结尾,并且可以再次下载相同的版本。
还需要注意的是,存储库列表中有一个带有“复制”按钮的“ URL”列,将来,我们将需要这些链接来从项目中访问存储库。
恭喜你! Nexus的基本配置已完成,是时候开始创建和发布该库了。
步骤3.创建和发布Android库
我们创建一个Android项目,将其命名为“ TestLibrary”。 接下来,在“项目视图”中,用鼠标右键单击项目根目录,选择“新建”和“模块”。 在打开的窗口中,选择“ Android库”并将库命名为“ HelloLibrary”。 结果,您将在app模块旁边看到我们新库的模块。
将具有欢迎功能的类添加到库中:
package com.example.nexus.hellolibrary fun helloFromOurLibrary() { println("### Hello World! This is our new Android library!") }
该库已准备就绪,该发布了。 在模块“ hellolibrary”的“项目视图”中,添加文件并将其命名为“ publisher.gradle”。 它将存储用于发布库的脚本。
// apply plugin: 'maven-publish' ext { // URL Release repositoryReleaseUrl = "http://localhost:8081/repository/android/" // URL Snapshot repositorySnapshotUrl = "http://localhost:8081/repository/android_snapshot/" // , contributorUserName = "contributor" // , contributorPassword = "contributor123" // libraryGroupId = "com.example.nexus" // libraryArtifact = "hellolibrary" // libraryVersion = "0.0.1" } // publishing { // repositories { // maven { // credentials { username contributorUserName password contributorPassword } // Snapshot url libraryVersion.endsWith("SNAPSHOT") ? repositorySnapshotUrl : repositoryReleaseUrl } } // maven-publish publications { // AndroidLibrary - , // , AndroidLibrary(MavenPublication) { // groupId libraryGroupId artifactId libraryArtifact version libraryVersion // artifact "$buildDir/outputs/aar/${project.getName()}-release.aar" pom { // , // ClassNotFoundException // . withXml { def dependencies = asNode().appendNode("dependencies") configurations.getByName("releaseCompileClasspath") .getResolvedConfiguration() .getFirstLevelModuleDependencies() .each { def dependency = dependencies.appendNode("dependency") dependency.appendNode("groupId", it.moduleGroup) dependency.appendNode("artifactId", it.moduleName) dependency.appendNode("version", it.moduleVersion) } } // withXml } // pom } // AndroidLibrary } // publications // assembleRelease model { tasks.publishAndroidLibraryPublicationToMavenRepository { dependsOn project.tasks.assembleRelease } } } //publishing
接下来,转到我们库的“ build.gradle”,将我们的发布者应用于该库,并清除其不必要的依赖项:
apply plugin: 'com.android.library' apply plugin: 'kotlin-android' // publisher apply from: "publisher.gradle" android { compileSdkVersion 28 defaultConfig { minSdkVersion 18 targetSdkVersion 28 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } repositories { mavenCentral() }
现在,我们只需完成“
publishAndroidLibraryPublicationToMavenRepository
”任务即可进行发布。
图书馆已出版,恭喜! 在Nexus的网络界面中检查结果。 转到“浏览”项,然后选择“ android”存储库。 您应该看到以下内容:
步骤4.使用Nexus的相依性
对于测试,我建议创建另一个空的Android项目。
首先,只需将数据添加到项目级别的“ build.gradle”文件,即可将存储库连接到项目:
buildscript { ext.kotlin_version = '1.2.50' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { google() jcenter() // maven { credentials { username "downloader" password "downloader123" } url "http://localhost:8081/repository/android" } } } task clean(type: Delete) { delete rootProject.buildDir }
现在,与任何其他库一样,通过在“应用”级别的“ build.gradle”文件中实施,我们对“图书馆”有了依赖性。
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 defaultConfig { applicationId "com.example.nexus.fff" minSdkVersion 18 targetSdkVersion 28 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"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.android.support:appcompat-v7:28.0.0-alpha3' implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' // implementation "com.example.nexus:hellolibrary:0.0.1" }
依赖项的路径
groupId:artifactId:version
为
groupId:artifactId:version
。
现在,您可以在Android项目中调用
helloFromOurLibrary()
函数,并测试整个电路的性能。 恭喜你!
总结
现在,您有机会在项目中重用私有Android库。 等待评论!
希望您没有浪费时间,谢谢!