Gradle 定制 artifact

2017/05/02 Java

很多人想打包个可执行的 jar ,但是写的项目拿 Gradle 打包出来就只有自己的源码,还得手动导包 + 配 META-INF 。

这次我们就来使用 Gradle 解决这个问题。

明确需求

首先我们明确一下我们的需求:

  1. 需要定制 META-INF
  2. 需要打包一部分依赖进入目标文件
  3. 一部分依赖(即使是 compile 级别的依赖)也是不需要的

我解释一下最后一点。比如我们有个 groovy 项目,我们需要依赖一个巨大的 groovy 运行时。 这明显是 compile 级别的依赖,但别的 groovy 用户肯定就不希望自己依赖的项目带个 60 多 MB 的东西, 而且他们肯定自带 groovy 运行时。

在编译依赖的时候下载一个 60 多 MB 的东西肯定也是不现实的( Kotlin 笑而不语),因此我们需要去掉一部分 compile 级别的依赖。

于是我们就需要在打包的时候指定三种类型的依赖:

  • test 级别
  • compile 级别
  • artifact 级别

别的不多说了我们直接看解决方案吧。

案例

我就拿我的 Lice 的主仓库举例,为了突出效果,我给它强行加上了 clojure script 的依赖,实际上是不存在的。

它:

  • 依赖 Kotlin 标准库,需要打包到目标文件
  • 依赖 JUnit 和 Kotlin 标准测试库,作为测试库
  • 艺术性地加上了 clj 的依赖,不打包到目标文件
  • 需要打包可执行 jar ,主类是 org.lice.repl.Main

解决方案

依赖的配置

首先是依赖的问题:

configurations {
  artifact
}

dependencies {
  artifact "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
  artifact group: 'org.jetbrains', name: 'annotations', version: '15.0'
  compile "org.clojure:clojurescript:1.8.51"

  configurations.compile.extendsFrom(configurations.artifact)

  testCompile group: 'junit', name: 'junit', version: '4.12'
  testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
}

在上文中,我们首先定义了一种配置的类型:

configurations {
  artifact
}

然后我们在 dependencies 里面添加了一行

configurations.compile.extendsFrom(configurations.artifact)

就是把所有的 要导出的 库全部复制到 compile 级别(因为 artifact 级别的库一定是 compile 级别的)。

然后指定一些依赖:

artifact "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
artifact group: 'org.jetbrains', name: 'annotations', version: '15.0'
compile "org.clojure:clojurescript:1.8.51"

testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"

jar 的配置

最后我们需要在 jar 这个任务中指定一些配置。

jar {
  manifest {
    attributes 'Main-Class': 'org.lice.repl.Main'
  }
  from {
    configurations
        .artifact
        .collect { it.isDirectory() ? it : zipTree(it) }
  }
}

首先,我们在 manifest 栏指定我们要加一个参数,就是主类,然后指定主类的全限定名。

最后我们在导出 jar 的时候把依赖加进去就好了。

测试一下,使用下面的指令(请把 lice-3.1.1.jar 换成你的 jar 的名字):

./gradlew assemble
cd build
cd libs
java -jar lice-3.1.1.jar

成功看到了回显:

D:\git-repos\lice-lang\build\libs>java -jar lice-3.1.1.jar
Lice language repl v3.1.1
see: https://github.com/lice-lang/lice

剑未佩妥,出门已是江湖。千帆过尽,归来仍是少年。
|> ((expr op (op 3 4)) (lambda a b (+ (* a a) (* b b))))
25 => java.lang.Integer
|> (def fun a (sin (+ a 1)))
defined: fun => org.lice.lang.DefineResult
|> ((expr op (op 3 4)) fun)
expected 1 arguments, found: 2
at line: 1
|> ((expr op (op 3)) fun)
-0.7568024953079282 => java.lang.Double
|>

享受你们自己吧。(谜之 Chinglish


Search

    Post Directory



    如果觉得这篇文章给您带来了收获或者说它值得您这么做,您可以选择对我进行捐助。
    下面是微信支付哟


    本作品由
    Gradle 定制 artifact采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。
    基于 http://ice1000.org/2017/05/02/GradleArtifactConfig/上的作品创作。
    This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
    知识共享许可协议