Java 11: В чем разница между параметрами командной строки javac --release и -source и -target? - PullRequest
0 голосов
/ 23 февраля 2019

Кто-нибудь знает разницу между использованием --release и более старых параметров командной строки -source и -target?

На странице man javac: -source Обеспечивает совместимость исходного кода с указанным выпуском -target Генерирует файлы классовдля конкретной версии виртуальной машины

- выпуск Компиляция для конкретной версии виртуальной машины.Поддерживаемые цели: 6, 7, 8, 9, 10, 11

Может ли --release связать и -source, и -target с одной и той же версией?

1 Ответ

0 голосов
/ 23 февраля 2019

Я нашел ответ в исходном коде Java 11 SDK для компилятора java:

/**
     * 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;
    }

Как показывает код, опция --release устанавливает для источника и цели одно и то же значение.

На самом деле, есть проверка, которая запрещает использование параметра --release, если источник или цель уже были установлены.

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