11

我正在尝试使用 jaxws maven 插件为我的 Web 服务客户端生成源代码并获得以下异常;

    [ERROR] Failed to execute goal org.jvnet.jax-ws-commons:jaxws-maven-plugin:2.2:wsimport (default) on project cf-wsjavaclient: Error executing: wsimpor
t [-keep, -s, C:\Users\sjunejo\Documents\GitHub\sandbox-ofsconnectorpoc\cf-wsjavaclient\target, -Xnocompile, http://localhost:9090/axis2/services/OFSC
onnectorServiceWS?wsdl]: UndeclaredThrowableException: javax.xml.bind.annotation.XmlElementRef.required() -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.jvnet.jax-ws-commons:jaxws-maven-plugin:2.2:wsimport (default) on p
roject cf-wsjavaclient: Error executing: wsimport [-keep, -s, C:\Users\sjunejo\Documents\GitHub\sandbox-ofsconnectorpoc\cf-wsjavaclient\target, -Xnoco
mpile, http://localhost:9090/axis2/services/OFSConnectorServiceWS?wsdl]
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error executing: wsimport [-keep, -s, C:\Users\sjunejo\Documents\GitHub\sandbox-ofsconnecto
rpoc\cf-wsjavaclient\target, -Xnocompile, http://localhost:9090/axis2/services/OFSConnectorServiceWS?wsdl]
        at org.jvnet.jax_ws_commons.jaxws.WsImportMojo.wsImport(WsImportMojo.java:360)
        at org.jvnet.jax_ws_commons.jaxws.WsImportMojo.processWsdlViaUrls(WsImportMojo.java:342)
        at org.jvnet.jax_ws_commons.jaxws.WsImportMojo.execute(WsImportMojo.java:283)
        at org.jvnet.jax_ws_commons.jaxws.MainWsImportMojo.execute(MainWsImportMojo.java:30)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
        ... 19 more
Caused by: java.lang.reflect.UndeclaredThrowableException
        at $Proxy44.required(Unknown Source)
        at com.sun.tools.xjc.generator.bean.field.AbstractField.annotateReference(AbstractField.java:192)
        at com.sun.tools.xjc.generator.bean.field.AbstractField.annotate(AbstractField.java:161)
        at com.sun.tools.xjc.generator.bean.field.AbstractFieldWithVar.createField(AbstractFieldWithVar.java:80)
        at com.sun.tools.xjc.generator.bean.field.SingleField.<init>(SingleField.java:94)
        at com.sun.tools.xjc.generator.bean.field.SingleField.<init>(SingleField.java:81)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.sun.tools.xjc.generator.bean.field.GenericFieldRenderer.generate(GenericFieldRenderer.java:69)
        at com.sun.tools.xjc.generator.bean.field.DefaultFieldRenderer.generate(DefaultFieldRenderer.java:82)
        at com.sun.tools.xjc.generator.bean.BeanGenerator.generateFieldDecl(BeanGenerator.java:774)
        at com.sun.tools.xjc.generator.bean.BeanGenerator.generateClassBody(BeanGenerator.java:555)
        at com.sun.tools.xjc.generator.bean.BeanGenerator.<init>(BeanGenerator.java:258)
        at com.sun.tools.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:166)
        at com.sun.tools.xjc.model.Model.generateCode(Model.java:290)
        at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:283)
        at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:94)
        at com.sun.tools.ws.processor.modeler.wsdl.JAXBModelBuilder.bind(JAXBModelBuilder.java:142)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildJAXBModel(WSDLModeler.java:2244)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.internalBuildModel(WSDLModeler.java:191)
        at com.sun.tools.ws.processor.modeler.wsdl.WSDLModeler.buildModel(WSDLModeler.java:137)
        at com.sun.tools.ws.wscompile.WsimportTool.buildWsdlModel(WsimportTool.java:381)
        at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:198)
        at com.sun.tools.ws.wscompile.WsimportTool.run(WsimportTool.java:179)
        at com.sun.tools.ws.WsImport.doMain(WsImport.java:74)
        at org.jvnet.jax_ws_commons.jaxws.WsImportMojo.wsImport(WsImportMojo.java:357)
        ... 24 more
Caused by: java.lang.NoSuchMethodException: javax.xml.bind.annotation.XmlElementRef.required()
        at java.lang.Class.getDeclaredMethod(Class.java:1937)
        at com.sun.codemodel.TypedAnnotationWriter.invoke(TypedAnnotationWriter.java:112)
        ... 52 more

这是我用来构建项目的 POM;

    <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.xxxxx</groupId>
    <artifactId>cf-wsjavaclient</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cf-wsjavaclient</name>
    <properties>
        <wsdlLoc>http://localhost:9090/axis2/services/OFSConnectorServiceWS?wsdl</wsdlLoc>
        <skipTests>true</skipTests>
    </properties>
    <build>
        <plugins>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.6</version>
            <!-- Disable tests for now, until we have client jar built then we can run as follows;
                To run the tests:
                $ mvn verfiy -DskipTests=false
            -->             
            <configuration>
                <skipTests>${skipTests}</skipTests>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
            <plugin>
                <groupId>org.jvnet.jax-ws-commons</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <wsdlUrls>
                        <wsdlUrl>${wsdlLoc}</wsdlUrl>
                    </wsdlUrls>
                    <sourceDestDir>${basedir}/target</sourceDestDir>
                </configuration>
            </plugin>
             <!-- Don't forget to use endorsed with JAX-WS 2.2 on Java 6 !! -->
                <!-- plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArguments>
                        <endorseddirs>${basedir}/endorsed</endorseddirs>
                        </compilerArguments>
                    </configuration>
                </plugin-->
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.2.6</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

我试图查找信息,但没有可用的信息。能否请你帮忙。

谢谢

--

斯茹内霍

4

2 回答 2

14

我最近遇到了同样的错误。
似乎这是因为wsimportjaxb的2.12.2版本混淆了。

通过编辑项目pom.xml<target>2.1</target>并向每个导入的 wsdl 的配置添加标签,我能够正确生成 Web 服务源,如下所示:

<execution>
    <goals>
        <goal>wsimport</goal>
    </goals>
    <configuration>
        <wsdlFiles>
            <wsdlFile>path/to/file.wsdl</wsdlFile>
        </wsdlFiles>
        <wsdlLocation>http://path/to/webservice?wsdl</wsdlLocation>
        <staleFile>path/to/file.stale</staleFile>
        <target>2.1</target>
    </configuration>
    <id>wsimport-generate-WebServiceName</id>
    <phase>generate-sources</phase>
</execution>

希望它对遇到此问题的人有所帮助。

于 2013-02-21T13:09:19.133 回答
5

我根据您的问题推测您在 Java 6 上运行?因为 Java 6 包含旧版本的 JAX-WS,如果您想在 Java 6 上生成、编译和运行 JAX-WS 2.2,您必须覆盖这些包含的 API。正如 Tex Killer 上面提到的,您可以告诉 wsimport 生成JAX-WS 2.1 对象和一切都应该正常工作(假设您拥有包含 JAX-WS 2.1 而不是 2.0 的 Java 6 JRE 之一)。但是,如果您特别想为 2.2 生成,我可以通过将我的 POM 设置为以下内容来做到这一点(为简洁起见,我只包含了build元素):

<build>
    <plugins>
        <!-- Generate client using WSDL -->
        <plugin>
            <groupId>org.jvnet.jax-ws-commons</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <target>2.2</target>
                        <verbose>true</verbose>
                        <wsdlUrls>
                            <wsdlUrl>http://localhost:8080/axis2/services/HelloWorld?wsdl</wsdlUrl>
                        </wsdlUrls>
                        <packageName>my.package.name</packageName>
                    </configuration>
                </execution>
            </executions>


            <!-- if you want to use a specific version of JAX-WS, you can do so like 
                this -->
            <dependencies>
                <dependency>
                    <groupId>com.sun.xml.ws</groupId>
                    <artifactId>jaxws-tools</artifactId>
                    <version>2.2.7</version>
                    <exclusions>
                        <exclusion>
                            <groupId>org.jvnet.staxex</groupId>
                            <artifactId>stax-ex</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
                <dependency>
                    <groupId>org.jvnet.staxex</groupId>
                    <artifactId>stax-ex</artifactId>
                    <version>1.7</version>
                    <exclusions>
                        <exclusion>
                            <groupId>javax.xml.stream</groupId>
                            <artifactId>stax-api</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
            </dependencies>
        </plugin>

        <!-- Don't forget to use endorsed with JAX-WS 2.2 on Java 6 !! -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/endorsed</outputDirectory>
                        <silent>true</silent>
                        <artifactItems>
                            <artifactItem>
                                <groupId>javax.xml.bind</groupId>
                                <artifactId>jaxb-api</artifactId>
                                <version>2.2.4</version>
                                <type>jar</type>
                            </artifactItem>
                            <artifactItem>
                                <groupId>javax.xml.ws</groupId>
                                <artifactId>jaxws-api</artifactId>
                                <version>2.2.8</version>
                                <type>jar</type>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <compilerArguments>
                    <endorseddirs>${project.build.directory}/endorsed</endorseddirs>
                </compilerArguments>
            </configuration>
        </plugin>
    </plugins>
</build>

我认为您需要在 POM 中进行三项更改才能使其正常工作。我从这里得到的所有三个:http: //jax-ws-commons.java.net/jaxws-maven-plugin/usage.html。首先,您可能需要像我上面那样为 jaxws 插件添加额外的依赖项。另请注意,您必须取消注释 maven-compiler-plugin,但您似乎已正确设置了认可的目录。第三,您需要添加 maven-dependency-plugin 的定义。您可能需要修改 JAXB 和 JAX-WS API 版本以满足您的需要。

除了这些之外,我还必须通过将 JAXB 和 JAX-WS API(在 POM 中定义的相同)的 jar 放在 <java-home>/lib/endorsed 下来更新启动 Maven 的 JRE。 . 最后,确保刚刚更新的 JRE 正在启动 Maven 构建。如果它仍然无法正常工作,请检查您的 Maven 构建的 Eclipse 运行配置,并确保它使用带有认可库的 JRE。(在我的情况下,运行配置使用的 JRE 与项目配置不同——我更新了项目 JRE,但没有更新运行配置使用的 JRE,我花了大约一天的时间才弄清楚为什么它仍然没有在职的)。

那应该对你有用。如果您想更了解它,您可以更新运行配置以直接引用外部认可的库,以防您不想修改 JRE 安装。

干杯

于 2013-02-27T00:00:59.147 回答