如何使用具有实现依赖关系的 Gradle 创建可执行的胖 JAR?

我在Gradle 4.6中有一个简单的项目,并希望制作一个可执行的JAR。我尝试过,,,插件,但它们都没有添加我的依赖项声明为(我没有任何依赖项)。它适用于例如插件,但我希望有依赖关系。shadowgradle-fatjar-plugingradle-one-jarspring-boot-gradle-pluginimplementationcompilecompilegradle-one-jarimplementation


答案 1

您可以使用以下代码。

jar {
    manifest {
        attributes(
                'Main-Class': 'com.package.YourClass'
        )
    }
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
 }

请务必替换为包含 的完全限定类名。com.package.YourClassstatic void main( String args[] )

这将打包运行时依赖项。如果您需要更多信息,请查看文档


答案 2

根据接受的答案,我需要再添加一行代码:

task fatJar(type: Jar) {
  manifest {
    attributes 'Main-Class': 'com.yourpackage.Main'
  }
  archiveClassifier = "all"
  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
  with jar
}

如果没有这个额外的行,它省略了我的源文件,只添加了依赖项:

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

对于较新的 gradle (7+),您可能会看到以下错误:

Execution failed for task ':fatJar'.
> Entry [some entry here] is a duplicate but no duplicate handling strategy has been set. Please 
refer to https://docs.gradle.org/7.1/dsl/org.gradle.api.tasks.Copy.html#org.gradle.api.tasks.Copy:duplicatesStrategy
 for details.

如果发生这种情况,请向任务添加一个类似。duplicatesStrategyduplicatesStrategy "exclude"fatJar

同样,对于Gradle 7 +,您只需要删除该行,因为它在此版本的gradle中不再是有效的配置。configuration.compile.collect


推荐