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

新手上路,请多包涵

我在 Gradle 4.6 中有一个简单的项目,想制作一个可执行的 JAR。 I’ve tried shadow , gradle-fatjar-plugin , gradle-one-jar , spring-boot-gradle-plugin plugins but neither of them adds my dependencies declared as implementation (我没有任何 compile )。它适用于 compile 例如 gradle-one-jar 插件,但我想要 implementation 依赖项。

原文由 Dmitry Senkovich 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 759
2 个回答

您可以使用以下代码。

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

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

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

原文由 miskender 发布,翻译遵循 CC BY-SA 4.0 许可协议

基于接受的答案,我需要添加一行代码:

 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.

如果发生这种情况,请将 duplicatesStrategy 例如 duplicatesStrategy "exclude" 添加到 fatJar 任务。

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

原文由 JohnP2 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题