Gradle:如何在包装中排除编译范围文件依赖关系?

时间:2013-04-19 14:54:02

标签: build dependencies gradle

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

root
  core
  c-interface
  m-interface

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

compile project(':root:core')

c-interface和m-interface使用WAR插件,但核心没有,只是一个罐子。

在核心项目中,我将通过以下方式提取一些文件系统依赖项。其中一个依赖项我不能打包在由c-interface和m-interface生成的WAR中。以前我在nexus maven存储库中有这种依赖关系,所以我可以在c-interface和m-interface中的providedRuntime配置中按组,名称,版本排除它。

我无法弄清楚如何对文件依赖关系做同样的事情。 gradle依赖项任务没有列出文件依赖项,因此我不知道我将在provideRuntime中放入什么。

我读了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依赖关系相关的编译时错误。我的推测是因为它已经作为核心中的compile作用,以便在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接口/的build.gradle:

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

1 个答案:

答案 0 :(得分:13)

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

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应该在类路径上进行编译,但不会打包。

EDIT 只有现在我完全理解你的问题。以下对我来说是一个测试项目。

在核心项目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
}