My studying notes for Java,Ruby,Ajax and other any interesting things.

星期五, 五月 01, 2015

关于gradle和maven库的集成

最近重新学习java,第一步是搞定编译工具,便于后面项目的快速上手,于是简单调研了一下构建工具。

在08年的时候,maven2还比较盛行,但是更多的是ant,因此心里很是怀念ant的时代。没想到一调查,发现ant已经基本上退出了竞争行列,很少项目直接使用ant来build项目了,更多的是使用maven3,以及一个新星:gradle。由于对maven之前掌握就不是很好,大概知道它基于契约,可以做包管理,可以有集中仓库,但是对它一堆的xml的配置深恶痛绝,于是从来没有仔细学会过maven。

看了一下gradle,语法相对简洁,使用groovy来编写的,构建过程也比maven貌似要快一些,尤其在intelj idea中的集成也比较给力。于是就准备认证学习一下gradle,并尝试推广在公司内部使用,看能否代替现在的Maven。

遇到一个问题,maven有强大的包管理工具,gradle更多只是一个构建工具,本身并不提供包管理功能。但是gradle比较强大,支持maven的库,可以在build.gradle中设置使用maven的仓库来实现包管理。

使用maven仓库

在gradle的编译配置文件中,可以使用如下语法定义使用maven库:

repositories
{
    mavenLocal()
    mavenCentral()
    maven
    {
        url 'http://mvn.xxx:8081/nexus/content/groups/public'
    }
}

这里面有几种选择:
  • mavenLocal : 只能使用本地的仓库,默认到~/.m2/repository/ 进行寻址,如果找不到则提示无法找到对应的包和库
  • mavenCentral:中央库,默认寻找~/.m2/repository 来寻找包文件,如果找不到就发起请求向中央服务器获取包文件,按照gradle官方说明,应该是从~/.m2/settings.xml中获取中央库url,但是实际测试的时候发现,貌似忽略了~/.m2/settings.xml,而是直接使用了 http://repo1.maven.org/maven2/ 这个中央仓库,就会导致下载速度非常慢;
  • maven{url xxx} 这种方式可以让gradle在下载包的时候使用指定的本地中央服务器来进行下载

这三者的顺序最好是:

local maven{local server} mavenCentral

这样按顺序寻址,先在本地文件系统查找,如果找不到就到本地server查找,然后再去外部server进行下载。
关于mavenCentral的配置,按道理来将会根据settings.xml寻址,但是我修改了我能够改动的所有settings.xml,都未能如意,并设置了maven_home变量,仍然无效。看来需要stackoverflow问问了。


Gradle编译依赖

Gradle在库包依赖环节中设置的比较灵活,可以依赖于group,单个包,大体上都是:group,包名,版本号
大体定义语法如下:
dependencies {
    compile group: 'foo', name: 'foo', version: '0.1'
}
可以简化如下:
dependencies {
    compile 'foo:foo:0.1','foo:foo2:0.1',
}


Gradle有几种依赖的定义:
  • runtime:运行的时候依赖的包
  • compile:编译的时候依赖的包
  • testRuntime:运行测试用例需要的包
  • testCompile:编译测试代码需要的包
  • default:默认需要的包
  • archives:打包的时候需要打入的一些包

吐槽
这些语法相对maven来讲还是容易了很多。但是无论怎样,要查找依赖的库的版本,包名总是一件很痛苦的事情。在很早以前,没有包集中管理的时候,都是直接到官方网站去下载,存放在本地的目录里面,增加到classpath中,让开发和编译的时候都很容易通过。由于有了,集中管理,不再去官方网站下载,但是库里面有多少包,版本是什么样的都很麻烦才知道。

幸好,在eclipse里面相对容易查找版本文件,也有人闲极无聊,写了一个findmaven.net,可以根据类名查找你的包,并提供版本名称,方便查看代码的同时可以很容易cp到gradle和maven的配置文件中来。

懒人改变世界,此言不虚。

印象笔记,你的工作空间。下载印象笔记