Java Gradle:如何创建多个jar?

Java Gradle:如何创建多个jar?,java,groovy,gradle,build.gradle,Java,Groovy,Gradle,Build.gradle,我是Gradle和Groovy的新手,我希望能有办法解决我的问题 我有几个包,每个包都需要编译成一个jar。 我发现的一个解决方案是创建多个Jar类型的任务,但我希望避免复制/粘贴,并在向项目添加新包时得到一个巨大的gradle文件 我当前的实现是有多个jar任务,如下所示: task jarFoo(type: Jar) { baseName = "foo" version = "1.0.0" String className = baseName.capitalize(

我是Gradle和Groovy的新手,我希望能有办法解决我的问题

我有几个包,每个包都需要编译成一个jar。
我发现的一个解决方案是创建多个
Jar
类型的任务,但我希望避免复制/粘贴,并在向项目添加新包时得到一个巨大的gradle文件

我当前的实现是有多个jar任务,如下所示:

task jarFoo(type: Jar) {
    baseName = "foo"
    version = "1.0.0"
    String className = baseName.capitalize()

    from(sourceSets.main.output) {
        include "$baseName/**"
    }

    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }

    manifest {
        attributes "Implementation-Title": "$className",
                "Implementation-Version": "$version",
                "Main-Class": "$baseName.$className"
    }
}
它的工作方式很有魅力,但是我经常添加包,最终会有很多包,因此会有很多任务和大量复制/粘贴的代码

在摆弄了
build.gradle
文件之后,我发现我需要从
Jar
扩展以创建一个Jar

下面是到目前为止该课程的代码:

class JarTask extends Jar {
    String jarName = "default"
    String jarVersion = "1.0.0"

    @TaskAction
    def jar() {
        baseName = jarName
        version = jarVersion
        String className = baseName.capitalize()

        // Thanks Opal for reminding that sourceSets
        // is defined in project.
        from(project.sourceSets.main.output) {
            include "$baseName/**"
        }

        from {
            configurations.compile.collect {
                it.isDirectory() ? it : zipTree(it)
            }
        }

        manifest {
            attributes "Implementation-Title": "$className",
                    "Implementation-Version": "$version",
                    "Main-Class": "$baseName.$className"
        }
    }
}

task jarFoo(type: JarTask) {
    jarName = "foo"
}

task jarBar(type: JarTask) {
    jarName = "bar"
    jarVersion = "1.2.42"
}
问题是,创建的jar基本上忽略了方法中的所有内容:它只包含一个
MANIFEST.MF
,其中包含一行清单版本,并给出了项目的名称,而不是任务中给出的名称。没有别的了

如果需要,您可以在my(主要是法语)中在线找到代码


任何想法都将受到衷心的感谢

编辑后,问题很简单。给定任务没有属性
sourceset
Jar
)<代码>源集是在
项目
上定义的,扩展
默认任务
的每个任务都从其父项继承
项目
字段。所以你只需要:

from(project.sourceSets.main.output) {
   include "$baseName/**"
}
回答

我希望您理解任务配置和执行阶段之间的区别。这就是这里发生的问题。基本上,您扩展了
Jar
任务,它与
Copy
类型的所有任务一样,不是为扩展而设计的-请参阅。在任务操作中,您配置要复制的工件,但。。现在进行配置已经太晚了——这是执行阶段。可以使用任务来解决问题。我已经修改了脚本,它是:

apply plugin: "idea"
apply plugin: "java"

repositories {
    mavenCentral()
}

dependencies {
    compile "com.intellij:forms_rt:7.0.3"
    runtime "com.intellij:forms_rt:7.0.3"
}

tasks.addRule('Pattern: build<ID>') { String taskName ->
    if (taskName.startsWith('build')) {
        task(taskName, type: Jar) {
            baseName = taskName - 'build'
            version = '1.0.0'
            String className = baseName.capitalize()            

            from(sourceSets.main.output) {
                include "$baseName/**"
            }

            from {
                configurations.compile.collect {
                    it.isDirectory() ? it : zipTree(it)
                }
            }

            manifest {
                attributes "Implementation-Title": "$className",
                        "Implementation-Version": "$version",
                        "Main-Class": "$baseName.$className"
            }
        }
    }
}

artifacts {
   archives project.tasks['buildqcm'], project.tasks['buildlistage'] //etc
}
应用插件:“创意”
应用插件:“java”
存储库{
mavenCentral()
}
依赖关系{
编译“com.intellij:forms\u rt:7.0.3”
运行时“com.intellij:forms\u rt:7.0.3”
}
tasks.addRule('Pattern:build'){String taskName->
if(taskName.startsWith('build')){
任务(任务名,类型:Jar){
baseName=taskName-“生成”
版本='1.0.0'
字符串className=baseName.capitalize()
from(sourceset.main.output){
包括“$baseName/**”
}
从{
configurations.compile.collect{
it.isDirectory()?it:zipTree(it)
}
}
显示{
属性“实现标题”:“$className”,
“实施版本”:“$Version”,
“主类”:“$baseName.$className”
}
}
}
}
人工制品{
归档project.tasks['buildqcm'],project.tasks['buildlistage']//等
}

并且应该使用
gradle buildlistage buildqcm
简单调用。您可以进行额外的验证,以检查包列表中是否有已传递的
,例如,希望对您有所帮助,并为您等待了这么长时间感到抱歉://

这里有另一个更简单的选项,允许传递参数。我在这个话题上找到了灵感:,听起来和我想做的完全一样

在这里,我们基本上定义了一个方法,在给定一些参数的情况下返回一个任务。剩下的只是测试是否给出了一个版本,或者是否已经给出了有问题的代码,并通过@Opal great help进行了修改

工件
块中包含新的构建就足以使任务可用。然后,只需运行
gradlejarqcm
来构建单个包,或者运行
gradleassemble
来编译所有内容

apply plugin: "idea"
apply plugin: "java"

repositories {
    mavenCentral()
}

dependencies {
    compile "com.intellij:forms_rt:7.0.3"
    runtime "com.intellij:forms_rt:7.0.3"
}

def jarPackage(artifactName, artifactVersion) {
    if (artifactVersion == "" || artifactVersion == null) {
        artifactVersion = "1.0.0"
    }
    return tasks.create("jar${artifactName}", Jar) {
        baseName = artifactName
        version = artifactVersion
        String className = baseName.capitalize()

        from(sourceSets.main.output) {
            include "$baseName/**"
        }

        from {
            configurations.compile.collect {
                it.isDirectory() ? it : zipTree(it)
            }
        }

        manifest {
            attributes "Implementation-Title": "$className",
                    "Implementation-Version": "$version",
                    "Main-Class": "$baseName.$className"
        }
    }
}

artifacts {
    archives jarPackage("aleatoire", ""), jarPackage("calculatrice", "1.2.3"), jarPackage("copier", ""),
            jarPackage("qcm", "1.0.0")
}

我无法复制它。你的意思是“优化”代码对你有用吗?我编辑了该问题以添加我在该问题上的一些进展。我刚刚回答了该问题,请检查它是否有效。谢谢你的回答!它解决了
找不到属性“sourceset”的错误。但是jar仍然几乎为空(只是一个清单文件),并且具有项目名称,而不是任务中给定的名称。有什么想法吗?还没有。我会发布一个答案;)但是如果你有什么建议的话,我很乐意尝试一下@加布里埃尔,现在情况如何?很抱歉,原始问题有太多的编辑,我无法了解现在发生了什么?我编辑了问题。谢谢你告诉我它正在疯狂!我真诚地希望现在一切都清楚了,如果有什么不对劲,告诉我。好了,现在看起来好多了。你有在线主持这个项目吗?