3
votes

Maven ne parvient pas à trouver jaxb-api avec OpenJDK 11 même s'il est présent dans le référentiel

J'ai une machine avec OS Windows, elle est utilisée pour construire quelques projets WAR. Il a Java 8 installé dessus. J'utilise Maven 3.2.5 pour créer ces projets WAR. Tout fonctionne bien. Mais comme Java 8 sera un problème à l'avenir en raison de la fin des mises à jour gratuites, j'ai pensé à passer à OpenJDK 11.

J'ai téléchargé OpenJDK 11 mais je ne l'ai pas installé car je voulais juste essayer ceci pour 1 du projet pour démarrer. J'ai choisi l'un des projets WAR pour vérifier si OpenJDK 11 fonctionne. Ce projet est créé à l'aide de JHipster et Spring Boot. J'ai changé le pom.xml pour ce projet pour utiliser spring-boot.version en 2.1.2 et java.verion en 11 et j'ai également mis le jaxb-api , jaxb-impl, jaxb-runtime et javax.activation entrenties (comme indiqué ci-dessous) pour éviter les erreurs de dépendance liées à jaxb dans Java 11.

Dans l'invite de commande Windows , J'ai défini les variables JAVA_HOME et PATH sur OpenJDK11, puis je lance la commande mvn clean compile package . Comme prévu, toutes les dépendances liées à jaxb sont téléchargées dans le référentiel maven mais maven lance toujours l'erreur NoClassDefFoundError: javax / xml / bind / JAXBException tandis que jaxb-api jar est toujours là dans le référentiel Maven. J'ai essayé de lancer la commande à nouveau mais pas de chance.

Quelqu'un peut-il me guider sur la cause racine possible ou sur une solution de contournement.

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>


8 commentaires

Utilisez d'abord Maven 3.6.0.


Je suppose que cela peut avoir à voir avec le problème du "package fractionné" où les classes avec le même nom de package ne peuvent pas être dans deux fichiers jar différents. Cela entraînera des problèmes de chargement de classe.


Modifiez votre question et publiez les dépendances que vous avez ajoutées à votre pom.xml.


@ Michael-O Mise à jour de Maven vers 3.6.0 mais toujours la même erreur.


@Robert, dépendances ajoutées dans la question


Emballez-vous les bibliothèques dans votre fichier WAR ou les importez-vous depuis la plate-forme d'application? Parce que NoClassDefFoundError signifie généralement "J'ai trouvé la classe mais je n'y ai pas accès".


Pour le moment, nous empaquetons les bibliothèques uniquement dans le fichier WAR. Mais pourquoi y aurait-il un problème d'accès ici? Maven, code, jdk, référentiel tout est là sur la même machine.


Je suis confronté au même problème, la mise à niveau vers Java 11 à partir de Java 8. Même après avoir explicitement ajouté les dépendances de liaison XML dans le projet, j'obtiens une exception de classe non trouvée. Vous vous demandez si vous avez pu résoudre votre problème et quelle approche vous avez adoptée.


5 Réponses :


1
votes

La raison est peut-être des modules après java9, vous devriez donc créer un fichier module-info.java, plus de détails consulteront la documentation associée.


1 commentaires

créer le module-info.java dans mon projet et ajouter: module com.abc {requiert java.xml.bind; } mais pas de chance, même problème



0
votes

Je l'ai fait fonctionner avec le POM suivant

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>${maven-jaxb2-plugin.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
                <schemaIncludes>
                    <include>*.wsdl</include>
                </schemaIncludes>
            </configuration>
        </plugin>
    </plugins>
</build>

//

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.4.0-b180830.0359</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.activation/activation -->
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0-b170127.1453</version>
    </dependency>
</dependencies>

//

<properties>
    <maven-jaxb2-plugin.version>0.14.0</maven-jaxb2-plugin.version>
</properties>


2 commentaires

J'ai fait les 2 premiers changements et j'obtiens la même erreur. Quelle est la signification du 3e changement. Désolé, mais je n'ai pas compris le truc wsdl ici. Est-ce votre exemple d'emplacement de code?


J'ai la même erreur même après que toutes les modifications mentionnées sont effectuées



1
votes

Apparemment, seules les mises à niveau des jars de divers composants sont nécessaires pour prendre en charge JDK11 dans les projets Java écrits en Java8. La prise en charge du module n'est pas nécessaire tant que vous ne souhaitez pas créer des projets modulaires dans le produit et que l'importation / exportation du module est nécessaire.

J'ai également mis à niveau le Javaassist Jar avec ceux mentionnés en question et tout a commencé à fonctionner correctement après.

        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>javax.activation-api</artifactId>
            <version>1.2.0</version>
        </dependency>

et comme mentionné dans la question elle-même p >

<javassist.version>3.24.1-GA</javassist.version>


0 commentaires

0
votes

J'ai le même problème, j'utilise spring-boot et java 11. Cela m'aide.

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>


0 commentaires

0
votes

Ajoutez le code ci-dessous dans la classe de démarrage (comme SpringBootApplication):

@Bean
public TomcatServletWebServerFactory tomcatFactory() {
    return new TomcatServletWebServerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
        }
    };
}


0 commentaires