3
votes

Java 11: Quelle est la différence entre les paramètres de ligne de commande javac --release et -source et -target?

Quelqu'un connaît-il la différence entre l'utilisation de --release et les anciens paramètres de ligne de commande -source et -target?

Dans la page de manuel javac: -la source Fournir la compatibilité de la source avec la version spécifiée -target Génère des fichiers de classe pour une version spécifique de VM

--release Compilez pour une version de VM spécifique. Cibles prises en charge: 6, 7, 8, 9, 10, 11

Est-ce que --release pourrait lier à la fois -source et -target à la même version?


1 commentaires

3 Réponses :


4
votes

J'ai trouvé la réponse dans le code source du SDK Java 11 pour le compilateur java:

 void checkOptionAllowed(boolean allowed, ErrorReporter r, Option... opts) {
        if (!allowed) {
            Stream.of(opts)
                  .filter(options :: isSet)
                  .forEach(r :: report);
        }
    }

Comme le montre le code, l'option --release définira à la fois la source et la cible sur le même valeur.

En fait, il y a une vérification qui interdit l'utilisation du paramètre --release si la source ou la cible ont déjà été définies.

/**
     * Handles the {@code --release} option.
     *
     * @param additionalOptions a predicate to handle additional options implied by the
     * {@code --release} option. The predicate should return true if all the additional
     * options were processed successfully.
     * @return true if successful, false otherwise
     */
    public boolean handleReleaseOptions(Predicate<Iterable<String>> additionalOptions) {
        String platformString = options.get(Option.RELEASE);

        checkOptionAllowed(platformString == null,
                option -> reportDiag(Errors.ReleaseBootclasspathConflict(option)),
                Option.BOOT_CLASS_PATH, Option.XBOOTCLASSPATH, Option.XBOOTCLASSPATH_APPEND,
                Option.XBOOTCLASSPATH_PREPEND,
                Option.ENDORSEDDIRS, Option.DJAVA_ENDORSED_DIRS,
                Option.EXTDIRS, Option.DJAVA_EXT_DIRS,
                Option.SOURCE, Option.TARGET,
                Option.SYSTEM, Option.UPGRADE_MODULE_PATH);

        if (platformString != null) {
            PlatformDescription platformDescription =
                    PlatformUtils.lookupPlatformDescription(platformString);

            if (platformDescription == null) {
                reportDiag(Errors.UnsupportedReleaseVersion(platformString));
                return false;
            }

            options.put(Option.SOURCE, platformDescription.getSourceVersion());
            options.put(Option.TARGET, platformDescription.getTargetVersion());

            context.put(PlatformDescription.class, platformDescription);

            if (!additionalOptions.test(platformDescription.getAdditionalOptions()))
                return false;

            JavaFileManager platformFM = platformDescription.getFileManager();
            DelegatingJavaFileManager.installReleaseFileManager(context,
                                                                platformFM,
                                                                getFileManager());
        }

        return true;
    }


1 commentaires

il définira également l'indicateur --bootclasspath pour qu'il se lie au bon runtime qui est parfois oublié avec seulement les indicateurs --source et --target.



0
votes

L'option --release a été ajoutée par "JEP 247: Compile for Anciennes versions de plate-forme ":

javac fournit deux options de ligne de commande, -source et -target , qui peuvent être utilisées pour sélectionner la version du langage Java acceptée par le compilateur et la version des fichiers de classe qu'il produit, respectivement. Par défaut, cependant, javac compile avec la version la plus récente des API de la plate-forme. Le programme compilé peut donc accidentellement utiliser des API disponibles uniquement dans la version actuelle de la plateforme. De tels programmes ne peuvent pas fonctionner sur les anciennes versions de la plate-forme, quelles que soient les valeurs transmises aux options -source et -target .

En outre, la documentation pour l'option --release dit:

Remarque: Lorsque vous utilisez --release , vous ne pouvez pas également utiliser --source / -source ou les options --target / -target .


0 commentaires

6
votes

L'indicateur --release définit non seulement les versions source et cible, mais il oblige également le compilateur à utiliser la table de symboles pour les bibliothèques JDK correspondant à la version spécifiée, vous évitant d'utiliser accidentellement les API qui sont présents dans le JDK de compilation mais pas dans la version spécifiée. L'indicateur --release a été ajouté plus tard et, dans la plupart des cas, devrait remplacer les utilisations de --source et --target .


0 commentaires