42

我想构建一个包含项目所有传递依赖项的 uberjar(AKA fatjar)。我需要添加哪些行build.gradle

这是我目前拥有的:

task uberjar(type: Jar) {
    from files(sourceSets.main.output.classesDir)

    manifest {
        attributes 'Implementation-Title': 'Foobar',
                'Implementation-Version': version,
                'Built-By': System.getProperty('user.name'),
                'Built-Date': new Date(),
                'Built-JDK': System.getProperty('java.version'),
                'Main-Class': mainClassName
    }
}
4

4 回答 4

41

我将其替换task uberjar(..为以下内容:

jar {
    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }

    manifest {
        attributes 'Implementation-Title': 'Foobar',
                'Implementation-Version': version,
                'Built-By': System.getProperty('user.name'),
                'Built-Date': new Date(),
                'Built-JDK': System.getProperty('java.version'),
                'Main-Class': mainClassName
    }
}

需要排除项,因为在他们缺席的情况下,您将遇到问题。

于 2012-06-11T20:05:21.000 回答
37

您是否尝试过gradle 食谱中的 fatjar 示例?

你要找的是gradle的影子插件

于 2012-06-11T19:29:46.717 回答
8

只需将其添加到您的 java 模块的 build.gradle 中。

mainClassName = "my.main.Class"

jar {
  manifest { 
    attributes "Main-Class": "$mainClassName"
  }  

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

这将产生 [module_name]/build/libs/[module_name].jar 文件。

于 2016-11-26T04:45:02.063 回答
5

我发现这个项目非常有用。使用它作为参考,我的 Gradle uberjar 任务将是

task uberjar(type: Jar, dependsOn: [':compileJava', ':processResources']) {
    from files(sourceSets.main.output.classesDir)
    from configurations.runtime.asFileTree.files.collect { zipTree(it) }

    manifest {
        attributes 'Main-Class': 'SomeClass'
    }
}
于 2014-09-24T16:34:19.123 回答