How to generate classes from wsdl using Maven and wsimport?

后端 未结 7 890
时光说笑
时光说笑 2020-12-01 00:35

When I attempt to run \"mvn generate-sources\" this is my output :

SLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".
SLF4J: Defaulting to n         


        
相关标签:
7条回答
  • 2020-12-01 00:36

    To generate classes from WSDL, all you need is build-helper-maven-plugin and jaxws-maven-plugin in your pom.xml
    Make sure you have placed wsdl under folder src/main/resources/wsdl and corresponding schema in src/main/resources/schema, run command "mvn generate-sources" from Project root directory.

    C:/Project root directory > mvn generate-sources
    

    generated java classes can be located under folder

    target/generated/src/main/java/com/raps/code/generate/ws.
    

    pom.xml snippet

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.9</version>
        <executions>
            <execution>
                <id>add-source</id>
                <phase>generate-sources</phase>
                <goals><goal>add-source</goal></goals>
                <configuration>
                    <sources>
                        <source>${project.build.directory}/generated/src/main/java</source>
                    </sources>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxws-maven-plugin</artifactId>
        <version>1.12</version>
        <configuration>
            <wsdlDirectory>${project.basedir}/src/main/resources/wsdl</wsdlDirectory>
            <packageName>com.raps.code.generate.ws</packageName>
            <keep>true</keep>
            <sourceDestDir>${project.build.directory}/generated/src/main/java</sourceDestDir>
        </configuration>
        <executions>
            <execution> 
                <id>myImport</id>
                <goals><goal>wsimport</goal></goals>
            </execution>
        </executions>
    </plugin>
    
    0 讨论(0)
  • 2020-12-01 00:38

    The key here is keep option of wsimport. And it is configured using element in About keep from the wsimport documentation :

    -keep                     keep generated files
    
    0 讨论(0)
  • 2020-12-01 00:42

    Try to wrap wsdlLocation in wsdlUrls

                <wsdlUrls>
                    <wsdlLocation>http://url</wsdlLocation>
                </wsdlUrls>
    
    0 讨论(0)
  • 2020-12-01 00:44

    I see some people prefer to generate sources into the target via jaxws-maven-plugin AND make this classes visible in source via build-helper-maven-plugin. As an argument for this structure

    the version management system (svn/etc.) would always notice changed sources

    With git it is not true. So you can just configure jaxws-maven-plugin to put them into your sources, but not under the target folder. Next time you build your project, git will not mark these generated files as changed. Here is the simple solution with only one plugin:

          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>2.6</version>
    
        <dependencies>
          <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-fluent-api</artifactId>
            <version>3.0</version>
          </dependency>
          <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-tools</artifactId>
            <version>2.3.0</version>
          </dependency>
        </dependencies>
    
        <executions>
          <execution>
            <goals>
              <goal>wsimport</goal>
            </goals>
            <configuration>
              <packageName>som.path.generated</packageName>
              <xjcArgs>
                <xjcArg>-Xfluent-api</xjcArg>
              </xjcArgs>
              <verbose>true</verbose>
              <keep>true</keep> <!--used by default-->
              <sourceDestDir>${project.build.sourceDirectory}</sourceDestDir>
              <wsdlDirectory>src/main/resources/META-INF/wsdl</wsdlDirectory>
              <wsdlLocation>META-INF/wsdl/soap.wsdl</wsdlLocation>
            </configuration>
          </execution>
        </executions>
      </plugin>
    

    Additionally (just to note) in this example SOAP classes are generated with Fluent API, so you can create them like:

    A a = new A()
      .withField1(value1)
      .withField2(value2);
    
    0 讨论(0)
  • 2020-12-01 00:53

    Even though this is bit late response, may be helpful for someone. Look like you have used pluginManagement. If you use pluginManagement , it will not pick the plug-in execution.

    It should be under

    <build>
    <plugins>           
            <plugin> 
    
    0 讨论(0)
  • 2020-12-01 00:53

    i was having the same issue while generating the classes from wsimport goal. Instead of using jaxws:wsimport goal in eclipse Maven Build i was using clean compile install that was not able to generate code from wsdl file. Thanks to above example. Run jaxws:wsimport goal from Eclipse ide and it will work

    0 讨论(0)
提交回复
热议问题