java - Gradle:如何创建多个jar?

标签 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()

    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 ,其中包含一行 list 版本,并给出了项目的名称,而不是任务中给出的名称。没有别的了。

如果需要的话可以在我的GitHub repo中在线找到代码(主要是法语)。

任何想法都将受到真正的赞赏!

最佳答案

这是另一个更简单的选项,允许传递参数。我找到了这个主题的灵感:https://discuss.gradle.org/t/passing-arguments-to-a-task/8427/20 ,这听起来和我想做的一模一样。

这里我们基本上定义了一个返回任务的方法,给定一些参数。剩下的只是测试是否给出了版本,或者是否已经给出了相关代码并在 @Opal 的帮助下进行了调整。

将新构建包含在 artifacts block 中就足以使任务可用。然后,只需运行 gradle jarqcm 来构建单个包或 gradle assemble 来编译所有内容。

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")
}

关于java - Gradle:如何创建多个jar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29963959/

相关文章:

java - AWS lambda 和 Java 并发

android - Gradle构建因编译时错误而失败,而Android Studio IDE未显示此类错误

Grails Inline Plugin 导致 grails 2.3.8 中的打包错误

groovy - 为什么提取这个方法在gradle中不起作用?

java - 如何为 Java 8 groupingby 函数形成的结果添加标签?

java - 发送命令列表

java - 缓存/优化从数据库加载数据的动态 View

Gradle/Groovy 语法困惑

gradle - 是否有Groovier方式访问属性文件?

grails - 使用grails添加数据时,请提供null异常帮助