Gradle:将多项目依赖项压缩到应用程序JAR文件中?

时间:2016-01-05 17:22:15

标签: java maven gradle jar

build.gradle脚本中,我将执行以下任务以将依赖项包含到可运行的应用程序JAR文件中。

jar {
manifest {
    attributes(
            'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
            'Main-Class': 'org.somepackage.MyMainClass'
    )
}
from configurations.compile.collect { entry -> zipTree(entry) }
}

但是,在多项目设置中,我在JAR文件中缺少一些依赖项。我最终发现其他项目build.gradle脚本中指定的任何依赖项都没有包含在内,除非父项目也具有这些依赖项。

例如,项目A依赖于项目B.项目B使用Google Guava。当我将Project A部署到可运行的JAR文件时,不会包含Google Guava,并且会出现运行时错误。如果项目A在其build.gradle脚本中冗余地指定了Google Guava,那么它运行得很好。

如何修改上面的jar任务以在多项目设置中包含依赖项?

1 个答案:

答案 0 :(得分:0)

我从this post得到了一些似乎有用的想法。

jar {
    manifest {
        attributes(
                'Main-Class': 'com.swa.rm.pricing.reporting.ux.SaleMxReportingUI'
        )
    }
}

task fatJar(type: Jar) {
    manifest.from jar.manifest
    classifier = 'all'
    from {
        configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
    } {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
    with jar
}