如何使用Gradle从已编译的类创建其他jar工件?

cod*_*ven 4 java groovy gradle

我不知道这是Gradle 1.0m7的错误,还是我们只是做错了.

我们有一些类被编译为项目的一部分,我们希望将它们单独地放入它自己的工件中.这些是例如我们想要与另一个项目共享的独立域模型对象.

我不想去多项目构建路线,那么我们如何告诉Gradle为这些创建另一个jar?

目前我们这样做:

task modelJar(type: Jar) {
    classifier = 'model'
    from fileTree(dir: sourceSets.main.classesDir).matching { include 'com/foo/bar/model/**' }
}

artifacts {
    archives modeljar
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是modeljar任务编译类之前运行.起初我们没有意识到这一点,并认为这是有效的.事实证明,工件正在从上一次运行中获取类,而不是当前运行.在构建之前执行clean会导致jar中没有类,并显示问题.

我在看自定义配置,但它似乎相当复杂,我不想过度复杂的构建文件.

感谢任何建议.

谢谢.

Ren*_*hke 14

最方便的方法是

task modelJar(type: Jar) {
    classifier = 'model'
    from sourceSets.main.output
    include 'com/foo/bar/model/**'
}
Run Code Online (Sandbox Code Playgroud)

一些背景知识:sourceSets.main.output是一个可构建的文件集合.这意味着如果任务使用此文件集合,则gradle知道必须先创建此文件集合,然后其他任务才能使用它.在这种特殊情况下,sourcesets.main.classes连接到java插件的classes任务.因此,您的modelJar任务不需要明确依赖于类任务.

  • 好吧,我对此有一点看法.从gradle初学者的角度来看,你可能是对的.但想想这个:创建jar时你感兴趣的是你的主要源集的输出.但作为modelJar的作者,我不关心在创建此输出时负责哪个任务. (6认同)

rod*_*ion 5

如何制作modelJar任务取决于classes(内置)任务?这应该确保在modelJar任务之前完成编译.

task modelJar(dependsOn: classes, type: Jar){
  ...
Run Code Online (Sandbox Code Playgroud)