【问题标题】:How to include all src/test/resources/** AND src/main/java/**/*.html in the test sourceset in gradle?如何在 gradle 的测试源集中包含所有 src/test/resources/** 和 src/main/java/**/*.html?
【发布时间】:2016-11-19 00:23:15
【问题描述】:

我有以下内容,并认为它是“添加”到我的 sourceSet 但实际上只是修改了它..

sourceSets {
    test {
        resources {
            srcDirs = ["src/main/java"]
            includes = ["**/*.html"]
        }
    }
}

我真正想要的是 src/test/resources/** 和上面的。我不想从 src/test/resources 中排除任何文件,上面只包括我放在那里的任何目录中的 html。

谢谢, 院长

【问题讨论】:

  • 尝试 += 运算符而不是普通的 =
  • @Jk1 我不确定我是否理解。 srcDirs += ["src/main/java"] ...好的,但是当我包含 = ["*/.html"] 时,它将开始排除 src/test/resources 中的其他内容我想用的,对吧?我也不希望包含 += ["*/.html"] 因为这意味着 */ + */.html不过我好像没用?
  • @Jk1 也许你可以举个例子来详细说明一下?
  • @DeanHiller 所以,澄清一下,您想要来自任何地方的所有 html 文件,以及 src/main/java 下的所有内容以及 src/test/resources 下的所有内容?

标签: gradle


【解决方案1】:

以下将使用main 说明该技术(因此可以验证):

apply plugin: 'java'

sourceSets {
    myExtra {
        resources {
            srcDirs "src/main/java"
            includes = ["**/*.html"]
        }
    }
    main {
        resources {
            source myExtra.resources
        }
    }
}

通过命令行验证概念:

bash$ ls src/main/java
abc.html
xyz.txt

bash$ ls src/main/resources/
def.html
ijk.txt

bash$ gradle clean jar
bash$ jar tf build/libs/myexample.jar
META-INF/
META-INF/MANIFEST.MF
abc.html
def.html
ijk.txt

在您的情况下,将main 更改为test。这个答案是通过Gradle doc for SourceDirectorySet 发现的。有趣的是,对于 3.0,它包含一个 TODO:

TODO - 为单个源目录配置包含/排除

这意味着这种解决方法(通过this method)可能是必要的。

【讨论】:

  • grrrrrrr,对@Michael Easter 来说,它似乎工作得很好,但使用重复的 src/main/resources 条目破坏了 ./gradlew eclipse 命令。它几乎奏效了。 gradle 插件仍然可以工作,但是 gradle 插件被破坏了,因为它没有移植 -parameters 设置以确保参数被编译到类文件中......只是我的运气:(。答案适用于纯 gradle 虽然在至少。其他任何人,请小心,因为它可能会破坏您的其他东西,直到 gradlew eclipse 修复。
【解决方案2】:

我明白你的意思。我试过了,它奏效了。请看一下:

sourceSets {
    test {
        resources {
            srcDirs = ["src/main/java"]
            includes = ["**/*.html"]
        }
    }
}

sourceSets.test.resources.srcDir 'src/test/resources'

在 build.gradle 中添加这些。

【讨论】:

  • @VyacheslavShvets 你遇到了什么错误?
  • 我收回了。此解决方案不起作用,因为它最终只包含来自 src/test/resources 的 .html 文件。我想要 src/test/resources/**** 和 src/main/java/**/.html 但这个解决方案没有这样做。
【解决方案3】:

我在考虑是否发布这个答案。因此,如果您对前面的答案不满意,请尝试以下 hacky 方式(可能与 eclipse 命令一起使用):

apply plugin: 'java'

ConfigurableFileTree.metaClass.getAsSource = {
  def fileTrees = delegate.asFileTrees
  fileTrees.metaClass.getSrcDirTrees = {
    return delegate as Set
  }
  fileTrees as SourceDirectorySet
}

sourceSets {
  main {
    resources {
      srcDirs = []  // cleanup first
      source fileTree('src/main/java').include('**/*.html').asSource
      source fileTree('src/main/resources').asSource
    }
  }
}

【讨论】:

    【解决方案4】:

    不完全符合您的要求,但可能对发现此问题的人有所帮助:

    我只想将测试资源放在源旁边。所以我只需要排除来源。 在您的情况下,也许您可​​以排除那些您介意在 JAR 和/或类路径中获取的内容。

    其他答案都不适合我,这确实有效:

    sourceSets {
        test {
            resources {
                srcDirs += "src/test/kotlin"
                excludes = ["**/*.kt"]
            }
        }
    }
    

    Gradle 6.3.

    【讨论】:

      【解决方案5】:

      使用srcDir 可能是您想要的。这是一个例子:

      sourceSets {
          main {
              resources {
                  srcDir "src/main/resources"
                  exclude "file-to-be-excluded"
                  include "file-to-be-included"
      
                  srcDir "src/main/java"
                  include "**/*.html"
      
                  srcDir "image-folder-in-root"
                  include "**/*.png"
                  include "**/*.jpg"
                  exclude "**/*.xcf"
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 2020-03-08
        • 2011-02-24
        • 2013-05-11
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多