【问题标题】:Eclipse build loop caused by protobuf generated code (related to Maven Project Builder)protobuf 生成代码导致的 Eclipse 构建循环(与 Maven Project Builder 相关)
【发布时间】:2014-06-17 10:17:47
【问题描述】:

开发环境

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

问题

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

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

所以,说了这么多……

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

相关链接

【问题讨论】:

  • 您链接到的 maven-protobuf-plugin 问题包括一个潜在的解决方法(“将 cleanOutputFolder 设置为 false”);你试过吗?
  • 哎呀,我把它误认为是 Eclipse 选项,而不是 protobuf-maven-plugin 配置。它确实解决了问题。

标签: java eclipse maven protocol-buffers m2eclipse


【解决方案1】:

在仔细阅读了附件 GitHub Issue 之后,似乎在 protobuf-maven-plugin 中设置 cleanOutputFolder 配置可以解决问题。这是使用插件的示例 XML(版本无关):

<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 项目构建器不必继续重新编译相同的 protobuf 生成文件夹,该文件夹位于 /target/generated-sources 中。同时,不启用cleanOutputFolder 并不能完全禁止项目获取原始文件输出并基于这些文件生成新源;只要使用 clean 目标(例如 mvn clean install)运行 Maven 构建命令,那么 generated-sources 目录仍将重新生成,因为 target 目录已被删除。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 2010-12-09
      • 1970-01-01
      • 2012-02-13
      相关资源
      最近更新 更多