linux下搭建nexus & 开发gradle插件 & 发布项目到nexus

相关资源及下载地址

  1. nexus: https://www.sonatype.com/
  2. jdk: https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
  3. maven: http://maven.apache.org/download.cgi

以上地址可能需要翻墙才能访问,因此提供百度云盘链接以供下载。链接: https://pan.baidu.com/s/17hECeSmBk5QgKqqqUUdFYA 提取码: uasp

安装步骤

  1. 将下载好的文件移动到指定目录,这里我是在root下新建了mavenrepo目录用来做为安装目录。

    image.png

  2. 解压到当前目录,执行命令为tar -zxvf apache-maven-3.6.3-bin.tar.gztar -zxvf jdk-8u261-linux-x64.tar.gztar -zxvf nexus-3.25.0-03-unix.tar.gz

    image.png

  3. 分别对apache-maven-3.6.3jdk1.8.0_261nexus-3.25.0-03进行重命名,执行命令为mv apache-maven-3.6.3 apache-mavenmv jdk1.8.0_261/ jdkmv nexus-3.25.0-03 nexus

    image.png

  4. 配置环境变量,在终端中输入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修改后的内容如下

linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第1张图片
image.png

验证环境变量是否配置成功。
linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第2张图片
image.png

  1. 配置nexus。进入nexus目录,如果需要修改端口,则可以通过vi ./etc/nexus-default.properties修改application-port值,一般端口不冲突可不修改,默认端口为8081

    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第3张图片
    image.png

    执行命令vi ./bin/nexus修改内容,将run_as_root值更改为false,可通过输入:/run_as_root进行快速查找。
    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第4张图片
    image.png

  2. 输入nexus run启动服务,出现下图所示的文字后表示启动完成。

    image.png

    可通过nexus status查看服务状态,nexus stop停止服务。
    image.png

  3. 在浏览器中输入http://ipaddress:8088,其中ipaddress为linux的ip地址,输入账号密码进行登录。账号:admin,密码需执行命令cat ./root/mavenrepo/sonatype-work/nexus3/admin.password获取初始密码进行登录。

    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第5张图片
    image.png

开发gradle插件

为了方便后期发布项目,所以开发了publish-maven插件
插件项目地址:https://github.com/zourw/publish-maven-plugin

插件开发步骤

  1. 在nexus仓库中创建用于上传项目的账号(非admin)
linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第6张图片
image.png

其中账号需要授予maven相关权限,可在roles中新建nx-maven,新增规则。

linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第7张图片
image.png
  1. 账号创建好后,使用AndroidStudio创建一个项目

  2. 在项目中创建一个Java or Kotlin library

    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第8张图片
    image.png

  3. 将module中的java目录更名为groovy ,并删除其中的java文件

    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第9张图片
    image.png

  4. 新建三个文件,后缀名均为.groovy

    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第10张图片
    image.png

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
        }
    }
}
  1. 根据图示创建目录和文件src/main -> resources -> META-INF -> gradle-plugins -> com.mysoft.publish.properties
    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第11张图片
    image.png

com.mysoft.publish.properties文件内容如下,其中该文件的文件名(不含后缀)为需使用插件时填写的apply plugin: "com.mysoft.publish"中的内容。

implementation-class=com.mysoft.publish_maven_plugin.PublishMaven
  1. 在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"
            }
        }
    }
}
  1. 修改build.gradle,并将upload.gradle导入
apply plugin: 'groovy'

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

apply from: "upload.gradle"
  1. 所有文件操作完成后,Sync Now。展开gradle边栏,按图示操作后双击,等待插件上传。

    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第12张图片
    image.png

  2. 插件上传完成后,在nexus仓库中即可查看。至此,发布插件开发完成。


    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第13张图片
    image.png

发布插件的使用&发布项目

  1. 修改项目根目录下的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
}
  1. 在需要发布的插件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" // 不填写时为默认值
}
  1. 配置完成后,点击Sync Now,等待完成后展开Gradle边栏,即可查看相关可供上传的task

    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第14张图片
    image.png

  2. 双击该task,等待上传完成后即可在nexus查看。

    linux下搭建nexus & 开发gradle插件 & 发布项目到nexus_第15张图片
    image.png

使用

在需要使用的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

你可能感兴趣的:(linux下搭建nexus & 开发gradle插件 & 发布项目到nexus)