build - Gradle:如何在打包中排除编译范围文件依赖项?

标签 build dependencies gradle

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

root
  core
  c-interface
  m-interface

c-interface 和 m-interface 都依赖于核心项目:
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')

最佳答案

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

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
}

关于build - Gradle:如何在打包中排除编译范围文件依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107477/

相关文章:

未找到 Maven 测试依赖项

build - 失败时创建工作项 - 如何分配给特定用户

maven 未在 ubuntu 14.0.4 上更新

c# - 如何使多个 .net 项目在构建中仅复制引用一次

java - 导入 Maven 插件

dependencies - gnu make的依赖问题

android - Android Studio错误:找不到名称为 'debug'的配置

gradle - 事后如何从 Gradle 依赖项列表中排除?

gradle - 无法导入在单独文件中定义的任务监听器

.net - 我想在 C# 构建期间运行脚本,但**仅当项目不是最新时**