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

时间:2014-04-30 22:31:42

标签: java eclipse maven protocol-buffers m2eclipse

开发环境

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

问题

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

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

所以,所有人都说......

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

相关链接

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

当为Java和生成的代码配置不同的Java版本时,也会导致这种情况。

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