Gradle shadow 插件还打包了所有 "provided"依赖项,这不应该是这种情况

标签 gradle

我想要一个 fat jar 子,但没有提供的依赖项。所以我使用了以下两个插件:

  • https://github.com/johnrengelman/shadow
  • https://github.com/nebula-plugins/gradle-extra-configurations-plugin

  • 并有一个像这样的 build.gradle 文件:
    apply plugin: 'nebula.provided-base'
    apply plugin: 'com.github.johnrengelman.shadow'
    
    archivesBaseName = 'range-cache-drivers'
    group = 'com.engine'
    version = '0.302-SNAPSHOT'
    
    buildDir = 'target'
    
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    
    
    dependencies {
        provided project(':rangeCache')
    
        // CSV, TSV, Fixe width
        compile deps.univocityParsers
        // MongoDB
        compile deps.mongo
        // Cassandra
        compile deps.cassandradx
        compile deps.cassandraSnappy
        compile deps.cassandraLZ4
    }
    

    但是当我运行 gradle shadowJar我的 fat jar 子里仍然有所有的 rangeCache 类。如何从我的胖 jar 中排除提供的依赖项?

    编辑 1:
    这似乎也不起作用, transient 依赖项仍然被复制到胖 jar 中。
    shadowJar {
        dependencies {
            exclude(project(':rangeCache'))
        }
    }
    

    编辑 2:根据斯坦尼斯拉夫的回答,我做了以下工作以使事情正常工作:
    configurations {
        shadow
        compile.extendsFrom provided
        provided.extendsFrom shadow
    }
    
    dependencies {
        provided project(':rangeCache')
    
        // CSV, TSV, Fixe width
        shadow deps.univocityParsers
    
        // MongoDB
        shadow deps.mongo
    
        // Cassandra
        shadow deps.cassandradx
        shadow deps.cassandraSnappy
        shadow deps.cassandraLZ4
    
        testCompile deps.junit
    }
    
    import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
    
    task fatJar(type: ShadowJar) {
        configurations = [project.configurations.shadow]
        from(project.sourceSets.main.output)
    }
    

    最佳答案

    看看this article关于排除 shadow jar 依赖项。
    很快,根据这篇文章,通过 shadowJar 排除一些依赖的依赖项不足以排除其传递依赖项,正如您已经提到的那样。如何做到这一点的解决方案是修改运行时配置,从中排除一些依赖项,例如:

    configurations {    
        runtime.exclude %what you need to exclude%
    }
    
    我希望,它可能会有所帮助。

    关于Gradle shadow 插件还打包了所有 "provided"依赖项,这不应该是这种情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33525048/

    相关文章:

    android - 命令git完成,退出值非零128

    java - 不支持请求方法 'POST' - gradle

    github - 如何将自己的 github fork 库导入 android studio

    gradle - 如何在Android的Gradle中添加存储库和依赖项。实际上是在尝试将SDk集成到我现有的应用中

    ant - 无法在 groovy gradle 中创建 AntBuilder 对象

    android - 我在库模块中有 .aar 文件,如何在应用程序模块中使用它?

    android - Android Studio 0.44 中的 Gradle 无法在执行类型任务中运行的路径上找到进程

    java - 无法解析配置 ':pushwoosh-react-native-plugin:classpath' 的所有 Artifact

    Gradle,如何检索默认资源目录以添加文件

    java - Gradle 不调用其他模块的默认任务