mavenwsdlwsimportjava-ws

XSD and WSDL in different directories


At my work used jaxws-maven-plugin for code generation. I have two projects are "common" and'' client ". Structure roughly as follows:

app/
  common/
    resource/
      some.xsd
  client/
    resource/
      some.wsdl

How can I generate classes from wsdl in the project "client", using the xsd from the project "common"?

pom.xml:

            <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <verbose>true</verbose>
                        <bindingFiles>
                            <bindingFile>${project.parent.basedir}/common/resource/some.xsd</bindingFile>
                        </bindingFiles>
                        <wsdlFiles>
                            <wsdlFile>/resource/some.wsdl</wsdlFile>
                        </wsdlFiles>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Solution

  • First of all you should stick to the maven conventions, use src/main/resources/ directories for resources.

    After doing that then you can use the maven-dependency-plugin:unpack-dependencies to unpack the common jar file to access the some.xsd:

    <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>
    
        <parent>
            <groupId>com.stackoverflow.Q13155047</groupId>
            <artifactId>app</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <artifactId>client</artifactId>
    
        <name>${project.artifactId}-${project.version}</name>
    
        <properties>
            <schema.location>${project.build.directory}/schemas</schema.location>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>com.stackoverflow.Q13155047</groupId>
                <artifactId>common</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.5.1</version>
                    <executions>
                        <execution>
                            <id>unpack-dependencies</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>unpack-dependencies</goal>
                            </goals>
                            <configuration>
                                <includes>**/*.xsd</includes>
                                <outputDirectory>${schema.location}</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>jaxws-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>wsimport</goal>
                            </goals>
                            <configuration>
                                <verbose>true</verbose>
                                <bindingDirectory>${schema.location}</bindingDirectory>
                                <bindingFiles>
                                    <bindingFile>some.xsd</bindingFile>
                                </bindingFiles>
                                <wsdlDirectory>src/main/resources</wsdlDirectory>
                                <wsdlFiles>
                                    <wsdlFile>some.wsdl</wsdlFile>
                                </wsdlFiles>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    The jaxws-maven-plugin is bound to the generate-sources phase so adding the maven-dependency-plugin before the jaxws-maven-plugin and to the same phase makes sure that it unpacks everything before applying the wsimport goal.

    Make sure that <bindingDirectory/> and <wsdlDirectory/> are correct.


    This is how you should do it if you have the *.xsd files in another project. Never access other projects with relative paths. Each project should only access other resources using the dependency mechanism.