相关资源及下载地址
- nexus: https://www.sonatype.com/
- jdk: https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
- maven: http://maven.apache.org/download.cgi
以上地址可能需要翻墙才能访问,因此提供百度云盘链接以供下载。链接: https://pan.baidu.com/s/17hECeSmBk5QgKqqqUUdFYA 提取码: uasp
安装步骤
-
将下载好的文件移动到指定目录,这里我是在
root
下新建了mavenrepo
目录用来做为安装目录。
-
解压到当前目录,执行命令为
tar -zxvf apache-maven-3.6.3-bin.tar.gz
、tar -zxvf jdk-8u261-linux-x64.tar.gz
、tar -zxvf nexus-3.25.0-03-unix.tar.gz
。
-
分别对
apache-maven-3.6.3
、jdk1.8.0_261
、nexus-3.25.0-03
进行重命名,执行命令为mv apache-maven-3.6.3 apache-maven
、mv jdk1.8.0_261/ jdk
、mv nexus-3.25.0-03 nexus
。
配置环境变量,在终端中输入
vi ~/.bash_profile
,按i
进入插入模式,配置完成后按esc
退出编辑,接着输入:
并键入wq
,按enter
保存退出,最后在终端中输入source ~/.bash_profile
刷新环境变量。
# 配置jdk环境变量
export JAVA_HOME=/root/mavenrepo/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
# 配置maven环境变量
export MAVEN_HOME=/root/mavenrepo/appche-maven
export PATH=$PATH:$MAVEN_HOME/bin
# 配置nexus环境变量
export NEXUS_HOME=/root/mavenrepo/nexus
export PATH=$NEXUS_HOME/bin:$PATH
bash_profile
修改后的内容如下
验证环境变量是否配置成功。
-
配置
nexus
。进入nexus目录,如果需要修改端口,则可以通过vi ./etc/nexus-default.properties
修改application-port
值,一般端口不冲突可不修改,默认端口为8081
。
执行命令vi ./bin/nexus
修改内容,将run_as_root
值更改为false
,可通过输入:/run_as_root
进行快速查找。
-
输入
nexus run
启动服务,出现下图所示的文字后表示启动完成。
可通过nexus status
查看服务状态,nexus stop
停止服务。
-
在浏览器中输入
http://ipaddress:8088
,其中ipaddress
为linux的ip地址,输入账号密码进行登录。账号:admin,密码需执行命令cat ./root/mavenrepo/sonatype-work/nexus3/admin.password
获取初始密码进行登录。
开发gradle插件
为了方便后期发布项目,所以开发了publish-maven
插件
插件项目地址:https://github.com/zourw/publish-maven-plugin
插件开发步骤
- 在nexus仓库中创建用于上传项目的账号(非admin)
其中账号需要授予maven相关权限,可在roles
中新建nx-maven
,新增规则。
账号创建好后,使用
AndroidStudio
创建一个项目-
在项目中创建一个
Java or Kotlin library
-
将module中的
java
目录更名为groovy
,并删除其中的java文件
-
新建三个文件,后缀名均为
.groovy
DefaultConfig:
package com.mysoft.publish_maven_plugin
/**
* 默认配置
*/
class DefaultConfig {
static final String GROUP_ID = "com.mysoft.libs"
static final Object REPO_SNAPSHOT = "http://10.5.223.107:8088/repository/maven-snapshots/"
static final Object REPO_RELEASE = "http://10.5.223.107:8088/repository/maven-releases/"
static final String REPO_NAME = "repo_user"
static final String REPO_PASSWORD = "12345"
}
PublishConfig:
package com.mysoft.publish_maven_plugin
class PublishConfig {
String groupId = ""
String artifactId = ""
String version = ""
String pomName = ""
String pomDescription = ""
String pomUrl = ""
Object repoSnapshot = ""
Object repoRelease = ""
String repoName = ""
String repoPassword = ""
@Override
String toString() {
return "groupId='" + groupId + '\'\n' +
"artifactId='" + artifactId + '\'\n' +
"version='" + version + '\'\n' +
"pomName='" + pomName + '\'\n' +
"pomDescription='" + pomDescription + '\'\n' +
"pomUrl='" + pomUrl + '\'\n' +
"repoSnapshot='" + repoSnapshot + '\'\n' +
"repoRelease='" + repoRelease + '\'\n' +
"repoName='" + repoName + '\'\n' +
"repoPassword='" + repoPassword + '\'\n'
}
}
PublishMaven:
package com.mysoft.publish_maven_plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPom
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
import java.util.regex.Pattern
class PublishMaven implements Plugin {
@Override
void apply(Project project) {
// 获取maven的配置
def publishConfig = project.extensions.create("publishConfig", PublishConfig)
// apply plugin 'maven-publish'
project.plugins.apply(MavenPublishPlugin)
// 获取 publishing
def publishing = project.extensions.getByType(PublishingExtension)
// 在 project afterEvaluate 时,写入maven配置相关信息
project.afterEvaluate {
// 预处理 publishConfig
preprocessPublishConfig(project, publishConfig)
// 仓库地址 & 账号
publishing.repositories.maven { MavenArtifactRepository repository ->
repository.url = getMavenRepositoryUrl(publishConfig)
repository.credentials { credentials ->
credentials.username = publishConfig.repoName
credentials.password = publishConfig.repoPassword
}
}
project.components.each { component ->
publishing.publications.create(component.name, MavenPublication.class, { MavenPublication publication ->
publication.groupId = publishConfig.groupId
publication.artifactId = publishConfig.artifactId
publication.version = publishConfig.version
publication.from(component)
publication.pom {
mavenPom -> configPom(mavenPom, publishConfig)
}
})
}
}
}
private static boolean isEmpty(CharSequence s) {
if (s == null) {
return true
} else {
return s.toString().length() == 0
}
}
private static def preprocessPublishConfig(Project project, PublishConfig publishConfig) {
if (isEmpty(publishConfig.groupId)) {
publishConfig.groupId = DefaultConfig.GROUP_ID
}
if (isEmpty(publishConfig.artifactId)) {
publishConfig.artifactId = project.name
}
if (isEmpty(publishConfig.version)) {
publishConfig.version = getVersionName(project)
}
if (isEmpty(publishConfig.repoSnapshot)) {
publishConfig.repoSnapshot = DefaultConfig.REPO_SNAPSHOT
}
if (isEmpty(publishConfig.repoRelease)) {
publishConfig.repoRelease = DefaultConfig.REPO_RELEASE
}
if (isEmpty(publishConfig.repoName)) {
publishConfig.repoName = DefaultConfig.REPO_NAME
}
if (isEmpty(publishConfig.repoPassword)) {
publishConfig.repoPassword = DefaultConfig.REPO_PASSWORD
}
println "publishConfig: \n" + publishConfig
}
private static def getVersionName(Project project) {
def lines = project.getBuildFile().readLines()
for (def line : lines) {
if (line.contains("versionName")) {
def matcher = Pattern.compile('versionName \"(.*?)\"').matcher(line)
if (matcher.find()) {
def versionName = matcher.group(1)
return versionName
}
}
}
}
private static def getMavenRepositoryUrl(PublishConfig publishConfig) {
if (publishConfig.version.toLowerCase().contains("snapshot")) {
return publishConfig.repoSnapshot
} else {
return publishConfig.repoRelease
}
}
private static void configPom(MavenPom mavenPom, PublishConfig config) {
if (!isEmpty(config.pomName)) {
mavenPom.name = config.pomName
}
if (!isEmpty(config.pomDescription)) {
mavenPom.description = config.pomDescription
}
if (!isEmpty(config.pomUrl)) {
mavenPom.url = config.pomUrl
}
}
}
- 根据图示创建目录和文件
src/main -> resources -> META-INF -> gradle-plugins -> com.mysoft.publish.properties
com.mysoft.publish.properties
文件内容如下,其中该文件的文件名(不含后缀)为需使用插件时填写的apply plugin: "com.mysoft.publish"
中的内容。
implementation-class=com.mysoft.publish_maven_plugin.PublishMaven
- 在module根目录下新建
upload.gradle
文件,其中配置的为上传到nexus仓库的信息。
apply plugin: 'maven-publish'
publishing {
publications {
plugin(MavenPublication) {
from components.java
groupId = 'com.mysoft.tools'
artifactId = 'publish-maven'
version = '1.0.0'
}
}
repositories {
maven {
url = "http://10.5.223.107:8088/repository/maven-releases/"
credentials {
username = "repo_user"
password = "12345"
}
}
}
}
- 修改
build.gradle
,并将upload.gradle
导入
apply plugin: 'groovy'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
apply from: "upload.gradle"
-
所有文件操作完成后,
Sync Now
。展开gradle
边栏,按图示操作后双击,等待插件上传。
-
插件上传完成后,在nexus仓库中即可查看。至此,发布插件开发完成。
发布插件的使用&发布项目
- 修改项目根目录下的
build.gradle
,添加nexus仓库地址,添加buildscript->dependencies
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
maven { url 'http://10.5.223.107:8088/repository/maven-public/' }
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.1"
classpath "com.mysoft.tools:publish-maven:1.0.0" // 插件依赖仓库地址
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'http://10.5.223.107:8088/repository/maven-public/' }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
- 在需要发布的插件module中,修改该module的
build.gradle
。
apply plugin: 'com.android.library'
apply plugin: 'com.mysoft.publish' // 加入插件
android {
compileSdkVersion 29
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0.0"
...
}
...
}
dependencies {
...
}
// module上传到maven的配置信息
publishConfig {
groupId = "com.mysoft.libs" // 不填写时默认为 com.mysoft.libs
artifactId = "lib-sample" // 不填写时默认为 module 名
version = "1.0.0" // 不填写时默认为 android.defaultConfig.versionName
pomName = ""
pomDescription = ""
pomUrl = ""
repoSnapshot = "http://10.5.223.107:8088/repository/maven-snapshots/" // 不填写时为默认值
repoRelease = "http://10.5.223.107:8088/repository/maven-releases/" // 不填写时为默认值
repoName = "repo_user" // 不填写时为默认值
repoPassword = "12345" // 不填写时为默认值
}
-
配置完成后,点击
Sync Now
,等待完成后展开Gradle
边栏,即可查看相关可供上传的task
。
-
双击该
task
,等待上传完成后即可在nexus查看。
使用
在需要使用的module
下,修改build.gradle
,增加依赖implementation 'com.mysoft.libs:lib-sample:1.0.0'
。Sync Now
后即可像使用第三方库一样使用我们上传到私库的代码。
后记
本篇文章主要是记录搭建nexus、开发gradle发布插件、发布项目的相关步骤。
其中关于gradle插件的开发内容,可以参考 https://zhuanlan.zhihu.com/p/145244992。
nexus搭建相关参考 https://blog.csdn.net/liyi1009365545/article/details/84766956