jaxws-maven-plugin 2.2 Сбой с NoSuchMethodError()

Я пытаюсь использовать jaxws maven plugin для генерации источника для моего клиента веб-сервиса и получения следующего исключения;

    [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

Ответ 1

Недавно у меня была такая же ошибка.
Похоже, что это происходит потому, что wsimport messes с версиями jaxb версии 2.1 и 2.2.

Я смог правильно генерировать источники веб-сервисов, отредактировав проект pom.xml и добавив <target>2.1</target> в конфигурацию каждого импортированного wsdl, например:

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

Надеюсь, это поможет тому, кто имеет эту проблему.

Ответ 2

Я полагаю, исходя из вашей проблемы, что вы работаете на Java 6? Поскольку Java 6 включает более старую версию JAX-WS, вам необходимо переопределить эти включенные API, если вы хотите сгенерировать, скомпилировать и запустить JAX-WS 2.2 на Java 6. Как упоминает Tex Killer выше, вы можете просто сказать wsimport для генерации Объекты JAX-WS 2.1 и все должно работать нормально (предполагая, что у вас есть одна из Java JRE, включающая JAX-WS 2.1, а не 2.0). Если вы специально хотите сгенерировать для 2.2, я смог сделать это, установив свой POM на следующий (я включил только элемент сборки для краткости):

<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-компилятор-плагин, но, похоже, вы правильно настроили каталоги. В-третьих, вам нужно будет добавить определение для maven-dependency-plugin. Возможно, вам придется изменить версии JAXB и JAX-WS API в соответствии с вашими потребностями.

В дополнение к этим, мне тогда пришлось обновить JRE, который запускал Maven с одобренными библиотеками, помещая банки для JAXB и API JAX-WS (те же, что определены в POM) в <java-home>/lib/endorsed, Наконец, убедитесь, что сборка Maven запускается JRE, которую вы только что обновили. Если он все еще не работает, проверьте конфигурацию запуска Eclipse для своей сборки Maven и убедитесь, что она использует JRE с одобренными библиотеками. (В моем случае в конфигурации запуска использовалась другая JRE, чем в конфигурации проекта - я обновил проект JRE, но не тот, который использовался конфигурацией запуска, и мне потребовался день, чтобы понять, почему он все еще не был за работой).

Это должно сделать трюк для вас. Если вы хотите быть немного более сообразительным, вы можете, возможно, обновить конфигурацию запуска, чтобы напрямую ссылаться на внешние поддерживаемые библиотеки, если вы не хотите изменять установку JRE.

ура