如何让Java代码和Junit测试与Gradle一起构建

如何让Java代码和Junit测试与Gradle一起构建,gradle,Gradle,我有一个项目,其中主源代码和该源代码的测试用例保存在同一个包/目录中。每个测试类都是它正在测试的类的名称,末尾附加了“test”。因此,如果我有一个Foo.java,它旁边就会有一个FooTest.java 我的问题是,我如何与Gradle一起构建这个项目?我仍然希望将类文件分开,即主类文件夹和测试类文件夹。这应该可以做到: sourceSets { main { java { srcDirs = ["some/path"]

我有一个项目,其中主源代码和该源代码的测试用例保存在同一个包/目录中。每个测试类都是它正在测试的类的名称,末尾附加了“test”。因此,如果我有一个Foo.java,它旁边就会有一个FooTest.java


我的问题是,我如何与Gradle一起构建这个项目?我仍然希望将类文件分开,即主类文件夹和测试类文件夹。

这应该可以做到:

sourceSets {
    main {
        java {
            srcDirs = ["some/path"]
            exclude "**/*Test.java"
        }
    }
    test {
        java {
            srcDirs = ["some/path"]
            include "**/*Test.java"
        }
    }
}

作为参考,下面是我用来解决Eclipse插件类路径问题的代码。结合以上彼得的回答,这个方法似乎有效

// The following ensures that Eclipse uses only one src directory
eclipse {
    classpath {
        file {
            //closure executed after .classpath content is loaded from existing file
            //and after gradle build information is merged
            whenMerged { classpath ->
                classpath.entries.removeAll { entry -> entry.kind == 'src'}
                def srcEntry = new org.gradle.plugins.ide.eclipse.model.SourceFolder('src', null)
                srcEntry.dir = file("$projectDir/src")
                classpath.entries.add( srcEntry )
            }
        }
    }
}
这是我的工作:

eclipse {
   classpath {
      file {
        withXml { 
            process(it.asNode())
          }
      }
   }
}
def process(node) {
  if (node.attribute('path') == 'src/test/java' || node.attribute('path') == 'src/test/resources')
    node.attributes().put('output', "build/test-classes")
  else
   node.children().each {
      process(it)
}}

为什么不简单地做正确(更简单)的事情,将生产类与测试类分开呢?gradle背后的部分思想是,构建工具不应该规定这样的决策,而应该允许灵活性。我了解gradle,我认为这应该是可能的。但是为什么你要让你的生活变得比需要的更艰难呢?我想不出有什么好的理由不把测试类和生产类分开。“Gradle欢迎意外”——Gradle和Gradleware的创始人Hans Dockter。为了直接回答你的问题,我目前正在评估Gradle,我想遇到一些“意想不到”的事情,这样我就可以测试Hans的说法是否属实。我喜欢灵活的构建工具的想法。是Gradle吗?您应该能够修改
main
test
源集:设置它们的源目录,排除*test.java作为主源集,并包括*test.java作为测试源集。看,这似乎可以做到这一点,但它似乎也破坏了Eclipse插件。现在,如果我运行eclipse任务,它会在源代码中放置“some/path”两次。我能够通过eclipse.classpath.file上的“whenMerged”函数解决这个问题。这有点整洁,但也许有一种更干净的方法可以做到这一点?生成的Eclipse设置正确地反映了Gradle设置。它会引起任何问题吗?是的,它会引起阅读方面的问题;“生成路径包含重复的条目:'src'用于项目“””我看到了导致问题的类路径条目,并且从逻辑上看,它不应该是问题。但eclipse仍然无法处理它。我将在下面的答案中提出我的解决方法。