Что такое элемент "<release>" в "<configuration>" для "maven-compiler-plugin" в приложении JavaFX - PullRequest
3 голосов
/ 28 марта 2020

Я использовал архетип org.openjfx:javafx-archetype-simple Maven для запуска моего первого проекта JavaFX.

Полученное POM:

<project xmlns = "http://maven.apache.org/POM/4.0.0"
         xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.invoicing</groupId>
    <artifactId>Invoicer</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>14</maven.compiler.source>
        <maven.compiler.target>14</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>14</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>14</release>  ? ???
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.4</version>
                <configuration>
                    <mainClass>com.example.invoicing.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

➥ Какова цель строки <release>14</release> в <configuration> для плагина <artifactId>maven-compiler-plugin</artifactId>?

Я нашел эту документацию для плагина компилятора Maven, Компиляция ваших Java источников . Но это только упоминает <!-- put your configurations here -->. Так что я ничего не знаю об указанных здесь параметрах конфигурации c.

Является ли <release>14</release> версия Java, используемая для компиляции? Это версия OpenJFX? Что-то другое?

Я попытался использовать 28 произвольно. Doing a Maven> install выдал эту ошибку с бесполезным сообщением об ошибке, не имея представления о выпуске какого продукта:

Не удалось выполнить цель org. apache .maven.plugins: maven -compiler-plugin: 3.8.1: compile (default-compile) в проекте Invoicer: фатальная ошибка компиляции

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Флаг release эквивалентен указанию источника и цели одного и того же значения для плагина компилятора. Он поддерживает аргумент -release для компилятора Java, начиная с Java -9.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>14</source>
        <target>14</target>
    </configuration>
</plugin>

Примечание : по той же причине вы можете избавиться от избыточных свойств объявлен как

<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>

Далее : Что такое флаг --release в компиляторе Java 9? | Флаг -release в javac был добавлен в Компиляция для более старых версий платформы .


Чтобы завершить ответ над частью, в которой вы пробовали версию значение как 28. При использовании версии Maven -

Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T00:30:29+05:30)

Сообщение об ошибке очень четко показывает, что следует (если вы могли бы поделиться полными журналами в вопросе)

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project forty-bits-of-java: 
Fatal error compiling: error: release version 28 not supported 
1 голос
/ 28 марта 2020

На странице параметров компиляции *1001* указано, что это заканчивается как аргумент -release, передаваемый javac.

И примерно --release release:

Компилируется на основе публикуемого c, поддерживаемого и документированного API для указанной c версии VM. Поддерживаемые цели выпуска - 6, 7, 8 и 9.

Насколько я понимаю, Java 9 представила функцию, которая помогает разработчикам опираться на недавний компилятор, ориентируясь на более раннюю среду выполнения, но на в то же время предотвращается старая проблема, которая позволяет скомпилировать код со ссылками на новые API, в то же время ориентируясь на старые среды выполнения. Пример: если вы используете Java 8 для компиляции кода, который использует новые API Java 8 (например, Collection.stream()), с целью 1.7, этот код компилируется, но не выполняется во время выполнения на Java 7 с NoSuchMethodError. В JDK 9, если вы используете --release 1.7, компилятор будет знать, что Collection.stream() не может быть правильно нацелен на Java 7, и потерпит неудачу при сборке.

...