IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ANT Java Discussion :

[javac] Conflit de classes


Sujet :

ANT Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Par défaut [javac] Conflit de classes
    Bonjour,

    Je suis en train de mettre au point un script ant pour compiler et générer un jar. Je me suis aidé d'Eclipse et de sa fonction de génération de fichier build.xml automatique, mais j'ai encore des soucis.

    Mon projet utilise la classe XmlElementRef. Elle est à la fois dans la JRE, et dans une librairie intégrée au projet (jaxb-api-2.2.1.jar).

    Le problème c'est que la version de la JRE (1.6u33) ne contient pas la méthode required() et que nous l'utilisons. Donc la compilation avec ant plante car elle n'utilise pas notre version.

    Comment dire à ant de prioriser nos librairies avant celles de la JRE ?

    Eclipse a généré différents <path> avec des id, et dans la cible "compilation", il appelle un de ces <path> (faisant référence aux autres). Je ne vois cependant pas d'appel en dur vers les classes de la JRE.

    Je pensais éventuellement à l'instruction bootclasspath, mais je n'arrive pas à l'utiliser correctement (package java.lang non trouvé) ; pas sur que ce soit la bonne solution.
    Sinon à un exclude, mais je ne vois pas comment exclure une classe d'une librairie mais pas d'une autre.

    Mon instruction javac :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <javac debug="true"
    	encoding="ISO-8859-15"
    	includeAntRuntime="false"
    	debuglevel="${debuglevel}" 
    	destdir="build/classes"
    	source="${source}" 
    	target="${target}">
    	<src path="src"/>
    	<classpath refid="MyProject.classpath"/>
    </javac>

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le problème c'est qu'on ne "cache" pas comme ça les librairies de la jvm. Selon le modèle de délégation des classloader, le classloader racine a toujours la priorité dans une application standard.

    Ceci dit, il te reste une solution. Pour toute librairie écrasant des classes standard, il existe un mécanisme prévu qui consiste à les mettre comme endorsed (elle feront partie du classloader racine). Il y a deux possibilités pour le faire
    1) mettre le jar dans lib/ext/ de l'installation java
    2) utiliser la propriété -Djava.endorsed.dirs="..." qui définis le dossier dans lequels se trouvent les jar écrasant ceux de la jvm. (attention à n'y mettre que le nécessaire et pas tout ton projet!)

  3. #3
    Membre très actif
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Par défaut
    Bonjour tchize_,

    Merci pour ta réponse, par contre je ne pense pas que ça corresponde exactement à mon problème.

    En fait, le script est censé générer un jar qui sera ensuite lancé à partir d'un jnlp. Mon jar ne doit pas contenir directement ces dépendances, mais uniquement le coeur de l'application. Les dépendances sont ensuite gérées dans le JNLP.

    Par contre, je voudrais que la compilation à partir de ant me permette de générer ce fameux jar.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    normalement le -Djava.endorsed.dirs="..." devrais passer avec javac

  5. #5
    Membre très actif
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Par défaut
    Hello,

    Excusez ma réponse tardive, je galérais un peu et avais mis le sujet de côté. Au final c'était pas si compliqué, mais quand on tâtonne, on essaye un peu tout, on crée des erreurs, et on s'y perd :-)

    Ta solution tchize_ est parfaite. Il fallait juste que je cible les JAR qui posaient conflit, que je les déplace dans un dossier spécifique (endorsed), et que je mette à jour les chemins correspondants dans le script build.xml.

    L'option je l'ai intégrée dans le script plutôt que de la passer en ligne de commande. Elle se met donc dans l'instruction javac :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <javac ...>
        <compilerarg value="-Djava.endorsed.dirs=${pathToEndorsedJars}"/>
    </javac>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conflit de classe
    Par NeedUHelp dans le forum LabVIEW
    Réponses: 6
    Dernier message: 23/04/2012, 08h34
  2. Conflits de classes - link error
    Par sphere369 dans le forum Débuter
    Réponses: 6
    Dernier message: 13/07/2009, 16h05
  3. Conflit entre class et struct
    Par Mortada dans le forum C++
    Réponses: 33
    Dernier message: 19/07/2007, 18h15
  4. Conflit de classes
    Par BnA dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 18/07/2007, 13h43
  5. [FLASH 8] conflit de class
    Par CR_Gio dans le forum Flash
    Réponses: 3
    Dernier message: 02/06/2006, 23h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo