Як вказати версію компілятора 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.
Луїджі Мендоса

За замовчуванням java OpenJDK - 1,3, де для Oracle JDK - 1,5
Thorbjørn Ravn Andersen

Обидва вони передували мені, як програміст!
CorayThan

Відповіді:


307
<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.
Вім Деблауве

2
Версія плагіна відсутня. Це не призведе до помилки, але настійно рекомендується встановити версію там. Поточна версія - 3.3
Лукас Вернер

1
@LukasWerner Ви маєте рацію, звичайно. але якщо я додаю версію, мені доведеться редагувати питання кожні кілька місяців. пішов на компроміс :-)
Шон Патрік Флойд

БУДЬШЕ роз’ясніть ... Що входить у цей тег <version> (яка версія є поточною) </version>? Це щось на зразок 1,7?
Ілля

2
@Elijah ні, це була б версія мови 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, відкривши файл пам’яті проекту як новий проект, який, я вважаю, відтворив проект.
користувач674669

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.targetвластивостей для визначення 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наразі останньої буде недостатньо, оскільки використовувана вами версія за замовчуванням не покладається на досить недавню версію.

У Maven releaseаргумент транспортує release: а новий JVM стандартний варіант , який ми могли б перейти від Java 9:

Компілюється проти загальнодоступного, підтримуваного та документованого API для певної версії VM.

Цей спосіб забезпечує стандартний спосіб вказати ту саму версію для параметрів source, targetта bootstrapJVM.
Зауважте, що вказати значення 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

Я зіткнувся з таким же питанням у проекті eclipse neon simple maven java

Але я додаю нижче деталі всередині файлу 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> оновити проект (перевірено сила оновлення)

Це вирішує мене відобразити помилку на проекті

Сподіваюся, це стане в нагоді

Танськ


Це працювало для мене, коли я намагався створити додаток SqlServerSample для драйвера Microsoft JDBC для SQL Server.
skye --- капітан

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.