当前位置: 首页 > 知识库问答 >
问题:

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

喻子航
2023-03-14

我在Gradle 4.6中有一个简单的项目,我想为它制作一个可执行的JAR。我尝试过shadowgradle-fatjar-plugingradle-one-jarspring-boot-gradle-plugin插件,但它们都没有添加我声明为实现的依赖项(我没有任何编译依赖项)。它与compile一起工作,例如用于gradle one jar插件,但我希望有实现依赖项。

共有3个答案

壤驷华辉
2023-03-14

使用Gradle Kotlin DSL可以以类似的方式完成相同的任务:

val jar by tasks.getting(Jar::class) {
    manifest {
        attributes["Main-Class"] = "com.package.YourClass"
    }

    from(configurations
        .runtime
        // .get() // uncomment this on Gradle 6+
        // .files
        .map { if (it.isDirectory) it else zipTree(it) })
}
南门鸿振
2023-03-14

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

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.

如果发生这种情况,请向fatJar任务添加duplicatesStrategyduplicatesStrategy“exclude”

同样,对于Gradle 7,您必须删除configuration.compile.collect行,因为它在这个版本的gradle中不再是有效的配置。

郑星雨
2023-03-14

您可以使用以下代码。

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

务必更换com。包裹YourClass,其完全限定类名包含静态void main(字符串args[])

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

 类似资料:
  • 问题内容: 我在Gradle 4.6中有一个简单的项目,并希望制作一个可执行的jar。我试过,,,插件,但他们都没有增加我的依赖性声明(我没有任何的)。它与例如插件一起工作,但我希望有依赖关系。 非常感谢你! 问题答案: 您可以使用以下代码。 请务必使用包含的完全合格的类名称替换。 这将打包运行时依赖项。如果需要更多信息,请检查文档。

  • 我正在使用Gradle构建并打包一个非常简单的Spring启动应用程序(99%的静态内容)到带有嵌入式tomcat的jar中。 我尝试创建该jar,起初结果86k,没有启动,因为它缺少一些Spring Boot类。我得出结论,我制作的这个jar不包含应用程序的任何依赖项,既然我确实想要一个完全独立的jar,我应该做更多的研究。 这时,我发现建议将{configurations.compile.co

  • 问题内容: 我不想将其打包在单个可执行jar中进行分发。我需要一个可执行文件,例如main.jar,所有依赖项都在libs / *。jar中 我如何才能使maven可执行jar不预先包含在其依赖库中? 在如何使用Maven创建具有依赖项的可执行JAR中?10年12月1日10:46回答了一条注释,安德烈·阿隆森(AndréAronsen),但那根本不起作用(未设置失败的sadescriptorRef

  • 问题内容: 我想将我的项目打包在一个可执行的JAR中进行分发。 如何使Maven项目将所有依赖JAR打包到我的输出JAR中? 问题答案: 然后用 编译目标应在Assembly:single:single之前添加,否则不包括您自己项目中的代码。 通常,此目标与自动执行的构建阶段相关。这样可以确保在执行mvn install或执行部署/发布时构建JAR 。

  • 我想将我的项目打包在一个单独的非可执行库JAR中进行分发。如何使Maven项目将所有依赖项JAR打包到输出JAR中?Maven assembly插件中有一个选项来创建一个具有依赖项的可执行JAR。有一个接收器来获得目标。但是,我需要构建一个没有类的库jar。我怎么才能造出这样的罐子?

  • 我有一个库,我称之为,它是另一个项目的依赖项,名为。在的构建中。gradle,我正在使用,它以如下方式指定为依赖项: 这很有效-已编译。但是,当我在我的项目中使用它时,我得到了以下内容: <code>生成。的gradle如下所示: 可能这是因为库在,但它没有正确的位置来搜索Maven存储库。有没有一种方法可以使这些搜索位置以及依赖关系本身变得短暂?