Java 如何使用Gradle从编译的类中创建额外的jar工件?

Java 如何使用Gradle从编译的类中创建额外的jar工件?,java,groovy,gradle,Java,Groovy,Gradle,我不知道这是Gradle 1.0m7的bug,还是我们做得不对 我们有一些类作为项目的一部分进行编译,我们希望将它们单独装入它自己的工件中。例如,这些是我们希望与另一个项目共享的独立域模型对象 我不想走多项目构建路线,那么我们如何告诉Gradle为这些项目创建另一个jar呢 目前我们正在这样做: task modelJar(type: Jar) { classifier = 'model' from fileTree(dir: sourceSets.main.classesDir

我不知道这是Gradle 1.0m7的bug,还是我们做得不对

我们有一些类作为项目的一部分进行编译,我们希望将它们单独装入它自己的工件中。例如,这些是我们希望与另一个项目共享的独立域模型对象

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

目前我们正在这样做:

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

artifacts {
    archives modeljar
}
这里的问题是modeljar任务在编译类之前运行。起初我们没有意识到这一点,认为这是可行的。事实证明,工件是从上一次运行中拾取类,而不是从当前运行中拾取类。在构建之前执行clean会导致jar中没有类,并揭示问题所在

我正在查看自定义配置,但它似乎非常复杂,我不想使构建文件过于复杂

谢谢你的建议


谢谢。

modelJar
任务依赖于
(内置)任务如何?这应该确保编译是在
modelJar
任务之前完成的

task modelJar(dependsOn: classes, type: Jar){
  ...

最方便的方法是

task modelJar(type: Jar) {
    classifier = 'model'
    from sourceSets.main.output
    include 'com/foo/bar/model/**'
}
一些背景:
sourceSets.main.output是一个可构建的文件集合。这意味着,如果任务使用此文件集合,gradle知道必须先创建此文件集合,然后其他任务才能使用它。在这种情况下,sourcesets.main.classes连接到java插件的classes任务。因此,您的modelJar任务不需要显式地依赖于classes任务。

Briliant!成功了!格雷德尔很了不起,但我希望理解魔法不是那么困难。我不知道这个类任务在做什么,也不知道可以向添加到工件闭包的任务添加依赖项。谢谢很高兴它起作用了。请在他们的网站上查阅Gradle手册。太棒了!答案很好,但我认为rodion的解决方案具有更好的语义。它明确地说存在对某事物的依赖,而这一点是隐含的。谢谢你!我对此有点不同的看法。从gradle初学者的角度来看,你可能是对的。但请想一想:创建jar时,您感兴趣的是主源代码集的输出。但是作为modelJar的作者,我不在乎哪个任务负责创建这个输出。