【问题标题】:Gradle: War Task has Conflicting Includes/ExcludesGradle:战争任务有冲突的包含/排除
【发布时间】:2026-01-30 21:25:01
【问题描述】:

我正在尝试使用 Gradle 构建一个 war 文件,但我遇到了一个问题,它排除了一个目录并包含了另一个恰好具有相同名称但父目录不同的目录。

请注意,在下面的第一个代码示例中,css/ 目录都没有包含在最终的war 文件中——我假设是因为 Gradle 认为我想排除 任何目录命名为css/,无论其绝对路径如何。

基本上我想排除src/main/webapp/css 并包含build/tmp/css,因为后者包含缩小的代码。我怎样才能做到这一点?我尝试过以各种方式指定绝对路径,但都没有成功。

war {
  dependsOn minify
  from('build/tmp/') { include ('css/') }
  exclude('WEB-INF/classes/', 'css/')
}

如果我不排除 css/ 像这样:

war {
  dependsOn minify
  from('build/tmp/') { include ('css/') }
  exclude('WEB-INF/classes/')
}

那么结果是包含了缩小和非缩小的代码。

【问题讨论】:

    标签: java groovy build build-process gradle


    【解决方案1】:

    我不确定您为什么在 build.gradle 中排除 WEB-INF/classes/css 而不是 src/main/webapp/css,但是复制缩小的 CSS 文件而不是原始文件是通过以下方式实现的:

    apply plugin: 'war'
    
    war {
      // dependsOn 'minify'
    
      from 'src/main/webapp'
      exclude 'css' // or: "exclude 'WEB-INF/classes/css'"
    
      from('build/tmp/css') {
        include '**/*.css'
        into 'css' // or: "into 'WEB-INF/classes/css'"
      }
    }
    

    【讨论】:

    • exclude('WEB-INF/classes/', 'css/') 的目的实际上是排除这两个目录。 css/ 不在 classes 内。除此之外,into 'css' 似乎确实可以解决问题。