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

EDI et Outils pour Java Discussion :

javac : source et target version


Sujet :

EDI et Outils pour Java

  1. #1
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut javac : source et target version
    Salut,

    Je n'ai jamais compris l'intérêt d'avoir 2 options source et target pour le compilateur javac.

    D'après ce que j'ai compris, "source", ça permet de définir la version de la source qui est donnée en entrée, et "target", la version des binaires bytecode.

    Le target est effectivement utile, mais le source, je ne vois pas en quoi ça peut résoudre un problème ou apporter une amélioration à quelque chose.

    Le pire, c'est que si j'utilise Java 6, et que je compile avec target="1.5" XOR (ou exclusif) source="1.5", il génère du bytecode 1.6.
    Pour qu'il génère du bytecode 1.5, il faut faire source="1.5" ET target="1.5".
    Donc en gros il faut que source soit égal à target, d'où mon incompréhension de la présence de 2 attributs...

    Vous avez une explication?

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par ®om
    Le pire, c'est que si j'utilise Java 6, et que je compile avec target="1.5" XOR (ou exclusif) source="1.5", il génère du bytecode 1.6.
    Pour qu'il génère du bytecode 1.5, il faut faire source="1.5" ET target="1.5".
    Je viens de tester et je n'ai pas du tout ce comportement ? Tu pourrais donner un exemple de code et les commandes que tu utilises ?

    Citation Envoyé par ®om
    Donc en gros il faut que source soit égal à target, d'où mon incompréhension de la présence de 2 attributs...
    Les options -source et -target ne sont pas forcément égal, même s'il y a quelques restrictions...

    -source permet de controller le fonctionnement du compilateur, afin de respecter les spécifications d'une version du langage.

    Ainsi si tu compiles avec -source 1.3, le compilateur génèrera des erreurs sur les assertions (java 1.4), les generics/enum/ellipse et autres nouveautés de Java 5.0, etc... mais en contrepartie il t'autorisera à utiliser des noms de variables tel que 'assert' ou 'enum' qui sont devenu des mots-clefs depuis...

    Ainsi un -source 1.4 (ou inférieur) te permettra de compiler le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Main {
    	public static void main(String[] str) {
    		String enum = "enum";
    		System.out.println(enum);
    	}
    }


    Mais l'option -source a un très petit impact sur l'option -target, et il est possible de faire des chose du genre :



    Il y a bien sûr quelques limitations à cela dû à des changements importants dans le langage, ainsi un -source 1.4 requiert un -target 1.4 au minimum (et de même pour le 1.5).



    Enfin, si tu utilises l'option -target pour t'assurer une compatibilité avec un JVM plus ancienne, tu dois faire attention à ton CLASSPATH ! En effet, si l'option -target te permet de controller le bytecode généré, le compilateur utilisera l'API standard de la version courante, ce qui peut te provoquer quelques erreurs à l'exécutions du code sur une JVM antérieur (classes ou méthodes inexistante).

    Pour cela il faut utiliser l'option -bootclasspath en référencant le fichier rt.jar de la JVM cible...


    Mais le mieux reste de compiler avec le JDK correspondant à la JVM cible

    a++

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <javac destdir="${build.dir}" classpathref="classpath" encoding="utf8" source="1.5" target="1.5" fork="true">
    C'est avec ceci que j'ai compilé (avec ant), si tu enlèves source="1.5" le bytecode généré est du 1.6 (version 50 quand tu fais un "file" sur un .class).

Discussions similaires

  1. [MIDlet Pascal] MIDlet Pascal devient open source dans sa version 3.0
    Par petitprince dans le forum Autres IDE
    Réponses: 24
    Dernier message: 14/07/2010, 01h10
  2. besoin du code source pour une version debug ?
    Par tendu1 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 08/10/2009, 19h25
  3. Plusieurs Répertoires Source et Target
    Par Palmer dans le forum Maven
    Réponses: 13
    Dernier message: 02/05/2007, 13h06
  4. Réponses: 1
    Dernier message: 08/12/2006, 11h16
  5. compilation de sources avec plusieurs version de JDK
    Par DanielW33 dans le forum Maven
    Réponses: 8
    Dernier message: 16/08/2006, 19h59

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