使Gradle不将源集目录用作Eclipse源文件夹

使Gradle不将源集目录用作Eclipse源文件夹,eclipse,gradle,Eclipse,Gradle,我的构建中有一个额外的java源代码集,名为gen——就像生成的源代码中有很多编译器警告一样。gradleeclipse任务将此集合的源目录配置为eclipse源文件夹,这会导致许多我不想看到的警告。另一个原因是,生成的源代码不应该被更改——我不希望有人意外地编辑它,认为它是一个常规代码 以下方法有效,但仅当使用gradleeclipse覆盖现有配置时有效 eclipse.classpath.file { whenMerged { classpath -> clas

我的构建中有一个额外的java源代码集,名为
gen
——就像生成的源代码中有很多编译器警告一样。
gradleeclipse
任务将此集合的源目录配置为eclipse源文件夹,这会导致许多我不想看到的警告。另一个原因是,生成的源代码不应该被更改——我不希望有人意外地编辑它,认为它是一个常规代码

以下方法有效,但仅当使用
gradleeclipse
覆盖现有配置时有效

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.removeAll { 
            entry -> entry.kind == 'src' && entry.path == 'src/gen/java'
        }
    }
}
但是,如果配置被清理-
gradle-cleanclipse-eclipse
,则它不起作用,这是您第一次在eclipse中导入项目时发生的情况

阅读本文,我认为唯一的其他方法是使用
eclipse.classpath.file.withXml
,但它太乱了,无法编辑原始xml


还有其他更优雅的解决方案吗?

我通过将“gen”目录添加到主java源集中解决了类似的问题

如下

configurations {
 jaxb
}

dependencies {
  jaxb 'com.sun.xml.bind:jaxb-xjc:'
}

sourceSets.main.java.srcDirs 'gen'

task createGenDirs() {
  file("gen").mkdirs()
}

task jaxb << {
  dependsOn createGenDirs

  //generate src into gen directory

}

task cleanGeneratedCode(type: Delete) {
  delete file("gen")

clean.dependsOn cleanGeneratedCode
配置{
jaxb
}
依赖关系{
jaxb'com.sun.xml.bind:jaxbxjc:'
}
sourceset.main.java.srcDirs'gen'
任务createGenDirs(){
文件(“gen”).mkdirs()
}

task jaxb我是如何做到这一点的(在我的例子中,源文件夹被合并,只有包不同):


如果Eclipse不知道其他代码正在使用的生成源代码,那么您可能会在Eclipse中遇到编译器错误

但如果gradle使用某个源目录创建第二个jar,或者类似的东西。如果您将这些内容作为一个单独的源代码集,那么您可以将其从eclipse中排除:

sourceSets {
    main {
        java { srcDir 'src' }
    }
    gen {
        java { srcDir 'src-gen' }
    }
}
eclipse {
    classpath {
        sourceSets -= [sourceSets.gen]
    }
}
我的项目文件引用另一个项目的源代码的情况略有不同,因此我不希望在Eclipse中显示任何代码:

sourceSets.main.java { srcDir '../other_project/src' }
eclipse {
    classpath {
        // remove the source set from the Eclipse classpath
        sourceSets -= [sourceSets.main]
    }
    // Don't let the src dir show up as a linked folder either
    project {
        file {
            withXml {
                def res = it.asNode().get('linkedResources')[0]
                res.link.findAll{ it.name[0].text() == 'src' }.each{     
                    res.remove(it) }
            }
        }
    }
}
sourceSets.main.java { srcDir '../other_project/src' }
eclipse {
    classpath {
        // remove the source set from the Eclipse classpath
        sourceSets -= [sourceSets.main]
    }
    // Don't let the src dir show up as a linked folder either
    project {
        file {
            withXml {
                def res = it.asNode().get('linkedResources')[0]
                res.link.findAll{ it.name[0].text() == 'src' }.each{     
                    res.remove(it) }
            }
        }
    }
}