Как указать версию компилятора Java в файле pom.xml?


252

Я написал Maven-код для NetBeans, который имеет примерно более 2000 строк. Когда я компилирую его на netbeans, все в порядке, но если я хочу запустить его из командной строки, я получу следующие ошибки:

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        HashSet<Double> resid_List = new HashSet<Double>(Arrays.asList(resid_val));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        List<Integer> ind_ovlpList = new ArrayList<Integer>(Arrays.asList(ind_ovlp));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
public class ColumnComparator implements Comparator<double[]> {

annotations are not supported in -source 1.3
(use -source 5 or higher to enable annotations)
@Override

Я пытался использовать Java 1.3.1, ошибки компилятора , но я получил больше ошибок. Из других сообщений я обнаружил, что мне следует изменить pom.xml, но я не знаю, как это сделать. Вот мой pom.xml

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany</groupId>
  <artifactId>mavenmain</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>mavenmain</name>
    <url>http://maven.apache.org</url>

   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

   <dependencies>
     <dependency>
       <groupId>junit</groupId>
        <artifactId>junit</artifactId>
       <version>3.8.1</version>
       <scope>test</scope>
     </dependency>
     <dependency>
        <groupId>gov.nist.math</groupId>
        <artifactId>jama</artifactId>
        <version>1.0.2</version>
     </dependency>
   </dependencies>
 </project>

Было бы здорово, если бы вы могли мне помочь.


2
Время обновить версию Java.
Сотириос Делиманолис

5
Обобщения поддерживаются с Java 5. Невозможно заставить их работать до этой версии Java.
Луиджи Мендоса

По умолчанию для OpenJDK javac - 1,3, для Oracle JDK - 1,5
Торбьерн Равн Андерсен,

И то, и другое предшествует тому, что я программист!
CorayThan

Ответы:


308
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>(whatever version is current)</version>
        <configuration>
          <!-- or whatever version you use -->
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>

Смотрите страницу конфигурации для плагина компилятора maven:

http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

Да, и: не используйте Java 1.3.x, текущие версии Java 1.7.x или 1.8.x


4
Вы также можете добавить проверку версии JDK, которую вы используете для запуска Maven с плагином Maven Enforcer: maven.apache.org/enforcer/maven-enforcer-plugin Я считаю это очень удобным, поскольку мне приходится поддерживать различные проекты, которые находятся на разных версиях JDK. Это позволяет избежать компиляции с Java 8, например, в проекте Java 7.
Вим Deblauwe

2
Версия плагина отсутствует. Это не выдаст ошибку, но настоятельно рекомендуется установить версию там. Текущая версия 3.3
Лукас Вернер

1
@LukasWerner ты прав конечно. но если я добавлю версию, мне придется редактировать вопрос каждые несколько месяцев. пошел на компромисс :-)
Шон Патрик Флойд

ПОЖАЛУЙСТА, поясните ... Что входит в этот тег <версия> (какая версия является текущей) </ версия>? Это что-то вроде 1,7?
Илия

2
@ Илия нет, это будет версия на языке Java. Я говорю о версии плагина. Вы можете найти это по этой ссылке: mvnrepository.com/artifact/org.apache.maven.plugins/…
Шон Патрик Флойд,

360

Maven-составитель-плагин он уже присутствует в зависимости иерархии плагинов в pom.xml. Проверьте в эффективном POM.

Для краткости вы можете использовать такие свойства:

<properties>
   <maven.compiler.source>1.8</maven.compiler.source>
   <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Я использую Maven 3.2.5


Какой путь "лучший"? Этот вариант менее многословен по сравнению с выбранным ответом, но он кажется скрытым. Даже документация сайта Maven показывает использование плагина.
mkobit

2
@mkobit Я думаю, это личный выбор. Если мне нужно настроить что-то еще, кроме версии компилятора и исходного кода, я предпочитаю делать это в разделе плагинов.
leocborges

1
Хороший вопрос с «настроить что-то еще». Если я хочу использовать что-то вроде google / подвержено ошибкам , я должен был бы использовать раздел плагинов.
Mkobit

5
Теперь это первый метод на странице документации Maven, который дал @mkobit. Намного приятнее, и вам не нужно закреплять версию плагина компилятора.
Данила Пятов

Это сработало для меня после того, как я воссоздал проект в IntelliJ. Мне пришлось заново открыть проект в IntelliJ, открыв pom-файл проекта как новый проект, который, я предполагаю, воссоздал проект.
user674669

13

Как правило, вы не хотите оценивать только sourceверсию ( javac -source 1.8например), но вы хотите оценить sourceи targetверсию, и ( javac -source 1.8 -target 1.8например).
Обратите внимание, что в Java 9 у вас есть способ передать как информацию, так и более надежный способ совместимости с кросс-компиляцией ( javac -release 9).
Maven, который переносит javacкоманду, предоставляет несколько способов передать все эти стандартные параметры JVM.

Как указать версию JDK?

Использование maven-compiler-pluginили maven.compiler.source/ maven.compiler.targetproperties для указания sourceи targetэквивалентны.

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

и

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

эквивалентны в соответствии с документацией Maven плагина компилятор Так как <source>и <target>элементы в использовании конфигурации компилятор свойства maven.compiler.sourceи , maven.compiler.targetесли они определены.

источник

-sourceАргумент для компилятора Java.
По умолчанию значение: 1.6.
Недвижимость Пользователь: maven.compiler.source.

цель

-targetАргумент для компилятора Java.
По умолчанию значение: 1.6.
Недвижимость Пользователь: maven.compiler.target.

О значениях по умолчанию для sourceи targetобратите внимание, что со 3.8.0времени компилятора maven значения по умолчанию изменились с 1.5на1.6 .

Из maven-compiler-plugin 3.6 у вас есть новый способ указать версию Java

Вы можете использовать в releaseаргумент :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>9</release>
    </configuration>
</plugin>

Вы также можете объявить только свойство пользователя maven.compiler.release:

<properties>
    <maven.compiler.release>9</maven.compiler.release>
</properties>

Но в настоящее время последней будет недостаточно, так как maven-compiler-pluginиспользуемая вами версия по умолчанию не использует достаточно свежую версию.

releaseАргумент Maven передает release: новую стандартную опцию JVM, которую мы могли бы передать из Java 9:

Компилируется с общедоступным, поддерживаемым и документированным API для конкретной версии виртуальной машины.

Таким образом , обеспечивает стандартный способ указать ту же версию для source, в targetи в bootstrapвариантах виртуальной машины Java.
Обратите внимание, что указание параметра bootstrapявляется хорошей практикой для кросс-компиляции, и это не повредит, если вы также не будете делать кросс-компиляции.

Какой лучший способ указать версию JDK?

Для Java 8 и ниже:

Ни maven.compiler.source/ maven.compiler.targetсвойства или использование maven-compiler-pluginлучше. Это ничего не меняет в фактах, так как, наконец, два способа опираются на одни и те же свойства и один и тот же механизм: плагин компилятора ядра maven.

Что ж, если вам не нужно указывать другие свойства или поведение, кроме версий Java, в плагине компилятора, использование этого способа имеет больше смысла, так как это более кратко:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Из Java 9:

releaseАргумент (третий пункт) способ сильно рассмотреть , если вы хотите использовать ту же версию для sourceи target.


10

Я столкнулся с той же проблемой в затмении неоновых простых Java Maven проекта

Но я добавляю ниже детали внутри файла pom.xml

   <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

После щелчка правой кнопкой мыши на проекте> Maven> обновить проект (проверено принудительное обновление)

Я решил показать ошибку на проекте

Надеюсь, это поможет

Thansk


Это сработало для меня, когда я пытался создать приложение SqlServerSample для драйвера JDBC Microsoft для SQL Server.
Скай --- капитан

0
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <fork>true</fork>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin> 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.