Как принудительно выполнить компиляцию с заданным JDK в Maven - PullRequest
2 голосов
/ 19 июня 2020

Я работаю в среде с приложениями, использующими разные версии Java: 7, 8 и новее. Таким образом, разработчики установили несколько JDK, и каждый Maven pom. xml действительно имеет правильные теги <source> и <target>. Однако иногда разработчики непреднамеренно компилируют с использованием JDK более высокого уровня. Таким образом, они могут включать класс Java 8, например java.time.LocalDate, в Java 7, который будет компилироваться, потому что он может разрешить импорт при компиляции. Но когда приложение позже будет перемещено для работы в JRE 7, оно завершится ошибкой, потому что не сможет найти класс Java 8. Можно создать профиль в pom. xml, например:

<profile>
  <id>compiler</id>
    <properties>
      <JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
    </properties>
</profile>

Однако расположение JDK зависит от разработчика, и мне нужен pom. xml, общий для всех.

Итак, возникает вопрос: как заставить Maven использовать данную версию JDK? Не только <source> и <target>, но и сам JDK и в общем c способом не привязан к какому-либо компьютеру.

Ответы [ 2 ]

5 голосов
/ 19 июня 2020

Первоначально я думал, что установки source / target на 1,7 для maven-compiler-plugin будет достаточно, чтобы компиляция не прошла, но если у вас установлен JDK 8, компиляция завершится успешно (странно!).

Что вам действительно нужно, так это maven-enforcer-plugin. См. Конфигурацию ниже, я запустил ее на фазе validate, которая находится непосредственно перед compile:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>3.0.0-M3</version>
            <executions>
                <execution>
                    <id>default-cli</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>enforce</goal>
                    </goals>
                    <configuration>
                        <rules>
                            <requireJavaVersion>
                                <version>[1.7,1.8)</version>
                            </requireJavaVersion>
                        </rules>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Вывод:

[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ compiler-demo ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message:
Detected JDK Version: 1.8.0-152 is not in the allowed range [1.7,1.8).

Вы даже можете установить настраиваемое сообщение, чтобы прояснить ситуацию для ваших коллег, например

<rules>
  <requireJavaVersion>
    <version>[1.7,1.8)</version>
    <message>Project requires JDK 7</message>
  </requireJavaVersion>
</rules>

Вывод:

[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ compiler-demo ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message:
Project requires JDK 7

Просто ради изучения возможностей плагина я попытался проверить, поддерживает ли он несколько диапазоны версий. Он работает (работает с JDK 11, чтобы попробовать):

<requireJavaVersion>
    <version>[1.7,1.8),[9,10)</version>
</requireJavaVersion>

Вывод:

[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ compiler-demo ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message:
Detected JDK Version: 11.0.1 is not in the allowed range [1.7,1.8),[9,10).
0 голосов
/ 19 июня 2020
export JAVA_HOME=..... && mvn clean compile

Это должно гарантировать, что вы используете правильный JDK

...