如何让Eclipse解决用Maven 2生成的类?

我正在使用Google协议缓冲区为我的项目生成一些Java类。 使用Maven 2及其“antrun”插件,这些类是在编译之前新生成的,输出到target / generated-sources并在构build期间放在classpath中。 所以从POM构build项目是没有问题的。

但是,Eclipse不知道如何parsing生成的类,因为它在开发过程中似乎不在IDE的类path中。 我正在使用m2eclipse,并为它pipe理依赖关系,所以我期望Maven能够处理这个问题。

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

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

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

可能有一些问题,但。 最终,你会遇到一些错误,一些类不能被编译,因为其他一些类无法parsing。 代码完成将工作,虽然。 这个问题的根本原因是,当Maven在target改变类文件时,Eclipse会感到困惑。

为了解决这个问题,你必须让Eclipse 编译到与Maven不同的地方 。

m2eclipse支持这个。 首先,将path添加到您的构buildpath:

 <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”插件,则第二步可能不是必需的。 这个插件可以通过窗口 – >首选项 – > Maven – >发现。 目前,这在Eclipse Kepler中不起作用,因此,我提取了JAR(从Catalog URL中显示的xml链接),并且手动提取了org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml中的片段。

你应该在你的项目浏览器中看到的是一个名为“Maven Dependencies”的容器来代替通常的“引用库”。 这意味着m2eclipse正在pipe理你的构buildpath。

在我的情况下,为了达到这个目的,我选中了“Include Modules”,并在Project-> Properties的“Maven”部分取消选中“在处理资源时跳过Maven编译器插件”。

就我个人而言,我通过将生成的类设置为一个独立的项目解决了这个问题,并使其成为我的主(非生成)项目的依赖项。 我使用wsdl2java生成webservice类,所以我的子项目中的“源”是wdsl和xsds。 即使wsdl定期更换,也能很好地工作。

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

  1. 用鼠标右键单击project1并select属性
  2. 从左边selectJava Build Path,然后selectLibraries选项卡
  3. 单击添加类文件夹
  4. selectbin目录并点击OK(project1 / target / generated-sources / bin)
  5. 单击确定并刷新项目

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

  1. 点击您刚创build的新课程文件夹旁边的箭头
  2. 点击源附件
  3. 点击编辑button
  4. 将path设置为/ project1 / target / generated-sources / axis2 / src
  5. 点击OK

你有没有尝试刷新Eclipse项目?

替代文字blog/wp-content/eclipse_refresh.png

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

另一个select是定义一个新的自定义构build器,指定该构build器“完成时刷新资源”:

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

  1. 右键单击项目,然后select“属性”
  2. 从左边selectJava Build Path,然后selectSource选项卡
  3. 点击添加文件夹
  4. selectbin目录并单击确定
  5. (project / target / generated-sources / xxxx)点击OK并刷新项目