【问题标题】:How to make a Jar file with dependencies by Gradle 7.0+?如何通过 Gradle 7.0+ 制作具有依赖关系的 Jar 文件?
【发布时间】:2020-04-09 13:18:46
【问题描述】:

我当前在build.gradle 中的jar 如下所示:

jar {
manifest {
    attributes "Main-Class": "hoge.Main"
}
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}

并且运行良好。

但是,我收到了来自 Gradle 的消息(可能是从 6+ 开始?)

这是实际的消息:

The compile configuration has been deprecated for dependency declaration. This will fail with an error in Gradle 7.0. Please use the implementation configuration instead.

configurations.compile 部分已弃用。

如何更新?

如果我改变了

jar {
manifest {
    attributes "Main-Class": "hoge.Main"
}
    from configurations.implementation.collect { it.isDirectory() ? it : zipTree(it) }
}

Gradle 说> Resolving configuration 'implementation' directly is not allowed

【问题讨论】:

    标签: java gradle jar dependencies build.gradle


    【解决方案1】:

    在您的情况下,您需要将 compile 替换为 runtimeClasspath

    在之前的 Gradle 版本中,compile 的职责太多:

    • 声明依赖关系
    • 解析为编译类路径
    • 暴露于消费项目

    已替换为implementation用于依赖声明,也需要替换为解析。

    但是,在您的情况下,您很可能希望打包 runtime 依赖项而不是编译依赖项。因此,您应该使用runtimeClasspath 作为要解析的配置。而不是 compileClasspath,它不会包含任何 runtimeOnly 依赖项。

    【讨论】:

      【解决方案2】:

      对于希望将 Gradle 配置升级到 7.0+ 格式的其他人,请注意,如果您使用 java 插件,只需将 compile 替换为 implementationapi 可能会出错。您需要使用 java-library 插件。 Documentation.

      确保在您的 gradle.config 中替换:

      apply plugin: 'java'
      

      与:

      apply plugin: 'java-library'
      

      implementation 用于非传递依赖,api 用于传递依赖(如果依赖项直接由项目的依赖项使用)。

      【讨论】:

        【解决方案3】:

        compile 配置已被弃用,取而代之的是 implementation

        docs

        【讨论】:

        • 我知道。我问如何更新我的弃用代码。
        • @kensuke1984 怎么做就是用implementation替换所有使用compile
        • 是的,谢谢,但是当我这样做时,我有 "> 不允许直接解决配置“实施”"
        • @kensuke1984 您现在提出了一个新问题。见stackoverflow.com/questions/47910578/…
        • compileimplementation 发生了重大变化。
        【解决方案4】:

        可以帮助他人。通过使用java-library 插件和https://docs.gradle.org/current/userguide/java_library_plugin.html 中提到的那样使它工作 runtimeClassPath 不是可消耗的,但可解析的。 可以像这样收集第一级依赖项: def firstLevelDepdendencies = project.configurations.runtimeClassPath.resolvedConfiguration.firstLevelModuleDependencies.collectMany { it.moduleArtifacts }.toSet()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-05
          • 2011-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-01
          • 2011-04-14
          相关资源
          最近更新 更多