web-dev-qa-db-fra.com

SAXParseException avec jdk8 et maven-jaxb2-plugin

Si vous utilisez un plugin tel que org.jvnet.jaxb2.maven2:maven-jaxb2-plugin pour analyser vos fichiers xsd, vous rencontrez cette exception lors de la mise à niveau de jdk7 vers jdk8:

org.xml.sax.SAXParseException; systemId: file:/D:/Work/my/schema.xsd; lineNumber: 27; columnNumber: 133; schema_reference: Failed to read schema document 'CoreComponentsTechnicalSpecification-1p0.xsd', because 'file' access is not allowed due to restriction set by the accessExternalSchema property.

Comment faites-vous fonctionner ce plugin avec jdk8?

15
Niel de Wet

Cette question a la même cause fondamentale que celle-ci . Il y a deux façons de résoudre ce problème:

Définition de la propriété système javax.xml.accessExternalSchema:

Si vous construisez uniquement localement, vous pouvez ajouter cette ligne à un fichier nommé jaxp.properties (s'il n'existe pas) sous /path/to/jdk1.8.0/jre/lib:

javax.xml.accessExternalSchema=all

Cela ne fonctionnera pas si vous travaillez sur le projet avec d'autres, surtout s'ils utilisent encore jdk7. Vous pouvez simplement exécuter votre construction maven avec la propriété système spécifiée sur la ligne de commande:

$mvn <target and options> -Djavax.xml.accessExternalSchema=all

Vous pouvez également utiliser un plugin pour définir la propriété système pour vous:

<plugin>
    <!-- Needed to run the plugin xjc en Java 8 or superior -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0-alpha-2</version>
    <executions>
        <execution>
            <id>set-additional-system-properties</id>
            <goals>
                <goal>set-system-properties</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <properties>
            <property>
                <name>javax.xml.accessExternalSchema</name>
                <value>all</value>
            </property>
            <property>
                <name>javax.xml.accessExternalDTD</name>
                <value>all</value>
            </property>
        </properties>
    </configuration>
</plugin>

Vous pouvez également configurer le maven-jaxb2-plugin pour définir la propriété:

<plugin>
   <groupId>org.jvnet.jax-ws-commons</groupId>
   <artifactId>jaxws-maven-plugin</artifactId>
   <version>2.3</version>
   <configuration>
     <!-- Needed with JAXP 1.5 -->
     <vmArgs>
         <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
     </vmArgs>
   </configuration>
</plugin>

Définition de la version cible: Si vous ne souhaitez pas utiliser les propriétés système, vous pouvez configurer le maven-jaxb2-plugin pour cibler la version 2.0:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>${maven.plugin.jaxb2.version}</version>
    <configuration>
        <args>
            <arg>-target</arg>
            <arg>2.0</arg>
        </args>
    </configuration>
</plugin>
40
Niel de Wet

Avec la version 2.4 du plugin:

<externalEntityProcessing>true</externalEntityProcessing>
0
Rob Tulloh