Невозможно скомпилировать простой проект Java 10 / Java 11 с Maven

134

У меня есть тривиальный проект Maven:

src
└── main
    └── java
        └── module-info.java
pom.xml

pom.xml:

<groupId>org.example</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>example</name>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <release>10</release>
            </configuration>
        </plugin>
    </plugins>
</build>

Когда я строю проект через mvn -X install -DskipTests=true, он терпит неудачу:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project example: Execution default-testCompile of goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile failed.
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default-testCompile of goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile failed.
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:145)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
        ... 20 more
Caused by: java.lang.IllegalArgumentException
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.codehaus.plexus.languages.java.jpms.AsmModuleInfoParser.parse(AsmModuleInfoParser.java:80)
        at org.codehaus.plexus.languages.java.jpms.AsmModuleInfoParser.getModuleDescriptor(AsmModuleInfoParser.java:54)
        at org.codehaus.plexus.languages.java.jpms.LocationManager.resolvePaths(LocationManager.java:83)
        at org.apache.maven.plugin.compiler.TestCompilerMojo.preparePaths(TestCompilerMojo.java:281)
        at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:762)
        at org.apache.maven.plugin.compiler.TestCompilerMojo.execute(TestCompilerMojo.java:176)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
        ... 21 more

Есть ли способ это исправить?

ZhekaKozlov
источник
1
@MikhailKholodkov Ошибка устранена, и теперь можно использовать ее maven-compiler-plugin:3.8.0для исправления вышеуказанной ошибки .
Наман

Ответы:

164

Начиная с 30 июля 2018 года, чтобы исправить вышеуказанную проблему, можно настроить версию Java, используемую в Maven, на любую версию до JDK / 11 и использовать maven-compiler-plugin:3.8.0для указания версии 9,10,11 без каких-либо явных зависимостей .

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>11</release>  <!--or <release>10</release>-->
    </configuration>
</plugin>

Примечание : - Значение по умолчанию для источника / цели было поднято с 1,5 до 1,6 с этой версией. - заметки о выпуске.


Редактировать [30.12.2018]

Фактически, вы можете использовать ту же версию maven-compiler-pluginпри компиляции кода и для JDK / 12.

Подробнее и пример конфигурации о том, как скомпилировать и выполнить функцию предварительного просмотра JDK с Maven .

Naman
источник
6
Это работает только из коробки, когда maven выполняется с Java 11. Если версия Java для вашей платформы, например, Java 8 (и поэтому maven выполняется с Java 8), вам нужно определить набор инструментов maven.apache.org/guides/mini /guide-using-toolchains.html
Франц
8
Обратите внимание, что соответствующее свойство maven.compiler.release:<properties><maven.compiler.release>11</maven.compiler.release></properties>
Оливье Грегуар
@ OlivierGrégoire - Итак, мы можем заменить этот код на тот, который вы дали? <properties> <maven.compiler.target> 1.8 </maven.compiler.target> <maven.compiler.source> 1.8 </maven.compiler.source> </ properties>
MasterJoe
1
@ MasterJoe2 Да, вы должны это сделать, если вы переходите на Java-11.
Наман
136

ОБНОВИТЬ

Ответ сейчас устарел. Смотрите этот ответ .


maven-compiler-pluginзависит от старой версии ASM, которая еще не поддерживает Java 10 (и Java 11). Тем не менее, можно явно указать правильную версию ASM:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <release>10</release>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>6.2</version> <!-- Use newer version of ASM -->
        </dependency>
    </dependencies>
</plugin>

Вы можете найти последнюю версию на https://search.maven.org/search?q=g:org.ow2.asm%20AND%20a:asm&core=gav

ZhekaKozlov
источник
Не могли бы вы рассмотреть вопрос об изменении принятого ответа на предложенный в начале вашего сообщения?
Леопал
24

Повышение вашего maven-compiler-plugin до 3.8.0 кажется необходимым, но не достаточным. Если у вас все еще есть проблемы, вы также должны убедиться, что ваша переменная среды JAVA_HOME установлена ​​на Java 10 (или 11), если вы работаете из командной строки. (Полученное сообщение об ошибке не сообщит вам об этом.) Или, если вы работаете из IDE, вам нужно убедиться, что оно настроено для запуска maven с вашим текущим JDK.

MiguelMunoz
источник
14

Возможно, это не та же самая ошибка, но у меня была похожая ошибка.

Проверьте Maven Java-версию

Поскольку Maven также работает с Java, сначала проверьте, на какой версии работает ваш Maven:

mvn --version | grep -i java 

Возвращает:

Java версия 1.8.0_151, поставщик: Oracle Corporation, среда выполнения: C: \ tools \ jdk \ openjdk1.8

Несовместимая версия

Здесь выше мой мавен бежит с Java Version 1.8.0_151. Так что даже если я укажу maven для компиляции Java 11:

<properties>
    <java.version>11</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

Он логически распечатает эту ошибку:

[ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins: maven-compiler-plugin: 3.8.0: скомпилировать (default-compile) для проекта efa-example-commons-task: Неустранимая ошибка компиляции: недопустимый целевой выпуск: 11 -> [Помощь 1]

Как установить конкретную версию Java для Maven

Логическая вещь, которую нужно сделать, это установить более высокую версию Java в Maven (например, версия Java 11 вместо 1.8).

Maven использует переменную окружения, JAVA_HOMEчтобы найти версию Java для запуска. Поэтому измените эту переменную на JDK, с которым вы хотите скомпилировать (например, OpenJDK 11).

Санитарная проверка

Затем запустите еще раз, mvn --versionчтобы убедиться, что о конфигурации позаботились:

mvn --version | grep -i java

доходность

Версия Java: 11.0.2, поставщик: Oracle Corporation, среда выполнения: C: \ tools \ jdk \ openjdk11

Что намного лучше и правильнее для компиляции кода, написанного со спецификациями Java 11.

KeyMaker00
источник
1
Это сработало для меня, также при использовании maven-assembly-plugin версии 3.2.0
Жерар Бинкхорст
13

Укажите maven.compiler.source и целевую версию.

1) Версия Maven, которая поддерживает используемый вами jdk. В моем случае JDK 11 и maven 3.6.0.

2) pom.xml

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

В качестве альтернативы вы можете полностью указать плагин компилятора maven. Смотрите предыдущие ответы. В моем примере он короче :)

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

3) перестройте проект, чтобы избежать ошибок компиляции в вашей среде IDE.

4) Если все равно не работает. В Intellij Idea я предпочитаю использовать терминал вместо терминала из ОС. Затем в Idea перейдите в файл -> настройки -> инструменты сборки -> maven. Я работаю с maven, скачанным с apache (по умолчанию Idea использует связанный maven). Затем перезапустите Idea и mvn clean installснова запустите . Также убедитесь, что у вас правильный путь , переменные среды MAVEN_HOME , JAVA_HOME .

Я тоже видел этот однострочный, но он не работает.

<maven.compiler.release>11</maven.compiler.release>

Я сделал несколько быстрых стартовых проектов, которые я повторно использую в других своих проектах, не стесняйтесь проверить:

Ян Хонски
источник
2

Если вы используете весеннюю загрузку, добавьте эти теги в pom.xml.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

и

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    `<maven.compiler.release>`10</maven.compiler.release>
</properties>

Вы можете изменить версию Java на 11 или 13, а также в <maven.compiler.release>теге.

Просто добавьте теги ниже в pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.release>11</maven.compiler.release>
</properties>

Вы можете изменить 11 на 10, 13, а также изменить версию Java. Я использую Java 13, который является последним. Меня устраивает.

Абхишек
источник
0

Хорошо, так что для меня ничего не сработало.
Я использовал ботинки пружинных с Hibernate. Версия для весенней загрузки была ~ 2.0.1, и я продолжал получать эту ошибку и исключение нулевого указателя при компиляции. Проблема была с Hibernate, который нуждался в повышении версии. Но после этого у меня возникли некоторые другие проблемы, которые, как мне казалось, не обрабатывали аннотации процессора, поэтому я решил просто поднять весну с версии 2.0.1 до версии 2.1.7, и все заработало, как и ожидалось.

Вы все еще должны добавить вышеупомянутый плагин жестко
Надеюсь, это поможет!

тюдоровский
источник