M2Eclipse Plugin Execution Not Covered
M2Eclipse 0.12和早期版本会执行eclipse中Maven创建生命周期的部分周期,而且会基于MavenProject的执行后状态重新配置Eclipse项目。这些过程由goals控制,而这些goals有些配置在workspace级别,有些在project/.settings中。
问题是这种方式并不是对所有的项目都有效,因此我们不得不需要刷新或更新依赖关系,更新配置和重新创建,使项目达到一个良好的状态。而导致这些问题的原因主要有两个:
1. Maven插件创建了一些不在工作空间(workspace)的资源,有些情况下项目没问题,有些情况下则会认为是资源缺失;
2. Maven插件导致的JVM和OS的资源泄露也可能导致这些问题。
生命周期映射
为了解决这个问题,从M2Eclipse 1.0开始,使用了一个叫项目创建生命周期映射(project build lifecycle mapping)或生命周期映射(lifecyclemapping)的指令配置来定义如何映射pom.xml中的信息与Eclipse工作空间创建(workspace build)对应的行为。
项目创建生命周期映射可以配置在项目的pom.xml文件中、或者由Eclipse插件提供、或默认使用m2e提供的Maven插件。生命周期映射来源我们称之为生命周期映射元数据源(lifecycle mapping metadata sources)。如果在这些生命周期映射元数据源中没有找到对应的生命周期映射,m2e就会创建一个类似下面的错误标记(error marker):
针对插件执行,m2e提供了三种基本的行为: ignore, execute或委托给项目配置程序(configurator)。这三个行为选项对应生命周期映射表中的mapping列。
委托给项目配置程序(configurator)
配置程序映射告诉m2e如何把用于匹配插件执行的工作空间项目配置映射工作委托给AbstractProjectConfigurator的实现(使用projectConfigurators扩展点注册)来完成。大多数情况下,都是m2e的扩展(extension)开发人员使用这种行为。
Ignore
这个选项将告诉m2e忽略这个插件执行。
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>some-group-id</groupId>
<artifactId>some-artifact-id</artifactId>
<versionRange>[1.0.0,)</versionRange>
<goals>
<goal>some-goal</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore/>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
另外,M2e还提供了一个简单快速的办法来解决plugin execution not covered问题:
- 使用<pluginManagement/>包围plugins
Execute
这个选项告诉m2e这个行为将作为Eclipse工作空间全创建或增量创建的一部分而执行。
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>some-group-id</groupId>
<artifactId>some-artifact-id</artifactId>
<versionRange>[1.0.0,)</versionRange>
<goals>
<goal>some-goal</goal>
</goals>
</pluginExecutionFilter>
<action>
<execute>
<runOnIncremental>false</runOnIncremental>
</execute>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
快速解决办法是创建ignore映射,然后用<execute/>替换<ignore/>,M2e 1.3和高版本默认设置runOnIncremental为false。
元数据源(metadata sources)查找顺序
1. 项目的 pom.xml
2. 父项目的 pom.xml
, 祖父项目的 pom.xml
等等.
3. M2Eclipse 1.2+ workspacepreferences
4. Installed M2Eclipse extensions(没有特定顺序)
5. Maven插件提供的M2Eclipse1.1+ lifecycle mapping metadata
6. M2Eclipse自带的默认lifecyclemapping metadata
M2Eclipse使用找到的第一个可用映射。
Maven插件提供的生命周期映射元数据
从m2e 1.1开始,maven插件开发者可以在插件中提供生命周期元数据源。
这个进步减少了我们很多需要在pom.xml中针对插件的配置。
M2Eclipse 1.2+ workspace preferences
从M2Eclipse 1.2开始,可以在工作空间偏好选项中配置生命周期映射元数据,工作空间级别的插件目标可以使用quick-fix直接忽略掉。然后通过Preferences->Maven->LifecycleMappings可以查看.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。