【问题标题】:Gradle: How to make a compile scope file dependency excluded in packaging?Gradle:如何在打包中排除编译范围文件依赖项?
【发布时间】:2013-04-19 14:54:01
【问题描述】:

我有一个具有以下基本结构的多模块 gradle 项目:

root
  core
  c-interface
  m-interface

c接口和m接口都依赖于核心项目:

compile project(':root:core')

c-interface 和 m-interface 使用 WAR 插件,但 core 没有,只​​是一个 jar。

在核心项目中,我使用以下内容引入了一些文件系统依赖项。我无法将这些依赖项之一打包在 c-interface 和 m-interface 生成的 WAR 中。以前我在一个nexus maven存储库中有这个依赖关系,所以我可以在c-interface和m-interface的providedRuntime配置中按组、名称、版本排除它。

我不知道如何对文件依赖项做同样的事情。 gradle 依赖项任务没有列出文件依赖项,所以我不知道我会在提供的运行时中放入什么。

我阅读了http://issues.gradle.org/browse/GRADLE-471,但尝试使用那里的想法似乎并没有从我的包中删除存档。这是我目前正在定义的内容(在核心的 build.gradle 中):

compile fileTree(dir: 'dependencies/compile/archive', include: '*.jar', exclude: 'management.jar')
compile(files('dependencies/compile/archive/management.jar')){ notPackaged = true  } // Excludes it from all publications

更新

providedCompile without war plugin 看起来很有可能。我在核心 build.gradle 中进行了设置,它编译得很好,但是 c-interface 和 m-interface 在编译时也需要依赖。在 c-interface 和 m-interface 中将文件作为providedCompile(甚至使用compile 进行完整性检查)包含在内,并不能修复与缺少 management.jar 依赖项相关的编译时错误。我的猜测是因为它已经在 core 中定义为 providedCompile ,所以新声明在 c-interface 和 m-interface 中被忽略了。

核心/build.gradle:

configurations { providedCompile }

dependencies {
    providedCompile files('dependencies/compile/archive/management.jar')
}

sourceSets.main.compileClasspath += configurations.providedCompile
sourceSets.test.compileClasspath += configurations.providedCompile
sourceSets.test.runtimeClasspath += configurations.providedCompile

c-interface/build.gradle:

providedCompile files('dependencies/compile/archive/management.jar')

【问题讨论】:

    标签: build dependencies gradle


    【解决方案1】:

    可能有更简洁的解决方案,但您可以指定自定义配置:

    configurations {
        compileOnly
    }
    

    然后指定所有依赖项:

    dependencies {
        compile fileTree(dir: 'dependencies/compile/archive', include: '*.jar', exclude: 'management.jar')
        compileOnly files('dependencies/compile/archive/management.jar')
    }
    

    最后将compileOnly配置添加到所有源集的类路径

    sourceSets.all {
        compileClasspath += configurations.compileOnly
    }
    

    这样management.jar 应该在编译的类路径上,但不会被打包。

    编辑 直到现在我才完全理解你的问题。以下为我在一个测试项目中工作。

    在核心项目 gradle 文件中:

    repositories {
        flatDir {
            dirs 'dependencies/compile/archive'
        }
    }
    
    dependencies {
        compile fileTree(dir: 'dependencies/compile/archive', include: '*.jar', exclude: 'management.jar')
        compile ':management:'
    }
    

    在依赖核心的项目中:

    repositories {
        flatDir {
            dirs new File(project(':core').projectDir, 'dependencies/compile/archive')
        }
    }
    
    dependencies {
        compile(project(':core')) {
            exclude module: 'management'
        }
        compileOnly ':management':
    }
    
    sourceSets.all {
        compileClasspath += configurations.compileOnly
    }
    

    【讨论】:

    • 这看起来与我的问题中提供的编译配置非常相似。为我产生相同的结果,management.jar 在编译 c-interface 和 m-interface 时无法解析
    • 是的,看起来我完全跳过了你的问题的那部分......你能在 afterEvaluate 块中打印主源集的编译类路径上的所有文件吗?
    • 类似:afterEvaluate { sourceSets.main.compileClasspath.files.each { println it } }
    • 当然。在核心和 c 接口中运行 afterEvaluate 我可以告诉你 management.jar 是为核心的 afterEvaluate 块列出的,但不是为 c 接口的 afterEvaluate 块列出的。
    • 如果我将相同的 compileOnly/providedCompile 配置添加到 c-interface 的 build.gradle 中,management.jar 确实出现在列表中,但 compileJava 任务仍然失败,无法解析包。跨度>
    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2015-03-12
    相关资源
    最近更新 更多