55

我正在使用 Google Protocol Buffers 为我的项目生成一些 Java 类。使用 Maven 2 及其“antrun”插件,这些类在编译前新生成,输出到目标/生成源并在构建期间放置在类路径中。所以从 POM 构建项目是没有问题的。

但是,Eclipse 不知道如何解析生成的类,因为它所在的文件夹在开发过程中似乎不在 IDE 的类路径中。我正在使用 m2eclipse 并让它为我管理依赖项,所以我希望 Maven 会处理这个问题。

如何获得生成代码的 IDE 支持(代码完成等)?

4

10 回答 10

33

m2eclipse 支持这一点。首先,将路径添加到构建路径:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${project.build.directory}/generated-sources/java/</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

其次,添加对 m2e 的支持:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.eclipse.m2e</groupId>
            <artifactId>lifecycle-mapping</artifactId>
            <version>1.0.0</version>
            <configuration>
                <lifecycleMappingMetadata>
                      <pluginExecutions>
                        <pluginExecution>
                          <pluginExecutionFilter>
                            <groupId>org.codehaus.mojo</groupId>
                            <artifactId>build-helper-maven-plugin</artifactId>
                            <versionRange>[1.0,)</versionRange>
                            <goals>
                              <goal>parse-version</goal>
                              <goal>add-source</goal>
                              <goal>maven-version</goal>
                              <goal>add-resource</goal>
                              <goal>add-test-resource</goal>
                              <goal>add-test-source</goal>
                            </goals>
                          </pluginExecutionFilter>
                          <action>
                            <execute>
                              <runOnConfiguration>true</runOnConfiguration>
                              <runOnIncremental>true</runOnIncremental>
                            </execute>
                          </action>
                        </pluginExecution>
                    </pluginExecutions>
                </lifecycleMappingMetadata>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>

如果您的 Eclipse 安装已安装“org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml”插件,则可能不需要第二步。该插件可通过 Window -> Preferences -> Maven -> Discovery 获得。目前,这在 Eclipse Kepler 中不起作用,因此,我获取了 JAR(从目录 URL中显示的 xml 链接)并手动提取了片段org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml

于 2013-11-27T18:00:06.063 回答
26

m2eclipse 不支持这个。您必须手动将该文件夹添加target/generated-sources为源文件夹。当您告诉 m2eclipse “更新项目配置”时,这将被覆盖,您必须恢复它。

此外,请确保 Eclipse 在工作区中查找更改。

不过,可能会有一些问题。最终,您会遇到某些类无法编译的错误,因为某些其他类无法解析。不过,代码完成将起作用。这个问题的根本原因是当 Maven 更改target.

要解决这个问题,您必须告诉 Eclipse编译到与 Maven 不同的位置

于 2009-07-28T08:36:41.337 回答
13

您应该在项目浏览器中看到一个名为“Maven Dependencies”的容器,而不是通常的“引用库”。这意味着 m2eclipse 正在管理您的构建路径。

就我而言,为了实现这一点,我在项目->属性的“Maven”部分选中了“包含模块”并取消选中“处理资源时跳过 Maven 编译器插件”。

于 2009-07-28T08:21:20.357 回答
12

就个人而言,我通过将生成的类设置为单独的项目并使其成为我的主(非生成)项目中的依赖项来解决这个问题。我使用 wsdl2java 来生成 web 服务类,所以我的子项目中的“源”是 wdsl 和 xsds。即使 wsdl 定期更改也能正常工作。

于 2009-07-29T08:36:31.043 回答
9

我在使用 Maven 和 wsdl2java 生成的代码时遇到了这个问题,这是我在 Eclipse Juno 中为解决它所做的。假设我的项目名为 project1:

  1. 右键单击 project1 并选择属性
  2. 从左侧选择 Java Build Path 并选择 Libraries 选项卡
  3. 单击添加类文件夹
  4. 选择bin目录,点击OK(project1/target/generated-sources/bin)
  5. 单击确定并刷新项目

作为额外的奖励,您还可以附加源代码:

  1. 单击刚刚创建的新类文件夹旁边的箭头
  2. 点击源附件
  3. 单击编辑按钮
  4. 将路径设置为 /project1/target/generated-sources/axis2/src
  5. 点击确定
于 2013-02-13T17:18:26.627 回答
4
  1. 右键单击项目并选择属性
  2. 从左侧选择 Java Build Path 并选择 Source 选项卡
  3. 单击添加文件夹
  4. 选择bin目录,点击确定
  5. (project/target/generated-sources/xxxx) 点击确定并刷新项目
于 2016-05-30T21:40:35.530 回答
4

如何获得生成代码的 IDE 支持(代码完成等)?

通常,我会将 m2e 生命周期映射插件添加到 pom.xml 文件中,如@koppor 的回答中所述。但是,将 per-eclipse 代码添加到我的 pom.xml 文件中并不是一个工作选项,这主要是 IntelliJ 商店。

我的解决方案首先将其添加build-helper-maven-plugin到 pom.xml 中,它在命令行中可以正常工作,但在 eclipse 中却不行。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${project.build.directory}/generated-sources/</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

为了修复 Eclipse,我从 Eclipse Marketplace安装了Apt M2E 连接器。我认为在我重新启动然后重建我所有的项目后,事情就开始了。我现在在我的源目录中看到以下内容:

src/main/java
target/generated-sources
...

特征!

于 2018-05-08T18:27:04.467 回答
2

您是否尝试刷新 Eclipse 项目?

替代文字
(来源:oyvindhauge.com

当外部工具生成新文件或更新旧文件时,Eclipse 将无法检测到更改,直到下一个请求。

另一种选择是定义一个新的自定义构建器,指定该构建器“完成后刷新资源”:

替代文字 http://www.cs.lth.se/EDA180/2005/Verktyg/eclipse_refresh.gif

于 2009-07-28T08:21:03.303 回答
1

为我工作(但你每次都必须遵循这个,所以你可以在 pom.xml 中添加这个路径)

  • 右键单击您的项目>构建路径>配置构建路径
  • 在源标签中,单击 [添加文件夹] 按钮
  • 检查目标/生成的源/注释

在此处输入图像描述

于 2022-02-16T08:59:29.857 回答
0

要从文件生成 Java 源文件,请.proto使用Protocol Buffers Plugin,它在 eclipse Oxygen 中开箱即用。

基本用法(详细说明见这里):

  • 确保在您的系统上安装protoc了本机编译器

  • 更新您的pom.xml文件:

    • 确保您至少使用 Java 6(推荐使用 Java 7+)

    • 添加插件调用

    • 添加对应的依赖com.google.protobuf:protobuf-java

  • 将您的 .proto 文件放在项目src/main/proto目录中

  • 更新项目(通过Maven -> Update project...

示例pom.xml

<project>
  ...
  <build>
    <plugins>
      <!-- Require at least Java 6 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
      <!-- Generate .java files from .proto definitions -->
      <plugin>
        <groupId>org.xolstice.maven.plugins</groupId>
        <artifactId>protobuf-maven-plugin</artifactId>
        <version>0.5.1</version>
        <configuration>
          <protocExecutable>/usr/local/bin/protoc</protocExecutable>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>test-compile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>3.5.1</version>
    </dependency>
    ...
  </dependencies>
  ...
</project>

一些附加说明:

  • 如果protoc可执行文件在 PATH 中,protocExecutable则可以省略配置条目

  • 仅测试的 protobuf 消息定义可以放入项目src/test/proto目录

  • 我建议安装Protocol Buffer Descriptor Editor市场链接

祝你好运!

于 2018-05-16T14:40:53.477 回答