文章大纲
引言
在前面的系列文章中总结了开发Gradle插件的三种形式以及上传Java项目及Android 项目至本地仓库和远程JCenter仓库的核心步骤和方法,其实除了前面的三种形式,我们还可以把自己的Java项目和Android项目上传到我们自己的内部的Nexus私服仅供内部人员使用,其实无论是把使用何种仓库存储何种构件核心步骤都是大同小异的。简而言之,Maven仓库可以放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源,能帮助我们管理构件,而Nexus是maven仓库管理器软件系统,可以用于管理多个Maven仓库,用来构建maven的本地服务器,接下来我将以Windows 搭建Nexus 3私服为例。
- Android 进阶——自定义Gradle插件的三种方式初探与上传至本地仓库完全攻略(一)
- Android 进阶——上传Java项目及Android AAR至JCenter远程仓库完全攻略(二)
- Android 进阶——上传Java项目及Android AAR至JCenter远程仓库完全攻略(三)
- Android 进阶——上传Java项目及Android AAR至个人Nexus 3私服仓库完全攻略(四)
一、搭建Nexus 3私服
进入官网或者下载其他版本选择对应的系统下载Nexus 安装包并解压到指定目录即可。
如下图所示
会看到有两个文件夹:其中nexus-xx是Nexus 运行自身的一些库的依赖的核心目录所在;而sonatype-work目录包含Nexus运行环境的配置文件、日志文件、仓库文件、索引文件、插件文件、缓存文件等。默认情况下使用的端口号是8081,如果你想要修改的话可以在sonatype-work\nexus3\etc目录下的修改nexus.properties文件。
最简单的情况下,这些都不需要去配置,你电脑安装了JDK之后,就可以通过nexus.exe /run运行Nexus了(你可以把对应的目录配置到环境变量或者写到一个批处理文件中,这些只是让你更便捷操作而已)
window 批处理文件 nexus.bat
第一次启动可能需要等待一些时间,你看到Started Sonatype Nexus OSS 3.xxx就说明已经启动成功了,此时可以通过http://localhost:8081访问你本地的私服了(如果是运行在服务器上的话换成对应的IP和端口号即可),通过默认用户admin(默认密码为admin123)登录之后就会看到以下网页:
至此,Nexus可以正常工作了,接下来就是对Nexus网页系统上的各种操作了(比如根据自己的需求修改用户、增加用户、创建仓库repo、配置权限、上传构建等等,),不过如果你想进行个性化的配置,以让其运行更高效,还可以修改nexus-3.16.2-01\bin\nexus.vmoptions文件配置虚拟机的运行参数(因为它也是需要运行在虚拟机中的)
创建自己的仓库repo
至于Nexus的更多知识不在本篇讨论。
二、上传Java项目至Nexus 私服
其实Nexus私服也可以直接通过它的图形界面系统把我们自己的项目上传到私服上,不过我更喜欢使用脚本上传,所以这里简单介绍使用下步骤(其实和签名上传到JCenter差不多)
1、apply plugin: ‘maven-publish’ 引入插件
//groovydoc需要依赖groovy支持,所以需要引入groovy插件支持
apply plugin: 'groovy'
2、创建自定义task 打包要上传到Nexus的产物
这里可能需要依赖groovydoc 任务,而java项目默认是没有引入groovy支持的,我们得自己去引入groovy插件(具体参见前面文章)
3、 配置maven-publish插件的publications节点和repositories
最终完整版的上传到Nexus的脚本文件uploadjar2nexus.gradle如下:
group "com.crazymo"
version 1.0
apply plugin:'maven-publish'
/***************自定义增加额外的产出 start******************/
/**
* 源代码打包任务(名为hiplugin-1.0-source.jar)
*/
task sourcesJar(type:Jar){
baseName "hiplugin"
//分类器,用于区别其他jar包
classifier "sources"
//从main源集中的所有代码
from sourceSets.main.allSource
}
/**
* 把自动生成的DOc打包成Jar包
* 这个docJar 依赖于系统的两个任务,因为只有这两个任务生成doc之后才能把它们的产出打包到一起
*/
task docJar(type: Jar,dependsOn:[javadoc,groovydoc]){
baseName "hiplugin"
classifier "doc"
//从系统javadoc和groovydoc的Doc产出
from javadoc.destinationDir,groovydoc.destinationDir
}
/**
* 配置工程工件 即jar产出的配置,默认有java jar包,没有sourcesJar和docJar
*/
artifacts{
archives sourcesJar
archives docJar
}
/*****************自定义增加额外的产出 end****************/
publishing{
publications{
//其中plugin为任意名称,components.java表示打包编译后的产物即jar包
plugin(MavenPublication){
from components.java
//不指定的话默认为项目名
artifactId 'nuxes-java'
/*********************把sourcesJar、docJar添加到上传内容****************************/
artifact sourcesJar
artifact docJar
/*********配置pom的内容,pom本身就是以xml数据格式的结构组织的**************/
pom.withXml() {
//拿到pom文件的根节点
def root=asNode()
//把license节点添加到root节点下的licenses节点
def licenseNode=root.appendNode("licenses").appendNode('license')
licenseNode.appendNode("name","Apache License,Version 2.0")
licenseNode.appendNode("url","https://www.apache.org/license/LICENSE-2.0.txt")
licenseNode.appendNode("distribution","repo")
licenseNode.appendNode("comments","A business-friendly OSS license ")
}
}
}
//配置上传的仓库
repositories{
//上传到Maven仓库
maven{
//可以随意取最终会生成一个对应的任务,对应artifactId
name 'j2nexus'
//Nexus私服中的仓库地址,如果是服务器就把localhost替换成主机的IP地址,这也是将来使用时在allprojects的repositories下需要配置的地址
url 'http://localhost:8081/repository/CrazyMo/'
//上传者的身份验证
credentials{
username='admin'
password='admin123'
}
}
}
}
如果脚本没有问题,编译之后就会生成一个publishXxxPublicationToXxxRepository的任务。
执行这个任务之后就会自动上传到Nexus仓库中
4、使用Nexus 仓库的库
由于是使用Gradle语法来引入的所以还是根据group:artifactsId:version形式引入的,核心步骤与使用未上传到JCenter公共库时一样,也是需要指定地址和对应的classpath 或者直接在构建脚本下的allprojects节点下配置地址。
引入成功之后,同样会在默认的远程缓存库中看到有三个目录分别存放pom、sourcesJar、docJar文件
就可以在我们的主Module中使用了
三、上传Android项目至Nexus 私服
核心步骤大同小异,这里不再详细列出,使用android-maven插件上传Android项目至Nexus的完整脚本uploadaar2nexus.gradle:
apply plugin: 'com.github.dcendents.android-maven'
group "com.crazymo.aar"
version 1.0
/**************生成构件***************/
/**
* 源代码打包任务
*/
task sourcesJar(type:Jar){
//如果这里不配置的话会自动以Module名称命名
// baseName "jcaar"
//分类器,用于区别其他jar包
classifier "sources"
//从android main源集中的所有代码,对应构建脚本中的子节点sourceSets 中的信息
from android.sourceSets.main.java.srcDirs
}
/**
* 自定义task 创建android 文档,因为Android项目没有类似Java项目中的[javadoc,groovydoc]
* 因此需要自己定义task 创建文档,根据Gradle提供的Javadoc 类传入指定的参数即可
* @param Javadoc org.gradle.api.tasks.javadoc
*/
task myjavadoc(type: Javadoc){
failOnError false //必须添加以免出错
options{
//如果你的项目里面有中文注释的话,必须将格式设置为UTF-8,不然会出现乱码
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
}
source = android.sourceSets.main.java.srcDirs
//这里传入的不是classifier分类器,因为这个任务的产出不是jar包,把编译时所有的calsspath传递到Javadoc中
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
/**
* 把自动生成的DOc打包成Jar包,
* 这个docJar 依赖于系统的两个任务,因为只有这两个任务生成doc之后才能把它们的产出打包到一起
*/
task docJar(type: Jar,dependsOn:[myjavadoc]){
classifier 'doc' //分类器 区分其他jar包
from myjavadoc.destinationDir
}
/**************生成构件 end***************/
/**
* 配置工程工件 即jar产出的配置,默认有java jar包,没有sourcesJar和docJar
*/
artifacts{
archives sourcesJar
archives docJar
}
// project homepage我这里随便乱写的,如果托管在gayHub或者码云上可以写码云的位置
def siteUrl = 'https://blog.csdn.net/CrazyMo_'
def gitUrl = 'https://blog.csdn.net/CrazyMo_' // project git
//这里直接影响POM文件的结构
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging 'aar'
name 'Jtest for Android'
url siteUrl
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
developers {
developer { //填写的一些基本信息
id 'crazymo'
name 'Crazy.Mo'
email 'xxxxx@163.com'
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
uploadArchives {
repositories {
mavenDeployer {
repository(url: "http://localhost:8081/repository/CrazyMo/"){
authentication(userName: 'admin', password: 'admin123')
}
pom.project {
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
}
}
}
}
如果脚本没有错的话,就会看到在Gradle Task栏下看到uploadArchives任务
成功执行这个任务就可以上传到Nexus了
至于使用Nexus的AAR步骤也和使用Nexus的Jar 一样,不再列出。