jaxws-maven-plugin 2.2 NoSuchMethodError()失败

时间:2012-12-12 14:00:10

标签: jax-ws maven-plugin

我正在尝试使用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>

我试图找到信息,但没有任何可用的信息。能帮忙吗?

由于

-

Sjunejo

2 个答案:

答案 0 :(得分:14)

我最近遇到了同样的错误 似乎发生这种情况是因为 wsimport jaxb 2.1 2.2 版本相混淆。

我能够通过编辑项目 pom.xml 并在每个导入的wsdl的配置中添加<target>2.1</target>标记来正确生成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>

希望无论谁遇到这个问题都会有所帮助。

答案 1 :(得分: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版本以满足您的需求。

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

那应该为你做的伎俩。如果你想对它有点了解,你可以更新运行配置以直接引用外部支持的lib,以防你不想修改你的JRE安装。

欢呼声