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

时间:2012-05-15 14:36:40

标签: eclipse gradle

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

以下情况有效,但仅限于使用gradle eclipse覆盖现有配置时。

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.removeAll { 
            entry -> entry.kind == 'src' && entry.path == 'src/gen/java'
        }
    }
}

但是,如果清除配置它不起作用 - gradle cleanEclipse eclipse,这是您在eclipse中首次导入项目时会发生的情况。

阅读EclipseClasspath object documentation,我认为唯一的另一种方法是使用eclipse.classpath.file.withXml,但它的编辑太乱了,无法编辑原始xml。

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

3 个答案:

答案 0 :(得分:0)

我通过将'gen'目录添加到主java sourceSet来解决了类似的情况。

如下

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

希望这会有所帮助

答案 1 :(得分:0)

以下是我如何实现这一点(在我的情况下,源文件夹已合并,只有包不同):

apply plugin: 'java'
sourceSets {
    main {
        java {
            srcDir 'src/main/java'
            exclude 'com/foo/generated/**'
        }
    }
    // This sourceset is ignored by Eclipse
    gen {
        java {
            srcDir 'src/main/java'
            include 'com/foo/generated/**'
        }
    }
}
// Include in a real build from Gradle rather than Eclipse
compileJava {
    source sourceSets.gen.java
}

答案 2 :(得分:0)

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

但也许如果有一个源目录,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) }
            }
        }
    }
}