生命周期配置未涵盖插件执行(JBossas 7 EAR 原型)
Posted
技术标签:
【中文标题】生命周期配置未涵盖插件执行(JBossas 7 EAR 原型)【英文标题】:Plugin execution not covered by lifecycle configuration (JBossas 7 EAR archetype) 【发布时间】:2012-02-26 21:22:06 【问题描述】:我正在使用带有 Maven M2E 插件 1.0.100 的 Eclipse 3.7 Indigo。
使用 JBoss 7.x JavaEE 6 EAR 原型,EAR 的 pom 给了我这个错误:
生命周期配置未涵盖插件执行: org.apache.maven.plugins:maven-ear-plugin:2.6:generate-application-xml (执行:default-generate-application-xml,阶段: 生成资源)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- Tell Maven we are using Java EE 6 -->
<version>6</version>
<!-- Use Java EE ear libraries as needed. Java EE ear libraries
are in easy way to package any libraries needed in the ear, and automatically
have any modules (EJB-JARs and WARs) use them -->
<defaultLibBundleDir>lib</defaultLibBundleDir>
<modules></modules>
</configuration>
<plugin>
【问题讨论】:
【参考方案1】:这是前段时间推出的 M2E 插件的“功能”。它与 JBoss EAR 插件没有直接关系,但也发生在大多数其他 Maven 插件中。
如果您在 pom
中定义了插件执行(如 maven-ear-plugin:generate-application-xml
的执行),您还需要为 M2E 添加额外的配置信息,告诉 M2E 在 Eclipse 中运行构建时要做什么,例如如果插件执行被 M2E 忽略或执行,是否也应该为增量构建完成,...如果缺少该信息,M2E 通过显示以下错误消息来抱怨它:
“生命周期配置未涵盖插件执行”
查看这里以获得更详细的解释和一些需要添加到 pom 以消除该错误的示例配置:
https://www.eclipse.org/m2e/documentation/m2e-execution-not-covered.html
【讨论】:
@Jan 我不明白这个概念。 M2E 应该对用户透明。做命令行 Maven 所做的事情,但是在 eclipse 中。 pom 配置数据中不应该有告诉 M2E 做什么。如果是这样,那么这是一个糟糕的设计。顺便说一句,这些错误有时会在较新版本的 Eclipse 和 M2E 中消失。 我同意全神贯注。我的 POM 不依赖于 m2e,我现在想添加一个,因为我碰巧使用 Eclipse 作为我的 IDE。这对从事同一项目的其他人来说是一种负担,这些人很可能正在使用另一个 IDE,例如 IntelliJ。如果 m2e 需要这些提示,那么它应该是 Eclipse 中 m2e 配置的一部分。 有些目标在 Eclipse 中没有意义。例如,我有将 ZIP 文件解压缩到target
文件夹的项目。您不希望在保存每个源文件时“增量”地重新完成。或者也许你确实想要那个。真的,m2e 不知道您的具体构建。您可以在 Eclipse、POM 中存储 m2e 应该执行的操作,或者可能安装一个 m2e 连接器,为 m2e 添加更多知识以处理构建步骤。这些是您应该看到的选项。我知道您不想让您的 POM m2e 感知,但这是为您的所有开发人员集中配置它的好地方。
问题在于这个链接的文档,就像 Maven 或 Eclipse 上的大多数文档一样。是abcacadabra。无论他们多么努力地解释清楚,解释都建立在我作为一个相对较新的 Maven 用户不理解也不知道如何查找的太多概念上——我发现的所有东西都有同样的问题:太多无法解释概念。技术太复杂或文档组织太差。无论如何,学习曲线都很高。这里的答案增加了很多清晰度。
@RicardoGladwell 您误解了投票的目的。箭头说“这个答案没有用” - 这个答案是不正确的。因此,即使您不喜欢写此答案的语气,也没有必要投反对票。【参考方案2】:
无论如何为时已晚,但我的解决方案很简单,右键单击 Eclipse 中的错误消息并选择 Quick Fix >> Ignore for each pom with such errors
【讨论】:
现在还为时不晚。我就是这样解决问题的! 我也是。所有这些研究并试图了解问题所在让我很头疼,所以我忽略了它:) 谢谢。 这对我有用。我怀疑它会自动生成@Jan 的回答所描述的指向eclipse.org/m2e/documentation/m2e-execution-not-covered.html 的内容,因为我在接受快速修复后看到的唯一变化是对我的 pom.xml 的更改。 我在另一台机器上再次尝试,当我从 JBehave 3.9.4 升级到 3.9.5 时,问题消失了,因为它是 JBehave 插件,在我的情况下,这导致了错误(我生成了来自 JBehave Maven 原型的插件配置 (jbehave.org/reference/stable/archetypes.html))【参考方案3】:Eclipse 已经有了增量构建的概念。这非常有用,因为它可以节省大量时间。
这有什么用
假设您刚刚更改了一个 .java 文件。增量构建器将能够编译代码而无需重新编译所有内容(这将花费更多时间)。
现在 Maven 插件有什么问题
大多数 maven 插件不是为增量构建而设计的,因此会给 m2e 带来麻烦。 m2e 不知道插件目标是至关重要的还是无关紧要的。如果它只是在单个文件更改时执行每个插件,那将需要很多时间。
这就是 m2e 依赖元数据信息来确定应该如何处理执行的原因。 m2e 提供了不同的选项来提供此元数据信息,优先顺序如下(从高到低)
-
项目的pom.xml文件
父、祖父等 pom.xml 文件
[m2e 1.2+] 工作区首选项
已安装 m2e 扩展程序
[m2e 1.1+] maven 插件提供的生命周期映射元数据
m2e 附带的默认生命周期映射元数据
1,2 是指在您的 pom 文件或其任何父文件的标签中指定 pluginManagement 部分。 M2E读取这个配置来配置项目。下面sn-p指示m2e忽略yuicompressor-maven-plugin的jslint
和compress
目标
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<versionRange>[1.0,)</versionRange>
<goals>
<goal>compress</goal>
<goal>jslint</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
3) 如果您不希望使用此元数据污染您的 pom 文件,您可以将其存储在外部 XML 文件中(选项 3)。下面是一个示例映射文件,它指示 m2e 忽略 yuicompressor-maven-plugin 的 jslint
和 compress
目标
<?xml version="1.0" encoding="UTF-8"?>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<versionRange>[1.0,)</versionRange>
<goals>
<goal>compress</goal>
<goal>jslint</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore/>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
4) 如果您不喜欢这 3 个选项中的任何一个,您可以为 maven 插件使用 m2e 连接器(扩展)。连接器将依次将元数据提供给 m2e。您可以在此link 中查看连接器中元数据信息的示例。您可能已经注意到元数据指的是配置器。这仅仅意味着 m2e 将把责任委托给扩展作者提供的特定 java 类。配置器可以配置项目(比如添加额外的源文件夹等)并决定是否在增量构建期间执行实际的 maven 插件(如果没有在配置器中正确管理,可能会导致无休止的项目构建)
请参阅这些链接以获取配置示例 (link1,link2)。因此,如果插件可以通过外部连接器进行管理,那么您可以安装它。 m2e 维护其他开发人员贡献的此类连接器的列表。这称为发现目录。如果您还没有任何生命周期映射元数据用于通过任何选项 (1-6) 执行,m2e 将提示您安装连接器,并且发现目录有一些可以管理执行的扩展。
下图显示了 m2e 如何提示您为 build-helper-maven-plugin 安装连接器。 。
5)m2e 鼓励插件作者在 maven-plugin 本身内支持增量构建和提供生命周期映射。这意味着用户不必使用任何额外的生命周期映射或连接器。一些插件作者有already implemented this
6) 默认情况下,m2e 包含大多数常用插件(如 maven-compiler-plugin 等)的生命周期映射元数据。
现在回到问题:您可能只为给您带来麻烦的特定目标在 1、2 或 3 中提供忽略生命周期映射。
【讨论】:
【参考方案4】:提醒您可以更好地配置 m2e 的一个很好的解决方法是,将这些错误降级为警告:
窗口 -> 首选项 -> Maven -> 错误/警告 -> 生命周期配置未涵盖插件执行 = 警告
【讨论】:
【参考方案5】:我尝试在清理后立即执行特定的堵塞,即清理后(默认为清理阶段)。这对我来说适用于日食靛蓝。刚刚添加 post-clean 为我解决了这个问题。
<executions>
<execution>
<configuration>
</configuration>
<phase>post-clean</phase>
<goals>
<goal>update-widgetset</goal>
</goals>
</execution>
</executions>
【讨论】:
你能解释一下为什么这行得通吗? “刚刚添加”和“为我解决”并没有真正增加我对它没有不需要的隐藏行为的信任。 果然,给我的 pom.xml 中的execution
有一个phase
和一个goal
,但还是报错。
男士 - 我很抱歉。我不是专家,想帮助一些寻求快速解决方案的人。不过,我应该给出更多的见解。我认为这里的诀窍是包含执行阶段。由于 mojo 可以定义执行阶段,因此我尝试在清理后立即执行特定的插入,即清理后(默认为清理阶段)。这对我来说适用于日食靛蓝。可能特定插件可能使用了主 pom 中的一些依赖项? IIRC 这是基于 Vaadin 的插件。【参考方案6】:
通过应用以下解决方案,我能够在 Eclipse Kepler 4.3 中解决与 maven-antrun-plugin 和 jaxb2-maven-plugin 相同的问题: http://wiki.eclipse.org/M2E_plugin_execution_not_covered#Eclipse_4.2_add_default_mapping 所以我的%elipse_workspace_name%/.metadata/.plugins/org.eclipse.m2e.core/lifecycle-mapping-metadata.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<versionRange>1.3</versionRange>
<goals>
<goal>run</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<versionRange>1.2</versionRange>
<goals>
<goal>xjc</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
*必须重新启动 Eclipse 才能看到错误消失。
【讨论】:
【参考方案7】:从Maven Eclipse (m2e) 0.12 版开始,所有 Maven 生命周期目标都必须映射到已安装的 m2e 扩展。在这种情况下,maven-ear-plugin
有一个未映射的目标 default-generate-application-xml
。
您可以按照此处的说明排除未映射的生命周期目标:
https://wiki.eclipse.org/M2E_plugin_execution_not_covered
或者,只需右键单击 Eclipse 中的错误消息并选择 Quick Fix
-> Ignore for every pom with such errors
。
忽略生命周期目标时应该小心:通常目标会做一些有用的事情,如果您将它们配置为在 Eclipse 中被忽略,您可能会错过重要的构建步骤。您可能还想考虑为未映射的生命周期目标添加对 Maven Eclipse EAR 扩展的支持。
【讨论】:
【参考方案8】:使用 Jan 的答案中解释的机制,我已指示 m2e 插件忽略目标“generate-application-xml”。这消除了错误并且似乎可以工作,因为 m2e 创建了 application.xml。
所以基本上这个错误迫使我们决定当 Maven 构建在 m2e 插件的控制下在 Eclipse 中运行时负责生成 application.xml 的机制。我们决定由 m2e 负责。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.6</version>
<configuration>
<version>6</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
**<!-- This plugin's configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<versionRange>[2.1,)</versionRange>
<goals>
<goal>generate-application-xml</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>**
</plugins>
</pluginManagement>
</build>
【讨论】:
【参考方案9】:您需要了解M2E_plugin_execution_not_covered中的内容并按照以下步骤操作:
从 eclipse 插件文件夹中选择 org.eclipse.m2e.lifecyclemapping.defaults jar 解压并打开lifecycle-mapping-metadata.xml,您可以在其中找到所有pluginExecutions。 在<action>
标签下添加在<ignore/>
下显示为错误的插件的pluginExecutions。
例如:对于 write-project-properties 错误,在生命周期映射元数据.xml 文件的<pluginExecutions>
部分下添加此 sn-p:
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<versionRange>1.0-alpha-2</versionRange>
<goals>
<goal>write-project-properties</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
替换 JAR 中的 XML 文件
替换 Eclipse 插件文件夹中更新的 JAR
重启 Eclipse
您应该不会在未来看到任何项目的错误。
【讨论】:
【参考方案10】:即使问题太老了,但我想分享对我有用的解决方案,因为我已经检查了所有关于此错误的内容。这很痛苦,我花了两天时间尝试,最后解决方案是:
在eclipse中更新M2e插件
清理并重新构建
【讨论】:
以上是关于生命周期配置未涵盖插件执行(JBossas 7 EAR 原型)的主要内容,如果未能解决你的问题,请参考以下文章
这是啥 Maven 错误? “生命周期配置未涵盖插件执行...)”