生命周期配置未涵盖插件执行(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的jslintcompress目标

<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 的 jslintcompress 目标

<?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。 在&lt;action&gt; 标签下添加在&lt;ignore/&gt; 下显示为错误的插件的pluginExecutions。

例如:对于 write-project-properties 错误,在生命周期映射元数据.xml 文件的&lt;pluginExecutions&gt; 部分下添加此 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 错误? “生命周期配置未涵盖插件执行...)”

插件错误:生命周期配置未涵盖执行

生命周期配置 AppEngine 未涵盖插件执行

NodeJS 的生命周期配置未涵盖插件执行

Jacoco Maven 插件 - 生命周期配置未涵盖插件执行

生命周期配置未涵盖插件执行:com.jayway.maven.plugins.android.generation2