Подтвердить что ты не робот

Maven не может скомпилировать java 1.8

Я пытаюсь использовать maven для сборки jar, но я продолжаю получать ошибку

ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile 
(default-compile) on project Application: Fatal error compiling: invalid target release: 1.8 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

mvn -v выходы

mvn -version
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T09:29:23-08:00)
Maven home: /usr/local/Cellar/maven/3.2.5/libexec
Java version: 1.6.0_65, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: MacRoman
OS name: "mac os x", version: "10.10.1", arch: "x86_64", family: "mac"

Итак, похоже, что он указывает на 1.6jdk

но у меня есть 1.8 jdk

java -version

java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

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.brian.ridecellchallenge</groupId>
    <artifactId>Application</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.6</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.group.id.Launcher1</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>


    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>
</project>
4b9b3361

Ответ 1

Maven полагается на заданную переменную среды JAVA_HOME. Установите его в соответствии с вашей ОС и повторите запуск сборки.

Изменить: Используйте экспорт, чтобы установить переменную.

export JAVA_HOME=/path/to/java

Ответ 2

Как пользователь MacOS откройте Terminal и создайте или отредактируйте файл .bash_profile (в каталоге вашего дома пользователя) и разместите там следующий фрагмент:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

Сохраните этот файл и снова откройте экземпляр терминала. Если вы выполняете export в качестве команды там, вы должны увидеть действительный JAVA_HOME с расположением вашей установки JDK 8. После этого перезапустите свою среду IDE, и maven сможет создать хороший код java target 1.8.

Ответ 3

вы можете попробовать настроить в плагине компилятора. Его работа над моим местным

      <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <executable><!--path-to-your-java8-home-directoru--></executable>
                <compilerVersion>1.8</compilerVersion>
            </configuration>
        </plugin>

Ответ 4

Потому что Maven не знает версию jdk, которую вы хотите создать. Вы можете попробовать

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

Ответ 5

Я заметил, что кажется, что maven-compiler-plugin игнорирует конфигурации

<source>1.8</source>
<target>1.8</target>

На самом деле, построив мой проект с опцией -X maven, я вижу, что в конфигурации плагина maven-compiler источник и цель были вынуждены быть 1.6:

[DEBUG] --------------------------------------------------------------
[DEBUG] Goal:          org.apache.maven.plugins:maven-compiler-plugin:3.3:testCompile (default-testCompile)
[DEBUG] Style:         Regular
[DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <basedir default-value="${basedir}"/>
 <buildDirectory default-value="${project.build.directory}"/>
 <classpathElements default-value="${project.testClasspathElements}"/>
 <compileSourceRoots default-value="${project.testCompileSourceRoots}"/>
 <compilerId default-value="javac">${maven.compiler.compilerId}</compilerId>
 <compilerReuseStrategy default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}    </compilerReuseStrategy>
 <compilerVersion>${maven.compiler.compilerVersion}</compilerVersion>
 <debug default-value="true">${maven.compiler.debug}</debug>
 <debuglevel>${maven.compiler.debuglevel}</debuglevel>
 <encoding default-value="${project.build.sourceEncoding}">UTF-8</encoding>
 <executable>${maven.compiler.executable}</executable>
 <failOnError default-value="true">${maven.compiler.failOnError}</failOnError>
 <forceJavacCompilerUse default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
 <fork default-value="false">${maven.compiler.fork}</fork>
 <generatedTestSourcesDirectory default-value="${project.build.directory}/generated-test-sources/test-annotations"/>
 <maxmem>${maven.compiler.maxmem}</maxmem>
 <meminitial>${maven.compiler.meminitial}</meminitial>
 <mojoExecution default-value="${mojoExecution}"/>
 <optimize default-value="false">${maven.compiler.optimize}</optimize>
 <outputDirectory default-value="${project.build.testOutputDirectory}"/>
 <project default-value="${project}"/>
 <session default-value="${session}"/>
 <showDeprecation default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
 <showWarnings default-value="false">${maven.compiler.showWarnings}</showWarnings>
 <skip>${maven.test.skip}</skip>
 <skipMultiThreadWarning default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
 <source default-value="1.5">1.6</source>
 <staleMillis default-value="0">${lastModGranularityMs}</staleMillis>
 <target default-value="1.5">1.6</target>
 <testSource>${maven.compiler.testSource}</testSource>
 <testTarget>${maven.compiler.testTarget}</testTarget>
 <useIncrementalCompilation default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
  <verbose default-value="false">${maven.compiler.verbose}</verbose>

Я решил проблему после многого поиска и попыток, заставив java-компилятор использовать желаемый источник и цель:

<compilerArguments>
  <source>1.8</source>
  <target>1.8</target>
</compilerArguments>

Это добавляет к параметрам javac два параметра выше, перезаписывая значение по умолчанию.

В моем случае все работает хорошо.

Просто примечание: я вижу, что с указанной конфигурацией maven вызывает javac таким образом:

-d [...] -g -nowarn -target 1.6 -source 1.6 -encoding UTF-8 -source 1.8 -target 1.8

Первые два параметра "-source" и "-target" являются параметрами по умолчанию, которые использует maven-компилятор-плагин; вторая пара параметров - это параметры, добавленные плагином из-за описанной выше конфигурации "compilerArguments". Кажется, что javac просто использует последние пару параметров (если параметр повторяется больше времени, последний перезаписывает все предыдущие), но я не уверен, что это можно считать стандартным и "уверенным" поведением.

Я использовал разные версии maven-compiler-plugin, другую версию maven. Я проверил все мои конфигурации (например, системные переменные, каждый script, используемый при выполнении java или maven и т.д.), И я уверен, что все в порядке.

Странно, но я пришел к выводу, что в maven-компилятор-плагине есть ошибка в java 8.

Ответ 6

Я не уверен, но вы можете попробовать обновить версию maven.plugin

попробовать

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

Ответ 7

Если у кого-то есть Eclipse Kepler SR2 и проблема с Java 1.8 при построении проекта с Maven, попробуйте перейти на Eclipse Marketplace и найти плагин под названием Поддержка Java 8 для m2e для Eclipse Kepler SR2. помог мне, и теперь Maven компилирует источник Java 1.8 без проблем.

Ответ 8

Да, это похоже на ошибку в maven-compiler-plugin. Когда я обновился с 3.1 до 3.5.1, он работает.