7
votes

JAXB Problèmes sous Java 7, il ne peut pas trouver RI 2.1.0

Je passe un test sur Ubuntu avec la mise à jour de Oracle Java 7 3. Selon les notes de publication, elle a Jaxb-2.2.4 inclus avec elle.

/usr/lib/jvm/java-7-oracle/jre/lib/endorsed


10 commentaires

Je me demande pourquoi un "com.bea". La classe est appelée fournisseur. Avez-vous des cours Weblogic ou Jrockit dans votre path de classe ou quelque part sur votre système? Cela peut expliquer les conflits avec les versions incluses de votre JDK ...


Est-il possible pour vous de poster un extrait de code, voire mieux un SSCCE?


Nous n'utilisons pas Weblogic ou Jrocket. Fondamentalement, j'ai tiré une instance Amazon EC2 où je veux que ce service soit exécuté. J'ai ensuite installé Oracle JDk 7 depuis un paquet PPA. webupd8.org/2012/ 01 / ... Je pense que le Bea Stuff fait partie de la mise en œuvre de référence de JAXB. J'ai pu effectuer ce travail sur ma machine Windows en installant Jaxb 2.2.5 dans mon répertoire approuvé de Java VM. Quand j'ai essayé la même chose sur Ubuntu, cela n'a pas fonctionné. (J'ai essayé in / usr / lib / jvm / java-7-oracle / jre / endossé).


Pouvez-vous utiliser VisualvM à partir d'Oracle JDK et vérifiez si votre application Java utilise JDK. Je pense que votre application fonctionne sous un autre.


Sscce == court, autonome, correct (compilable), exemple


Comme il fonctionne sur EC2, je ne peux pas exécuter Visualvm car il n'y a pas de X à transmettre. Le seul VM installé sur l'image est Oracle JDk 7, comme je l'ai montré ci-dessus. J'ai assisté à un comportement similaire sur mes machines Windows avec Oracle JDK 7 et cette application, mais sur Windows, elle était fixée en saisissant le JAXB RI et en mettant les Libs dans le répertoire approuvé JRE. Sur le serveride lorsque Tomcat 6 ou 7 est en cours d'exécution et lancé avec le même VM (car il vous montre que VM est lancé lorsque vous exécutez le démarrage.sh) J'ai vu le même problème. Il a été corrigé en installant les dernières bibliothèques de métro à Tomcat.


@hakovez Placant quelque chose dans le répertoire approuvé est généralement une mauvaise idée. Vous devriez essayer de résoudre vos problèmes de classe de classe dans votre application / Tomcat .... Placer quelque chose dans le répertoire approuvé de votre JRE influence le chemin de classe de toutes vos applications et peut provoquer des comportements inattendus ou des problèmes de classe.


@andih pour le côté serveur de cette application, j'ai résolu le problème avec la mise en place du métro à Tomcat, mais pour le côté du client, il s'agit d'un programme de ligne de commande (à l'aide du ressort 3.1 et de Jersey 1.12), j'ai essayé d'approuver comme il semblait que la seule option s'ils ne ramassait pas les choses hors du Java 7 Rt.jar. Cela étant dit approuvé uniquement sur Windows mais pas sur Ubuntu où cela sera déployé.


La modification du répertoire approuvé peut vous aider. Êtes-vous le seul utilisateur du client? Si vous souhaitez déployer votre client sur différentes machines avec des environnements inconnus, la modification de l'AIR approuvé n'est pas une solution valide.


Les approuvés ne semblent pas jouer agréable avec le printemps sous Ubuntu. Bien que cela a fonctionné sous Windows, je reçois maintenant une erreur dans laquelle il ne recueille pas JSR-173, car il donne à l'erreur du fournisseur de Stax lorsqu'il n'y a pas de mise en œuvre.


3 Réponses :


3
votes

me semble être un problème de classe de classe. Avez-vous vérifié s'il y a autre JAXB -IP-IMP-X.Y.Z.JAR code> ou JAXB-API-K.L.M.JAR CODE> S dans votre classe de classe? Le JsonConfiguration CODE> recherche la classe com.sun.xml.bind.annotation.overrideanceNotation de code> qui fait partie du JRE7 rt.jar code>.

Vous pouvez vérifier votre installation jre em> à l'aide du programme simple suivant: p> xxx pré>

Si vous utilisez Maven, vous pouvez utiliser un POM avec ce qui suit Dépendances: P>

<dependencies>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.12</version>

    <exclusions>
        <exclusion>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        </exclusion>
        <exclusion>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        </exclusion>
    </exclusions>

   </dependency>
</dependencies>


3 commentaires

J'ai traversé ma liberme pour voir si Anytong d'autre tirait dans cette classe et que ce n'est pas revenu avec quoi que ce soit. Je vais essayer le programme de test de la vôtre: pour I dans ls ; do jar -tvf $ i | grep com.sun.xml.bind.annotation.overrideanceNotation de ; Fini


jar -tvf rt.jar | Grep Supprure Retours Com / Sun / XML / interne / Bind / Annotation / OffribleNotationOf.cl Ass '. Je ne sais pas quelle libérez-vous que vous avez vérifié .Si vous avez vérifié votre application de conviction qui est évidente, sinon l'application aurait trouvé une implémentation de JAXB valide. Vous pouvez avoir une vieille implémentation JAXB sur votre catégorie de classe qui ne contient pas la catégorie OverriDeDeNationOntation` (I.e. Jaxb <2.1.0). Si vous souhaitez trouver la recherche de Jaxb obsolète pour 'Javax / XML / Bind / Marshaller.Class'. Si vous voulez simplement vérifier votre jre, il suffit de vérifier le rt.jar


J'ai traversé toutes mes libs avec Jar | Grep et aucun d'entre eux n'a le marshaller dedans. Nous utilisons un script pour construire toute notre variable de classe de classe pour l'application, donc j'ai modifié ce script pour vérifier chaque bocal. Je ne vois rien qui serait remplacer la base de la base. Je vais essayer votre programme de test maintenant et voir si j'ai de la chance avec ça.



2
votes

Pour savoir d'où une classe est chargée, vous devez exécuter la ligne de commande JVM avec -verbose: classe option.

De cette façon, vous pouvez deviner ce qui ne va pas en regardant les dernières lignes verbeuses juste avant que l'exception javax.xml.stream.factoryconfigurationError est lancée, ou juste avant le message de diagnostic jaxb ri 2.1.10 Non trouvé .

Pour que vous puissiez obtenir le JAR une implémentation provient et vérifiez que le répertoire endossé est utilisé ou non ...


1 commentaires

Merci pour le conseil. J'ai essayé cela et je vois que mes bocaux approuvés sont chargés de sorte que ce n'est pas clair pourquoi il ne fonctionne pas sur Ubuntu. Je pense que je vais simplement intégrer l'application à l'intérieur d'une webApp afin que le conteneur puisse simplement fournir les Libs.



1
votes

Eh bien, j'apprécie tous les commentaires ici, mais personne n'a réussi à résoudre mon problème, alors j'ai travaillé autour de lui comme suit. J'ai installé Metro-2.2 dans Tomcat 7. Puis, puisque mon application est une application de ligne de commande de printemps, j'ai construit une guerre de celui-ci afin qu'elle puisse courir dans le conteneur Tomcat. Cela impliquait mettre toutes mes bibliothèques pour mon application dans Web-INF / LIB Mes fichiers de configuration dans Web-Inf / Classes. Dans le Web-INF Dir, j'ai mis un fichier web.xml qui ressemble à ceci: xxx

index.jsp est vide car il n'y a pas de composant Web face à cette application. Le paramètre Spring-Config est mon fichier de configuration à ressort de haut niveau qui serait chargé à partir de la ligne de commande. Ma built de fourmi construit ensuite une guerre de cette application, et elle court super. Donc, toujours pas sûr de savoir pourquoi mes fichiers approuvés dans la JVM ne fonctionnaient pas comme à l'aide du fichier Verbose: le drapeau de la classe comme suggéré comme suggéré, mais en utilisant Tomcat comme conteneur et en chargement des classes dont j'ai besoin, Jersey est heureux et tous les les problèmes sont partis. Merci encore pour toute l'aide sur cette question.


3 commentaires

Vous devez donc utiliser Tomcat pour son mécanisme de classement spécifique: le chargeur de classes de guerre donnait la priorité à Web-Inf / Classes et au contenu Web-Inf / Lib avant de demander au chargeur de classe parent des ressources. Cela résout votre problème mais c'est vraiment lourd. Maintenant, vous avez un travail de travail, vous devez utiliser votre propre chargeur de classe pour configurer une telle stratégie "parent-la dernière" sans courir tomcat, vous n'avez pas besoin de: Stackoverflow.com/questions/5445511/...


Je n'avais jamais entendu parler de la dernière politique du parent, merci pour le lien. Je suis toujours plus préoccupé par le fait qu'ils annoncent d'avoir une nouvelle JAXB dans la machine virtuelle et je ne peux pas sembler utiliser les dernières fonctionnalités. Toutes les solutions nécessaires à charger différents bocaux (qu'il s'agisse d'une nouvelle version approuvée de Jaxb sur Windows ou de la tâche Tomcat sur Ubuntu). Je pense toujours qu'il peut y avoir quelque chose qui ne va pas avec le VM.


Si vous voulez que nous aidions, veuillez poster une petite partie de votre code runnable en tant que SSCCE. Si votre VM est faux, le nôtre peut ne pas être.