当前位置: 首页 > 面试题库 >

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

赵驰
2023-03-14
问题内容

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

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

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

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

相关链接


问题答案:

在更仔细地阅读了附件的GitHub Issue之后,看来cleanOutputFolderprotobuf-maven-plugin中设置配置可以解决问题。这是使用插件的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目录已被删除,因此仍将重新生成目录。



 类似资料:
  • 问题内容: 这是我要构建的工作流程 使用脚本编译我的原型文件,将生成的src放在指定目录中 链接到Eclipse中生成的类 编译我的项目 我可以很容易地使用Eclipse CDT针对C ++做到这一点:在我的项目中,选择File-> New-> Other,然后在General下选择File。然后,我单击“高级”,然后选择指向系统文件的链接。 不过,我还没有发现如何针对Java执行此操作。一旦回答

  • 所以当'r'参数为整数5(预期输出)时,我想打印出这样的内容: 这是我目前的代码: 相反,我得到了以下输出: 我知道我不能在"System.out.println(i""j);"行之后添加"break;"。我应该在我当前的代码中修改什么来产生预期的输出?谢谢!

  • 由6.1.2节的simple.jsp文件生成的simple_jsp.java的源代码如下: package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; // 由<%@page import... %>引用的Java类或包将被作为import语句插入

  • 我有几个。具有proto2语法的proto文件。我试图使用protoc编译器自动生成C#类,但我得到了一个错误:“C#代码生成只支持proto3语法。 而不是手动更新每个。proto文件要符合proto3语法,是否有其他方法可以自动生成C#类?我对protobuf完全陌生,所以我知道这听起来像是一个奇怪的问题,因为编译器明确指出我必须遵循proto3语法-我只是想知道是否有办法让C类使用proto

  • 问题内容: 我正在尝试在某些类图中围绕类生成运行时包装,但是当图中有一个循环时,我不知道如何处理这种情况。想象有一个类A的字段类型为B,但是类型B的字段类型为A。我想生成类A’和B’,以便类A’的字段类型为B’,而B’的字段类型为B。 A’类型的字段。在字节伙伴中,方法“ defineField”可以接收类型定义的参数。我认为必须有一种方法可以为尚未定义的类型定义TypeDefinition,但我