Что заставляет импортированный проект Maven в Eclipse по умолчанию использовать Java 1.5 вместо Java 1.6 и как я могу гарантировать, что это не так?

209

Я импортировал проект Maven, и он использовал Java 1.5, хотя в качестве Eclipse по умолчанию я настроил 1.6 Preferences->Java->Installed JREs.

Когда я изменил проект Maven для использования 1.6 JRE, у него все еще оставались ошибки сборки, оставшиеся с того момента, когда проект использовал Java 1.5 (я описывал эти ошибки сборки ранее: у меня есть ошибки сборки с m2eclipse, но не с maven2 в командной строке - мой m2eclipse неправильно настроен? )

Я собираюсь удалить проект и попробовать еще раз, но на этот раз я хочу убедиться, что он использует Java 1.6 с самого начала, чтобы увидеть, устраняет ли это проблемы со сборкой.

Как мне убедиться, что проект использует Java 1.6 при импорте?

Крис Коллинз
источник
4
m2eclipse игнорирует то, что вы конфигурируете для Eclipse по умолчанию. Он всегда будет использовать 1,5 по умолчанию. Однако в вашем случае проект использует плагин maven-compiler-plugin и явно устанавливает версию 1.5. Вам нужно будет изменить это в pom и обновить конфигурацию проекта, чтобы изменить версию. Однако я уже попробовал это, и у меня это не сработало. Я почти уверен, что это не проблема, несмотря на то, что другие говорили на ваш другой вопрос.
Рауль Герцог
1
Нет, m2eclipse не всегда будет по умолчанию равным 1,5, это будет значение по умолчанию для настроек maven-compiler-plugin.
Паскаль Тивент
1
Как вы измените настройки maven-compiler-plugin?
Lokathor

Ответы:

248

Плагин m2eclipse не использует значения по умолчанию Eclipse, плагин m2eclipse получает настройки из POM. Поэтому, если вы хотите, чтобы проект Maven был настроен на использование параметров Java 1.6 при импорте в Eclipse, настройте его maven-compiler-pluginсоответствующим образом, как я уже предлагал:

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

Если ваш проект уже импортирован, обновите конфигурацию проекта ( щелкните правой кнопкой мыши проект, затем Maven V Обновить конфигурацию проекта ).

Паскаль Тивент
источник
1
Пожалуйста, не кричите. Это просто грубо. Это сработало после удаления и повторного импорта проекта. Но не иначе.
Рауль Герцог
6
@Raoul Это работает без повторного импорта проекта, если вы обновите конфигурацию проекта, как я написал. Я проверил это 3 раза, и оно просто работает на моей машине.
Паскаль Тивент
Как бы ни был ясен ответ Паскаля (я плюс 1), «обновление конфигурации проекта», похоже, не работает при любых обстоятельствах, так как мне пришлось также удалить проект, и я пробовал много других вещей (возможно, ошибку в версии Eclipse)
rogermushroom
для более новых версий Java, посмотрите этот ответ
Строка
33

Я добавил это в свой pom.xml под описанием проекта, и это сработало:

<properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
</properties>
Hogi
источник
1
Это проще, чем принятый ответ, и также было хорошо для меня.
Кирпич
1
Это сработало для меня, однако принятый ответ не сработал.
Санджай Сингх
1
В чем разница между этим и настройкой maven-compiler-plugin (согласно принятому ответу)? Оба способа работают для меня.
Амир Ризван
Если вы используете Java 9, помните, что нумерация версий изменилась. Поэтому используйте 9 вместо 1,9. <properties> <maven.compiler.source>9</maven.compiler.source> <maven.compiler.target>9</maven.compiler.target> </properties>
Чукс
Я подумал, что установки свойства "java.version" и использования его в конфигурации сборки конфигурации "maven-compiler-plugin" было достаточно. Очевидно, что свойства "maven.compiler.source" и "maven.compiler.target" должны иметь некоторое взаимодействие с плагином Eclipse Maven, так как проблема только что исчезла.
Джейсон Толотта
29

Я хотел добавить что-то к уже предоставленному ответу. maven-compiler-plugin по умолчанию скомпилирует ваш проект с использованием Java 1.5, где m2e получает информацию.

Вот почему вы должны явно объявить maven-compiler-plugin в вашем проекте чем-то отличным от 1.5. Ваша эффективность pom.xmlбудет неявно использовать набор по умолчанию в maven-compiler-plugin pom.xml .

Николас
источник
6
для меня это более четко отвечает "почему это 1,5, когда я делаю новый проект Maven?"
Дон Чидл
1
@LIttleAncientForestKami проверен на 3.7.0, к настоящему времени значения установлены как константы DEFAULT_SOURCEи DEFAULT_TARGET, но все равно оба установлены на 1.5.
Адам Берли
сейчас должно быть 1.6, верно? Интересно, потому что он все еще использует 1,5 для меня.
Линия
@ Line: Нет, вероятно, это будет 1,5 до конца известного maven-стиха, так как супер эффективный родительский пом никогда не должен меняться.
Николай
Это ирония? ;) Сайт, на который есть ссылка в ответе, говорит: «Также обратите внимание, что в настоящее время исходный параметр по умолчанию равен 1.6, а целевой параметр по умолчанию равен 1.6» ..
Строка
27
<project>

    <!-- ... -->

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

</project>
pitchblack408
источник
8
Внутри <build> </ build>
Филипп Камикадзе
мне не нравится этот ответ, потому что это всего лишь код, и я не вижу преимущества перед принятым (может быть, потому что он не описан ..)
строка
8

Вот основная причина Java 1.5:

Также обратите внимание, что в настоящее время настройка источника по умолчанию - 1,5, а настройка цели по умолчанию - 1,5, независимо от JDK, с которым вы запускаете Maven. Если вы хотите изменить эти значения по умолчанию, вы должны установить источник и цель.

Ссылка: плагин компилятора Apache Mavem

Ниже приведены подробности:

Обычный pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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.pluralsight</groupId>
    <artifactId>spring_sample</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

Следующий плагин взят из расширенной версии POM (Effective POM),

Это можно получить с помощью этой команды из командной строки. C:\mvn help:effective-pomЯ просто поместил здесь небольшой фрагмент вместо целого pom.

    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <executions>
      <execution>
        <id>default-compile</id>
        <phase>compile</phase>
        <goals>
          <goal>compile</goal>
        </goals>
      </execution>
      <execution>
        <id>default-testCompile</id>
        <phase>test-compile</phase>
        <goals>
          <goal>testCompile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Даже здесь вы не видите, где определяется версия Java, давайте копать больше ...

Загрузите плагин Apache Maven Compiler Plugin »3.1, который доступен в jar, и откройте его в любом инструменте сжатия файлов, например 7-zip.

Пройдите через банку и узнайте

plugin.xml

файл внутри папки

Maven-компилятор-плагин-3.1.jar \ META-INF \ Maven \

Теперь вы увидите следующий раздел в файле,

      <configuration>
    <basedir implementation="java.io.File" default-value="${basedir}"/>
    <buildDirectory implementation="java.io.File" default-value="${project.build.directory}"/>
    <classpathElements implementation="java.util.List" default-value="${project.testClasspathElements}"/>
    <compileSourceRoots implementation="java.util.List" default-value="${project.testCompileSourceRoots}"/>
    <compilerId implementation="java.lang.String" default-value="javac">${maven.compiler.compilerId}</compilerId>
    <compilerReuseStrategy implementation="java.lang.String" default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}</compilerReuseStrategy>
    <compilerVersion implementation="java.lang.String">${maven.compiler.compilerVersion}</compilerVersion>
    <debug implementation="boolean" default-value="true">${maven.compiler.debug}</debug>
    <debuglevel implementation="java.lang.String">${maven.compiler.debuglevel}</debuglevel>
    <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}">${encoding}</encoding>
    <executable implementation="java.lang.String">${maven.compiler.executable}</executable>
    <failOnError implementation="boolean" default-value="true">${maven.compiler.failOnError}</failOnError>
    <forceJavacCompilerUse implementation="boolean" default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
    <fork implementation="boolean" default-value="false">${maven.compiler.fork}</fork>
    <generatedTestSourcesDirectory implementation="java.io.File" default-value="${project.build.directory}/generated-test-sources/test-annotations"/>
    <maxmem implementation="java.lang.String">${maven.compiler.maxmem}</maxmem>
    <meminitial implementation="java.lang.String">${maven.compiler.meminitial}</meminitial>
    <mojoExecution implementation="org.apache.maven.plugin.MojoExecution">${mojoExecution}</mojoExecution>
    <optimize implementation="boolean" default-value="false">${maven.compiler.optimize}</optimize>
    <outputDirectory implementation="java.io.File" default-value="${project.build.testOutputDirectory}"/>
    <showDeprecation implementation="boolean" default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
    <showWarnings implementation="boolean" default-value="false">${maven.compiler.showWarnings}</showWarnings>
    <skip implementation="boolean">${maven.test.skip}</skip>
    <skipMultiThreadWarning implementation="boolean" default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
    <source implementation="java.lang.String" default-value="1.5">${maven.compiler.source}</source>
    <staleMillis implementation="int" default-value="0">${lastModGranularityMs}</staleMillis>
    <target implementation="java.lang.String" default-value="1.5">${maven.compiler.target}</target>
    <testSource implementation="java.lang.String">${maven.compiler.testSource}</testSource>
    <testTarget implementation="java.lang.String">${maven.compiler.testTarget}</testTarget>
    <useIncrementalCompilation implementation="boolean" default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
    <verbose implementation="boolean" default-value="false">${maven.compiler.verbose}</verbose>
    <mavenSession implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
    <session implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
  </configuration>

Посмотрите на приведенный выше код и найдите следующие 2 строки

    <source implementation="java.lang.String" default-value="1.5">${maven.compiler.source}</source>
    <target implementation="java.lang.String" default-value="1.5">${maven.compiler.target}</target>

Удачи.

жулик
источник
1
Да. Это не имеет ничего общего с Eclipse. Например, вы получаете ту же проблему в IntelliJ IDEA, если создаете проект Maven с quickstartартефактом.
Ян Хеттих
Привет, спасибо за публикацию основной причины проблемы :) Я действительно ценю это!
IanGabes
6

Ваш JRE, вероятно, был определен в конфигурации запуска. Выполните следующие действия в Eclipse, чтобы изменить сборку JRE.

1) Щелкните правой кнопкой мыши по проекту и выберите « Запуск от имени» > « Выполнить настройки».

2) В окне Run Configurations выберите конфигурацию сборки вашего проекта на левой панели. Справа вы увидите различные вкладки: Main, JRE, Refresh, Source, ...

3) Нажмите на вкладку JRE, вы должны увидеть что-то вроде этого

введите описание изображения здесь

4) По умолчанию будет использоваться JRE для работы по умолчанию (JRE, которое вы выбираете по умолчанию в разделе « Настройки» -> «Java -> Установленные JRE» ). Если вы хотите использовать другую установленную JRE, установите флажок « Альтернативная JRE» и выберите предпочитаемую JRE из раскрывающегося списка.

Тони Ву
источник
Спасибо за этот ответ, моя конфигурация запуска работала с рабочим пространством по умолчанию, так что это действительно помогло!
Дамир Циганович-Янкович
Это помогло, не могу поверить, что мы упустили это из виду!
Фил oO
3

Самое простое решение в Springboot

Я дам вам самый простой, если вы используете Springboot:

<properties>
  <java.version>1.8</java.version>
</properties>

Затем щелкните правой кнопкой мыши ваш проект Eclipse: Maven> Обновить проект> Обновить конфигурацию проекта из pom.xml

Это должно сделать.

sancho21
источник
2

Настройки проекта

Еще одно место, где это может пойти не так, это в настройках проекта, в Eclipse.

  1. Свойства проекта: щелкните ваш проект и один из следующих:

    • Alt + Enter
    • Меню> Проект> Свойства
    • щелкните правой кнопкой мыши ваш проект> свойства проекта (последний пункт в меню)
  2. нажмите на «Java Compiler»

  3. Снимите флажок «Включить конкретные настройки проекта» (или измените их все вручную).

Из-за требований клиентов они позволили нам сохранить наши проекты в версии 1.6. Когда нужно было обновить до 1.7, у нас были трудные времена, потому что нам нужно было повсеместно менять версию Java:

  • проект POM
  • Eclipse Workspace default
  • настройки проекта
  • выполнение виртуальной машины (1.6 использовался для всего)
manuelvigarcia
источник
1

Еще одна возможная причина, если вы используете Tycho и Maven для сборки пакетов, что у вас неправильная среда исполнения ( Bundle-RequiredExecutionEnvironment) в определенном файле манифеста ( manifest.mf). Например:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Engine Plug-in
Bundle-SymbolicName: com.foo.bar
Bundle-Version: 4.6.5.qualifier
Bundle-Activator: com.foo.bar.Activator
Bundle-Vendor: Foobar Technologies Ltd.
Require-Bundle: org.eclipse.core.runtime,
 org.jdom;bundle-version="1.0.0",
 org.apache.commons.codec;bundle-version="1.3.0",
 bcprov-ext;bundle-version="1.47.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.5
Export-Package: ...
...
Import-Package: ...
...

В моем случае все остальное было в порядке. Плагины компилятора (в том числе обычный maven и tycho) были установлены правильно, все еще m2 генерировали старый уровень соответствия из-за манифеста. Я думал, что делюсь опытом.

Габор Липтак
источник
1

Я обнаружил, что моя проблема была в том, что кто-то зафиксировал файлы .project и .classpath, которые имели ссылки на Java1.5 в качестве JRE по умолчанию.

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
    <attributes>
        <attribute name="owner.project.facets" value="java"/>
    </attributes>
</classpathentry>

Закрыв проект, удалив файлы, а затем повторно импортировав его как проект Maven, я смог правильно настроить проект для использования рабочей области JRE или соответствующего jdk, не возвращаясь к 1.5. Таким образом, избегайте проверки в вашем SVN файлов .project и .classpath

Надеюсь, что это помогает другим.

iowatiger08
источник
0

Если вы хотите убедиться, что вновь созданные или импортированные проекты в Eclipse используют другую версию Java по умолчанию, чем Java 1.5, вы можете изменить конфигурацию в maven-compiler-plugin.

  • Перейдите в папку .m2 / repository / org / apache / maven / plugins / maven-compiler-plugin / 3.1
  • Откройте maven-compiler-plugin-3.1.jar с помощью zip-программы.
  • Перейдите в META-INF / maven и откройте plugin.xml.
  • В следующих строках:
    <исходная реализация = "java.lang.String" default-value = "1.5"> $ {maven.compiler.source} </ source>
    <целевая реализация = "java.lang.String" default-value = "1.5"> $ {maven.compiler.target} </ цель>

  • измените значение по умолчанию на 1.6 или 1.8 или что угодно.

  • Сохраните файл и убедитесь, что он записан обратно в zip-файл.

Отныне все новые проекты Maven используют указанную вами версию Java.

Информация взята из следующего сообщения в блоге: https://sandocean.wordpress.com/2019/03/22/directly-generating-maven-projects-in-eclipse-with-java-version-newer-than-1-5/

user1201626
источник
0

Чтобы изменить версию JDK, вы можете сделать:

1- Проект> Свойства
2- Перейдите в Путь сборки Java
3- В библиотеках выберите Система JRE ... и нажмите Редактировать
4- Выберите подходящую версию и подтвердите

Achref EL Mouelhi
источник