Java 使用Gradle构建uberjar

Java 使用Gradle构建uberjar,java,groovy,gradle,uberjar,Java,Groovy,Gradle,Uberjar,我想构建一个uberjar(又名fatjar),它包含项目的所有可传递依赖项。我需要添加哪些行到build.gradle 这就是我目前拥有的: task uberjar(type: Jar) { from files(sourceSets.main.output.classesDir) manifest { attributes 'Implementation-Title': 'Foobar', 'Implementation-V

我想构建一个uberjar(又名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
    }
}
您是否已在中尝试过fatjar示例


你要找的是gradle(..

我用以下内容替换了
任务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
    }
}
排除是必要的,因为如果它们不存在,您将遇到问题。

我发现这非常有用。使用它作为参考,我的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'
    }
}

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

mainClassName=“my.main.Class”



这将导致[module\u name]/build/libs/[module\u name].jar文件。

谢谢你的指点。这很有帮助。虽然我遇到了另一个问题,但通过谷歌搜索解决了。我将在此基础上添加另一个答案。看起来烹饪书现在需要登录。因为这正是我要找的,请你将食谱粘贴到这里好吗?@tarzan三年后,我现在使用shadow plugin这很简单,第一次就成功了(在尝试了许多其他“答案”之后:事情在3年内发生了变化。我仍然会使用shadow插件;-)您可能希望尝试改用。只要您没有任何依赖项,这将起作用。但一旦您的项目有依赖项,这些依赖项就不会捆绑到uberjar中。我认为它应该使用
配置。运行时
包含所有运行时依赖项我需要在清单下方添加
和jar
,以获取中的文件e> java/main/resources
在Uberjar中为我工作!如果没有排除部分,它会用SecurityException扼杀我,使用此修复程序,它可以工作!最好甚至使用
sourceset.getByName('main')。runtimeClasspath
有人知道这在kotlin中是什么样子(对于build.gradle,kts文件)但是那是什么代码呢?configurations.compile.collect{it.isDirectory()?it:zipTree(it)}做什么?@SamRedway
configurations.compile.collect
compile
中收集东西三元文件允许它同时拉入文件夹和zip文件(如jar)好像它们也是Folders一样,我没有尝试过这里发布的其他版本,但是这个版本很好用,而且很简单。这个答案排除了任何
runtime
runtimeOnly
声明的依赖项,这将导致应用程序在运行时中断。@mkobit您可以用
runtimeClasspath替换
compile
如中所指定。我获得清单主要属性的
无效签名文件摘要
当我尝试此操作时,您需要
排除“META-INF/*.SF”
排除“META-INF/*.DSA”
排除“META-INF/*.RSA”
类似于missingfaktor的回答似乎不适用于Gradle 5.3.1:“无法获取类型为org.gradle.api.internal.tasks.DefaultSourceSetOutput的主类的未知属性'classesDir'。它给了我java.lang.UnsupportedOperationException。”
jar {
  manifest { 
    attributes "Main-Class": "$mainClassName"
  }  

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