protobuf生成的代码导致的java Eclipse构建循环(与Maven Project Builder相关)
开发环境
我正在从事一个Maven Java客户机/服务器项目,该项目依赖于Protocol Buffers(protobuf)在客户机和服务器之间发送RPC。我使用eclipseforjavaee作为我的主要IDE。由于我在项目中使用Maven,因此我正在使用Eclipse的m2eclipse插件。我在Eclipse中配置我的项目以使用“Maven Nature”
问题
基本上,在上面描述的工作区设置中,如果Eclipse被配置为自动构建(这是默认的:项目菜单-->;自动构建),我会遇到无限构建循环。每当Eclipse派生出一个构建时,该构建就会进入一个无限循环,这通常会导致我的计算机的所有CPU资源都被Eclipse占用,最终由于内存溢出,IDE中会出现一个错误弹出窗口。正在发生的事情是,Maven通过Eclipse构建不断地构建从.proto
文件生成的所有Java代码。一旦生成了proto文件并将其编译到一个目录中(在我的例子中是target/generated-sources
),就会立即重复构建proto文件。即使我点击停止按钮,构建也会再次启动。我能真正停止无限构建循环的唯一方法是自动禁用构建
通过查看web上的链接(参见下面列出的SOF post),一个解决方法是在我的Eclipse项目上禁用Maven Project Builder。为此,我必须打开Eclipse项目设置-->;建筑商-->;取消选择Maven项目生成器。现在,无限构建循环不会发生,似乎是因为m2eclipse的构建器才是罪魁祸首。然而,我现在从这个构建器中丢失了很多有用的功能。也就是说,我无法通过m2eclipse利用自动资源处理,例如资源过滤。请注意,使用Maven性质的项目在Java构建路径上排除了资源目录(src/main/resources
和src/test/resources
),因为Maven项目生成器希望将它们添加到类路径中。因此,我在禁用Maven Project Builder时遇到的一个问题是,我无法在测试中从类路径读取资源文件。我必须首先运行一个手动maven构建来访问资源(但是一旦我刷新了项目,我将无法再找到这些类路径资源)。或者,我可以更改项目的Java构建路径,但这与Maven Nature的默认设置背道而驰,除了依赖protobuf的项目外,Maven Nature的默认设置在所有Eclipse Java项目中都适用
所以,尽管如此
有人知道我如何解决这个问题吗?Eclipse平台似乎太成熟了,不能让这个问题继续存在下去。我总是可以提交一个Eclipse bug来收集灰尘,但也许这不是一个Eclipse bug,而是一个不正确的配置。提前非常感谢您的帮助
相关链接
- SOF关于此问题的帖子:Eclipse loops endlessly: Invoking 'Maven Project Builder'
- 为maven protobuf插件打开Github问题:https://github.com/igor-petruk/protobuf-maven-plugin/issues/16
# 1 楼答案
当为Java和生成的代码配置了不同的Java版本时,也会出现这种情况
例如,对于使用Xtend生成代码,我将JDK从6更新为8,但其中一些文件没有更新。设置和。首选项仍然是指旧的Java 6兼容性。这导致了Eclipse中的循环编译
# 2 楼答案
在更仔细地阅读了附带的GitHub Issue之后,在protobuf maven插件中设置
cleanOutputFolder
配置似乎成功了。以下是使用插件的XML示例(版本无关):这意味着Eclipse不会运行到无限构建循环中,因为Maven项目生成器不必继续重新编译相同的protobuf生成的文件夹,该文件夹位于
/target/generated-sources
。同时,没有启用cleanOutputFolder
并不能完全禁止项目获取原始文件输出并基于这些文件生成新源;只要Maven build命令以clean目标(例如mvn clean install
)运行,那么generated-sources
目录仍然会重新生成,因为target
目录已经被删除