使用 Apache CXF 和 CXF Maven 插件在 Eclipse Workspace 中自动生成 WSDL Java 存根

Automatic WSDL Java Stub generation in Eclipse Workspace using Apache CXF and CXF Maven Plugin

我正在使用 Apache CXF 2.x、Eclipse Luna 64 位、Maven 3.x

我有一个具有 WSDL 的 Web 服务生产者应用程序,我希望应用程序中的存根从 WSDL 动态生成。

我已经安装了 Maven Lifecycle Dependency 并安装了两个 M2E WTP 连接器。在 Eclipse 项目 -> 属性 -> Maven -> 生命周期映射中,我看到 cxf-codegen-plugin:wsdl2java,它表明它已正确附加到生成源生命周期阶段。

当我手动 运行 mvn install 时,存根会自动生成并且一切正常。

但是如果我清理 maven 项目并将其加载到 eclipse 中,eclipse 不会自动生成存根。我在 Eclipse 工作区中看到 Java missing class 错误,显示生成没有发生。

我错过了哪一步?

这是我正在使用的 POM。

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test</groupId>
    <artifactId>testWeb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>testWeb</name>

    <properties>
        <cxf.version>2.1.3</cxf.version>
        <maven.compiler.source>1.6</maven.compiler.source>
        <maven.compiler.target>1.6</maven.compiler.target>
        <spring.version>3.2.2.RELEASE</spring.version>
    </properties>

    <repositories>
        <repository>
            <id>snapshots</id>
            <name>ILP Snapshot Repository</name>
            <url>http://dhud001.test.com:8675/maven_snapshot/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>       
        <repository>
            <id>eclipse</id>
            <name>Eclipse</name>
            <url>https://repo.eclipse.org/content/repositories/releases/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>daily</updatePolicy>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>Maven Plugin Repository</name>
            <url>http://repo1.maven.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf</artifactId>
            <version>${cxf.version}</version>
        </dependency>        
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>src/gen/java</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>${cxf.version}</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <useCompileClasspath>true</useCompileClasspath> <!-- if you don't use this, the soapui test bundle will cause classloading issues with this plugin. -->
                            <sourceRoot>${project.basedir}/src/gen/java</sourceRoot>
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>${project.basedir}/src/main/webapp/wsdl/TestService.wsdl</wsdl>
                                    <wsdlLocation>classpath:wsdl/TestService.wsdl</wsdlLocation>
                                    <extraargs>
                                        <extraarg>-verbose</extraarg>
                                        <extraarg>-all</extraarg>
                                                                                </extraargs>
                                </wsdlOption>
                            </wsdlOptions>                            
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>               
            </plugin>
        </plugins>
    </build>
</project>

我能够安装 Build helper maven connector 并且还尝试安装 https://code.google.com/a/eclipselabs.org/p/m2e-cxf-codegen-connector/。但是源继续不生成。

可以重现问题的示例 eclipse 项目在这里:https://www.dropbox.com/s/vlo0ghbmkplu7au/service.zip?dl=0

我不确定您在什么情况下期望什么,但 cxf m2e 插件的生命周期映射似乎有问题,因为清理机制不清理适合该插件的目标文件夹。

因此,只需手动删除目标文件夹(或至少删除 "cxf-codegen-plugin-markers" 子文件夹),然后 运行 构建。这应该会在需要的地方生成 java 文件。

您还可以通过 运行 或调试上下文菜单项执行 Maven 目标。 Maven 会删除整个 "target" 文件夹。因此,运行从上下文 运行 菜单(或从 Maven 运行 配置)进行清理和安装也可以满足您的需要。

请注意,命令行 maven 不喜欢您的 "cxf" 依赖项,而且似乎也不需要它。我必须删除它才能使其正常工作。

最后一件事,cxf 插件在 eclipse 构建之后也不刷新项目,这是查看构建中生成的内容所必需的。因此在构建后需要在 eclipse 项目上快速 F5。

为了让 "Update Maven Projects" 触发要从 Eclipse 重建的 cxf 存根,您需要打开 target 文件夹并删除 target/*。然后点击 alt + f5 + enter,您的存根将刷新。

出于某种原因,手动清理目标文件夹内容会触发 Maven 的 cxf 构建以生成存根。更改 WSDL/deleting 生成的源 src 文件夹的内容没有帮助。