我正在使用Google协议缓冲区为我的项目生成一些Java类。使用Maven 2及其“ antrun”插件,这些类在编译之前重新生成,输出到目标/生成源,并在构建过程中放在类路径中。因此,从POM构建项目是没有问题的。
但是,Eclipse不知道如何解析生成的类,因为在开发过程中,它所在的文件夹似乎不在IDE的类路径上。我正在使用m2eclipse并让它为我管理依赖项,因此我期望Maven能够解决这一问题。
如何获得生成代码的IDE支持(代码完成等)?
在项目浏览器中应该看到的是一个名为“ Maven Dependencies”的容器,代替了通常的“参考库”。这意味着m2eclipse正在管理您的构建路径。
就我而言,要实现此目的,我在“项目”->“属性”的“ Maven”部分中选中了“包括模块”,而未选中“在处理资源时跳过Maven编译器插件”。
m2eclipse不支持此功能。您必须手动将文件夹添加target/generated-sources为源文件夹。当您告诉m2eclipse“更新项目配置”时,此内容将被覆盖,您必须将其还原。
另外,请确保Eclipse在工作空间中查找更改。
不过可能会有一些问题。最终,您将遇到无法编译某些类的错误,因为某些其他类无法解析。但是,代码完成将起作用。此问题的根本原因是,当Maven更改中的类文件时,Eclipse会感到困惑target。
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”插件,则可能无需执行第二步。可通过窗口->首选项-> Maven->发现使用此插件。当前,这在Eclipse Kepler上不起作用,因此,我获取了JAR(从Catalog URL中显示的xml链接到)并org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml手工提取了片段。