Search code examples
mavenxsdjaxbmaven-jaxb2-plugin

IOException thrown when processing xsd dependencies in maven


I have a problem while processing .xsd file during my maven build. I use jaxb2 plugin but I have to download external dependiencies from my .xsd files. The problem is that these dependencies (.xsd) are from enviroment which is unstable and very often my build fails because maven cannot download xsd file. How to configure jaxb plugin to force him to try download xsd few times to prevent build failure?

Part of my pom.xml configuration:

 <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <configuration>
                    <strict>false</strict>
                    <extension>true</extension>
                    <args>
                        <arg>-Xfluent-api</arg>
                        <arg>-XtoString</arg>
                        <arg>-Xsetters</arg>
                        <arg>-XenumValue</arg>
                    </args>
                    <plugins>
                        <plugin>
                            <groupId>net.java.dev.jaxb2-commons</groupId>
                            <artifactId>jaxb-fluent-api</artifactId>
                            <version>${jaxb.fluentapi.version}</version>
                        </plugin>
                        <plugin>
                            <groupId>org.jvnet.jaxb2_commons</groupId>
                            <artifactId>jaxb2-basics</artifactId>
                            <version>0.9.3</version>
                        </plugin>

                    </plugins>
                    <bindingDirectory>src/main/resources/jaxb</bindingDirectory>
                    <bindingIncludes>
                        <include>bindings.xml</include>
                    </bindingIncludes>
                    <schemas>
                        <schema>
                            <fileset>
                                <!-- Defaults to schemaDirectory. -->
                                <directory>${project.basedir}/src/main/resources/orbeons</directory>
                                <!-- Defaults to schemaIncludes. -->
                                <includes>
                                    <include>*.xsd</include>
                                </includes>
                            </fileset>
                        </schema>
                    </schemas>
                </configuration>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>${project.basedir}/generated-sources/orbeons</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>

Solution

  • Apparently the maven-jaxb2-plugin does not support such a feature. (And neither does the maven-download-plugin nor even the maven-dependency-plugin).

    Three solutions come into my mind at the moment (plus two and a half inspired by LIttle Ancient Forest Kami's comment) [Numbers reflect the precedence of what I would do]:

    • Use a CI tool (Jenkins, etc.) that supports retry on job failure. [1]

    • Handmade:

      ... that performs the download and retry and bind it to the generate-resources phase in your project's POM.

      • Create a Maven plugin with appropriate parameters (url, outputDirectory, retryCount) that uses the maven-download-plugin and performs the retry. Bind its goal to the generate-resources phase in your project's POM. [4]

      • Create a check-download Maven project that uses the maven-download-plugin bound to the generate-resources phase to download the .xsd. [6]

        Create a shell script that contains the following (in pseudo code):

        download:
          counter++
          <check-download project>/mvn generate-resources
          if error and counter < maxRetryCount goto download
        
        if not error
          <your project>/mvn ...
        else
          display appropriate error message
        

    There is also a question Maven download retry? from 2005. Unanswered.