如何将Gradle生成的源代码文件夹添加到Eclipse项目中?

10
我的gradle项目会使用注解处理器在gen/main/java目录下生成一些Java代码。当我将这个项目导入Eclipse时,Eclipse不会自动将gen/main/java目录添加到构建路径中。我可以手动添加,但是否有一种自动化的方法呢?
谢谢。

你有更详细的例子吗?我能想到两个可能的原因为什么源文件夹没有被添加。1)源文件夹不是Gradle模型中您的源文件夹的一部分...或者2)当项目被导入时,该文件夹尚不存在。无论您处于情况“1”还是“2”,都可能需要不同的解决方案。因此,如果您可以确定哪一个,那将有所帮助。尝试的一种方法是在导入之前确保创建文件夹(即使它是空的)。如果现在正在添加文件夹,则必须是第二个原因。 - Kris
3个回答

13

您可以通过手动将生成的文件夹添加到类路径中来轻松实现:

eclipse {
    classpath {
        file.whenMerged { cp ->
            cp.entries.add( new org.gradle.plugins.ide.eclipse.model.SourceFolder('gen/main/java', null) )
        }
    }
}

在第二个构造函数参数为null的情况下,Eclipse将把编译后的“class”文件放置在默认的输出文件夹中。如果你想改变这种行为,只需提供一个String,例如'bin-gen'。


3
你应该在 beforeMerged 中完成这个操作,否则重新运行 gradle eclipse 将会添加一个_第二个_类路径条目(Eclipse 会对此发出警告)。 - Alice Purcell

3
我认为将第二个源目录添加到主源集中会更加清晰。
请将以下内容添加到您的build.gradle文件中:
sourceSets {
    main {
        java {
            srcDirs += ["src/gen/java"]
        }
    }
}

这将导致在您的.classpath中生成以下行:
<classpathentry kind="src" path="src/gen/java"/>

我已在Gradle 4.1上进行了测试,但我认为它也可以在旧版本上运行。


这在IntelliJ环境中给我造成了一个构建错误,不得不将其删除。 - wonsuc

0

如果您使用gradle cleanEclipse eclipse命令从命令行生成Eclipse项目,则Andreas的答案有效。如果您使用STS Eclipse Gradle插件,则必须实现afterEclipseImport任务。以下是我的完整工作代码片段:

project.ext {
  genSrcDir = projectDir.absolutePath + '/gen/main/java'
}
compileJava {
  options.compilerArgs += ['-s', project.genSrcDir]
}
compileJava.doFirst {
  task createGenDir << {
    ant.mkdir(dir: project.genSrcDir)
  }
  createGenDir.execute()
  println 'createGenDir DONE'
}
eclipse.classpath.file.whenMerged {
  classpath - >
    def genSrc = new org.gradle.plugins.ide.eclipse.model.SourceFolder('gen/main/java', null)
  classpath.entries.add(genSrc)
}
task afterEclipseImport(description: "Post processing after project generation", group: "IDE") {
  doLast {
    compileJava.execute()
    def classpath = new XmlParser().parse(file(".classpath"))
    new Node(classpath, "classpathentry", [kind: 'src', path: 'gen/main/java']);
    def writer = new FileWriter(file(".classpath"))
    def printer = new XmlNodePrinter(new PrintWriter(writer))
    printer.setPreserveWhitespace(true)
    printer.print(classpath)
  }
}

enter image description here


啊,好的,我明白了,但是我没有使用STS Eclipse Gradle插件,因为我认为它有点不稳定。 - Andreas Schmid
如何将Gradle生成的源文件夹添加到IntelliJ IDEA的编译路径中源链接:http://blog.tamalsaha.com/post/102154319104/how-to-add-gradle-generated-source-folder-to - Nico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接