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

时间:2015-11-13 19:01:58

标签: eclipse cxf

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

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

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

lifecycle looks fine

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

但是如果我清理maven项目并在eclipse中加载它,eclipse不会自动生成存根。我看到Eclipse在Eclipse工作区中缺少类错误,显示gen没有发生。

我错过了什么步骤?

这是我正在使用的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连接器,并且还尝试安装https://code.google.com/a/eclipselabs.org/p/m2e-cxf-codegen-connector/。但是消息来源仍未产生。

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

2 个答案:

答案 0 :(得分:2)

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

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

您还可以通过“运行”或“调试”上下文菜单项执行maven目标。 Maven确实删除了整个&#34;目标&#34;干净的文件夹。因此,从上下文运行菜单(或从maven运行配置)运行clean和install也可以满足您的需求。

请注意,命令行maven并不喜欢你的&#34; cxf&#34;依赖性,无论如何它似乎都不需要。我不得不删除它以使其工作。

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

答案 1 :(得分:2)

为了获取“更新Maven项目”以触发从Eclipse重建的cxf存根,您需要打开target文件夹并删除target/*。然后点击alt + f5 + enter,您的存根将刷新。

由于某些原因,手动清理目标文件夹内容会触发maven的cxf构建以生成存根。更改WSDL /删除生成的源src文件夹的内容执行帮助。