由 protobuf 生成的代码引起的 Eclipse 构建循环(与 Maven Project Builder 相关)

开发环境

我正在开发一个Maven Java客户端/服务器项目,该项目依赖于协议缓冲区(protobuf)在客户端和服务器之间发送RPC。我使用 Eclipse for Java EE 作为我的主要 IDE。由于我在我的项目中使用Maven,所以我正在使用Eclipse的m2eclipse插件。我在Eclipse中将我的项目配置为使用“Maven Nature”。

问题

基本上,使用上面描述的工作区设置,如果将Eclipse配置为“自动构建”(这是默认设置:项目菜单-->自动构建),我将遇到INFINITE BUILD LOOPS。每当 Eclipse 剥离构建时,构建版本将进入无限循环,这通常会导致 Eclipse 消耗我计算机的所有 CPU 资源,并且由于内存溢出,最终 IDE 中会出现一个错误弹出窗口。正在发生的事情是,从文件中生成的所有Java代码都是由Maven通过Eclipse构建的。一旦生成原型文件并将其编译到一个目录(在我的情况下,),原型文件的构建就会立即重复。即使我点击停止按钮,构建也会再次旋转。我真正停止无限构建循环的唯一方法是禁用“自动构建”。.prototarget/generated-sources

通过查看 Web 上的链接(请参阅此 SOF 文章,也在下面列出),一种解决方法是在我的 Eclipse 项目上禁用 Maven Project Builder。为此,我必须打开 Eclipse 项目设置 --> Builders -- >取消选择 Maven Project Builder。现在,无限构建循环不会发生,似乎是因为m2eclipse的构建者是罪魁祸首。但是,我现在从这个构建器中失去了许多有用的功能。也就是说,我无法通过m2eclipse利用自动资源处理,例如资源过滤。请注意,使用 Maven Nature 的项目在 Java 构建路径上排除了资源目录 ( 和 ),因为期望 Maven 项目生成器将它们添加到类路径中。因此,我在禁用 Maven Project Builder 时遇到的一个问题是,我无法在测试中从类路径中读取资源文件。我必须首先运行手动maven构建才能访问资源(但是一旦我刷新项目,我将无法再找到这些类路径资源)。或者,我可以更改项目的 Java Build Path,但这违背了 Maven Nature 的默认值,除了依赖于 protobuf 的项目之外,其他所有 Eclipse Java 项目都适用于我。src/main/resourcessrc/test/resources

所以,这一切都说...

有没有人知道我该如何解决这个问题?Eclipse平台似乎太成熟了,以至于这个问题继续存在。我总是可以提交一个会收集灰尘的Eclipse错误,但也许它不是Eclipse错误,而是我这边的错误配置。非常感谢您的帮助。

相关链接


答案 1

在更仔细地阅读了随附的GitHub问题之后,似乎在protobuf-maven-plugin中设置配置确实做到了这一点。以下是使用插件的示例XML(版本无关紧要):cleanOutputFolder

<plugin>
    <groupId>com.github.igor-petruk.protobuf</groupId>
    <artifactId>protobuf-maven-plugin</artifactId>
    <version>0.6.3</version>
    <configuration>
        <cleanOutputFolder>false</cleanOutputFolder>
    </configuration>
</plugin>

这意味着 Eclipse 不会遇到无限的构建循环,因为 Maven Project Builder 不必继续重新编译相同的 protobuf 生成的文件夹,该文件夹位于 。同时,未启用并不能完全禁止项目拾取原型文件输出并根据这些文件生成新源;只要以干净目标(例如 )运行 Maven 构建命令,则仍会重新生成该目录,因为该目录已被删除。/target/generated-sourcescleanOutputFoldermvn clean installgenerated-sourcestarget


答案 2

当为 Java 配置了不同的 Java 版本和生成的代码时,也可能导致此问题。

例如,对于使用Xtend的代码生成,我将JDK从6更新为8,但是.setting和.preferences中的一些文件仍然引用了旧的Java 6兼容性。这导致了 Eclipse 中的循环编译。


推荐