SJunejo
SJunejo

Reputation: 1336

jaxws-maven-plugin 2.2 Failure with NoSuchMethodError()

I am trying to use jaxws maven plugin to generate source for my web service client and getting following exception;

    [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

Here is my POM I am using to build the project;

    <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>

I tried to find information but there nothing available. Could you please help.

Thanks

--

Sjunejo

Upvotes: 11

Views: 18246

Answers (2)

rscarter
rscarter

Reputation: 247

I presume based on your problem that you are running on Java 6? Because Java 6 includes an older version of JAX-WS, you have to override those included APIs if you want to generate, compile, and run JAX-WS 2.2 on Java 6. As Tex Killer mentions above, you can just tell wsimport to generate JAX-WS 2.1 objects and everything should work fine (assuming you've got one of the Java 6 JREs that included JAX-WS 2.1, and not 2.0). If you specifically want to generate for 2.2, though, I was able to do this by setting my POM to the following (I've included just the build element for brevity):

<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>

There are three changes I think you'll need to make in your POM to get this to work. All three I got from here: http://jax-ws-commons.java.net/jaxws-maven-plugin/usage.html. First, you may need to add the additional dependencies for the jaxws plugin like I have above. Also note that you will have to uncomment the maven-compiler-plugin, but it appears that you have the endorsed directories set up properly. Third, you will need to add the definition for the maven-dependency-plugin. You may need to modify the JAXB and JAX-WS API versions to suit your needs.

In addition to these, I then had to update the JRE that was launching Maven with the endorsed libs by placing the jars for the JAXB and JAX-WS API (same ones defined in the POM) under <java-home>/lib/endorsed. Finally, make sure that the Maven build is being launched by the JRE that you just updated. If it still isn't working, check out the Eclipse run configuration for your Maven build, and make sure it is using the JRE with the endorsed libs. (In my case the run configuration was using a different JRE than the project configuration--I had updated the project JRE but not the one used by the run configuration, and it took me about a day to figure out why it still wasn't working).

That should do the trick for you. If you want to be a bit more savvy about it, you can probably update the run configuration to reference an external endorsed libs directly, in case you don't want to modify your JRE installation.

cheers

Upvotes: 5

Tex Killer
Tex Killer

Reputation: 208

I was having the same error recently.
It seems that it happens because wsimport messes with 2.1 and 2.2 versions of jaxb.

I was able to generate the Web Services sources correctly by editing the project pom.xml and adding a <target>2.1</target> tag to the configuration of each imported wsdl, like this:

<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>

Hope it helps whoever is having this issue.

Upvotes: 14

Related Questions