【问题标题】:How do I get Eclipse to resolve classes generated with Maven 2?如何让 Eclipse 解析使用 Maven 2 生成的类?
【发布时间】:2010-11-14 14:57:27
【问题描述】:

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

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

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

【问题讨论】:

  • 我在尝试的过程中发布了这个问题和一个(可能的)答案,部分是为了分享我学到的东西,部分是因为虽然我最终确实让它发挥了作用,但我仍然没有真正做到明白为什么。
  • 问题stackoverflow.com/q/7160006/873282 似乎是相关的。答案stackoverflow.com/a/7160614/873282 建议最终将 build-helper-plugin 与 APT M2E 连接器一起使用。目前,它不适用于 M2E 和 Eclipse Kepler。

标签: eclipse maven-2 code-generation protocol-buffers


【解决方案1】:

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(从 Catalog URL 中显示的 xml 链接)并手动从 org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml 中提取了片段。

【讨论】:

  • 通过在 Eclipse Marketplace 中添加 Apt M2E 连接器,然后按照上面的步骤 1 但省略了步骤 2,我能够在 Luna 下完成这项工作。谢谢!
  • 迄今为止最好的答案,不需要烦躁 Eclipse 设置。为了更进一步,我将配置放入由属性 m2e.version 激活的 maven 配置文件中。
  • Hibernate Model Generator 有问题,第 1 步解决了我的问题,我只是将 /java 更改为 /anotations
【解决方案2】:

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

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

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

要解决这个问题,您必须将 Eclipse 告知compile to a different place than Maven

【讨论】:

  • 嗯,很有趣。我有点希望 m2eclipse 只会调整 Eclipse 的进程,并且这一切都可以神奇地工作。 :)
  • 以上链接需要登录,我有这个链接用于相同的搜索docs.sonatype.org/display/M2ECLIPSE/…
  • 我遵循了这一点,但在我的回答中添加了 Eclipse Juno 的具体说明。 +1 链接
【解决方案3】:

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

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

【讨论】:

  • 我现在想知道在我进行这些设置之前 m2eclipse 是否管理过任何依赖项,因为我的依赖项现在看起来非常不同。诡异的。 (几天前我只对这个项目进行了 Maven 化,也许这是问题的一部分)
  • @HannoFietz:我有同样的问题,在 Maven 部分找不到这些选项。新版本有不同的方法吗?
  • @neo - 我不知道,我在 2 年前切换到 IntelliJ。您可能还想检查是否有任何其他答案可以帮助您解决问题。
  • 我想尝试一下,但我在 Eclipse Oxygen 的 Project->Properties>Maven 窗口中看不到这些选项(((有人知道我能做什么吗?
【解决方案4】:

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

【讨论】:

  • 我一直在寻找更好的解决方案来避免这样做,但看起来我别无选择。
  • +1 我想这种方法的一个优点是您在清理主要项目时不会定期自动生成类。在许多情况下,自动生成的类在项目生命周期的大部分时间里都是静态的。
【解决方案5】:

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

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

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

  1. 点击刚刚创建的新类文件夹旁边的箭头
  2. 点击源附件
  3. 点击编辑按钮
  4. 将路径设置为 /project1/target/generated-sources/axis2/src
  5. 点击确定

【讨论】:

  • +1 请注意,每次从命令行运行 Maven 时,您要么必须启用自动刷新,要么必须手动刷新项目。否则,您将在 Eclipse 中遇到非常奇怪的错误。
【解决方案6】:
  1. 右键单击项目并选择属性
  2. 从左侧选择 Java Build Path 并选择 Source 选项卡
  3. 点击添加文件夹
  4. 选择bin目录,点击确定
  5. (project/target/generated-sources/xxxx) 点击确定并刷新项目

【讨论】:

  • 您先生解决了这个问题。其他解决方案均无效。谢谢。
【解决方案7】:

如何获得生成代码的 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 Connector。我认为在我重新启动然后重建我所有的项目后,事情就开始了。我现在在源目录中看到以下内容:

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

功能!

【讨论】:

    【解决方案8】:

    您是否尝试刷新 Eclipse 项目?


    (来源:oyvindhauge.com

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

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

    alt text http://www.cs.lth.se/EDA180/2005/Verktyg/eclipse_refresh.gif

    【讨论】:

    • 是的,我做到了。我也做了项目->清洁。看来,必须调用 Maven“编译”目标(请参阅下面我自己的答案),但我仍然非常不确定 Maven-Eclipse 集成的真正工作原理。
    • 哈哈,经过几次清理和刷新(在 eclipse neon3 上),它对我有用。谢谢! +1
    【解决方案9】:

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

    • 右键单击您的项目>构建路径>配置构建路径
    • 在sources标签中,点击[Add Folder]按钮
    • 检查目标/生成源/注释

    【讨论】:

      【解决方案10】:

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

      基本用法(see here for detailed description):

      • 确保本机 protoc 编译器是 installed on your system

      • 更新您的pom.xml 文件:

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

        • 添加插件调用

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

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

      • 更新项目(通过Maven -&gt; 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>
      

      一些补充说明:

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多