为什么在我拿走 pluginManagement 时能够创建 wsdl?

why am I able to create wsdl when I took away pluginManagement?

我的全部pom.xml在下面。有了这个 pom,我在 Eclipse "Plugin execution not covered by lifecycle configuration: org.apache.cxf:cxf-java2ws-plugin:3.1.8:java2ws (execution: process-classes, phase: process-classes)" 中得到了这个错误。 尽管如此,它确实可以正常工作。我的意思是,如果我 "mvn clean package install" 我得到所需的输出 wsdl 文件。

如果我添加了 pluginManagement,Eclipse 中的错误消失了,但我没有得到所需的 wsdl 文件,我的控制台也没有出现错误。我发现关于它的两个最接近的讨论是“Publishing wsdl java M2E plugin execution not covered" and "How to solve "Plugin execution not covered by lifecycle configuration" for Spring Data Maven Builds”,但我不理解它们。据我所知,想法是改变以利用

"<lifecycleMappingMetadata>...<action><execute/>".

我的直截了当的问题是:为什么当我去掉 pluginManagement 时,下面的 pom 仍然有效?我想,不确定,我缺少关于 pluginManagement 和执行之间 relantionship 的基本知识。我的问题中最相关的部分不是 Eclipse 有什么问题(我发现很少有人说要忽略它)。

我使用 pluginManagement 已经有一段时间了,但我从来没有想过它到底为我的 pom.xml 添加了哪些额外的功能。由于现在它在 java2ws 上失败了,我真的很想知道我是否应该在我的 pom 中添加任何额外的配置以启动它和 运行 pluginManagement and goal>java2ws.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>grp</groupId>
    <artifactId>art</artifactId>
    <packaging>war</packaging>

    <version>0.0.1-SNAPSHOT</version>
    <name>art Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <jdk.version>1.8</jdk.version>
        <cxf.version>3.1.8</cxf.version>
        <spring.version>4.3.4.RELEASE</spring.version>
        <!-- <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> -->
    </properties>

    <dependencies>
        <!-- Spring dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- Apache cxf dependencies -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <!-- servlet & jsp -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>art</finalName>
        <!-- <pluginManagement> -->

            <plugins>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.2</version>
                    <configuration>
                        <source>${jdk.version}</source>
                        <target>${jdk.version}</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-java2ws-plugin</artifactId>
                    <version>${cxf.version}</version>
                    <executions>
                        <execution>
                            <id>process-classes</id>
                            <phase>process-classes</phase>
                            <configuration>

                                <className>art.VmxService</className>

                                <outputFile>${project.basedir}/src/main/resources/VmxService.wsdl</outputFile>
                                <genWsdl>true</genWsdl>
                                <verbose>true</verbose>

                                <address>http://localhost:9080/art/VmxService</address>
                            </configuration>
                            <goals>
                                <goal>java2ws</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

            </plugins>
<!--        </pluginManagement> -->
    </build>
</project>

pluginManagement 部分的用途与 dependencyManagement 部分类似。它定义插件及其版本和配置默认值,而不实际将它们添加到 Maven 构建生命周期。

在模块中添加插件后,它将从 pluginManagement 部分获取配置。

另见:Maven: What is pluginManagement?

因此,如果在多个模块中使用相同插件的相似配置,您可以将它们集中在一个地方。如果插件只在一个模块中使用,我更愿意直接将它放在构建中。但两种方式都有效。

请记住,您还需要将插件添加到 build.plugins - 只需将它们放在 pluginManagement 中就没有任何作用。

eclipse 中的警告更多地与您的 IDE 的生命周期相关。它与 maven 生命周期有点不同,在某些情况下它无法检测(或不能?)插件应该在什么时候 运行。如果没有 maven 项目,一些插件也无法执行。所以我永远不确定生命周期映射插件试图解决什么问题:/

无论如何:如果您使用 maven 构建生成 类 并且这对您有用(当告诉 eclipse 到 'build' 没有 maven 的项目时没有这样做)你很好。

我认为现在信息(生命周期映射)直接烘焙到插件中并由 m2eclipse 插件读取。我在一些插件中看到过这样的 xml 文件。因此可能不再需要生命周期映射插件了。