有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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/resourcessrc/test/resources),因为Maven项目生成器希望将它们添加到类路径中。因此,我在禁用Maven Project Builder时遇到的一个问题是,我无法在测试中从类路径读取资源文件。我必须首先运行一个手动maven构建来访问资源(但是一旦我刷新了项目,我将无法再找到这些类路径资源)。或者,我可以更改项目的Java构建路径,但这与Maven Nature的默认设置背道而驰,除了依赖protobuf的项目外,Maven Nature的默认设置在所有Eclipse Java项目中都适用

所以,尽管如此

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

相关链接


共 (2) 个答案

  1. # 1 楼答案

    当为Java和生成的代码配置了不同的Java版本时,也会出现这种情况

    例如,对于使用Xtend生成代码,我将JDK从6更新为8,但其中一些文件没有更新。设置和。首选项仍然是指旧的Java 6兼容性。这导致了Eclipse中的循环编译

  2. # 2 楼答案

    在更仔细地阅读了附带的GitHub Issue之后,在protobuf maven插件中设置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并不能完全禁止项目获取原始文件输出并基于这些文件生成新源;只要Maven build命令以clean目标(例如mvn clean install)运行,那么generated-sources目录仍然会重新生成,因为target目录已经被删除