无法执行maven-compiler-plugin:3.6.1:使用java 9时的testCompile

我知道有很多类似错误的问题。 我希望在重点之前考虑到它只发生在Java 9中。

我确实安装了java 9

C:\_pocs\ws_j9\java9-http-client>java -version java version "9.0.1" Java(TM) SE Runtime Environment (build 9.0.1+11) Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode) C:\_pocs\ws_j9\java9-http-client>echo %JAVA_HOME% C:\Program Files\Java\jdk-9.0.1 

为了简化示例,如果我下载一个非常简单的示例https://examples.javacodegeeks.com/core-java/java-9-httpclient-example/ ,我尝试/

mvn clean install package -e

 [ERROR] Failed to parse module-info: [ERROR] With qdox: null [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.925 s [INFO] Finished at: 2018-01-01T23:43:32+01:00 [INFO] Final Memory: 13M/44M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:testCompile (default-testCompile) on project http_client: Execution default-testCompile of goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:testCompile failed: Failed to parse module-info -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:testCompile (default-testCompile) on project http_client: Execution default-testCompile of goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:testCompile failed: Failed to parse module-info at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213) 

的pom.xml

  4.0.0 com.javacodegeeks.java9 http_client 0.0.1-SNAPSHOT Java9HttpClient Java Http Client example  1.9 3.6.1 3.0.0      org.apache.maven.plugins maven-compiler-plugin ${maven-compiler-plugin-version}   org.apache.maven.plugins maven-shade-plugin ${maven-shade-plugin-version}      org.apache.maven.plugins maven-compiler-plugin  ${java-version} ${java-version} true    org.apache.maven.plugins maven-shade-plugin   package  shade     com.javacodegeeks.java9.http_client.Main          

可能导致这个问题的我有点困惑。 最重要的是,我面临的另一个挑战是让第一次尝试使用Java 9的人更难:我的Eclipse没有正确接受Java 9.我尝试在Eclipse Oxygen中安装Java 9 Support我刚下载它但我得到“在http://download.eclipse.org/eclipse/updates/none找不到存储库”。 我不能让这个mvn插件将Java版本更新为9(它曾经适用于Java <1.8:

   1.9 ...  org.apache.maven.plugins maven-compiler-plugin  ${java-version} ${java-version} true   

这就是我试图从命令行编译straich的原因。

我读到Java 9带有新的模块化概念,这将有助于我们更好地组织软件包,但如果这可以促使我解决我的问题,我非常感兴趣。 当有人看到“无法解析模块信息”时,这可能是一个明显的解决方案,但我无法想象任何有用的尝试。

我的直接问题是我可以检查以便编译。 关于使Eclipse Oxygen当前版本与Java 9兼容的另一个技巧也将是值得赞赏的。

  • 编辑

在此处输入图像描述

不到24小时前为Windows下载的Eclipse版本:

面向Web开发人员的Eclipse Java EE IDE。

版本:Oxygen.2发行版(4.7.2)版本号:20171218-0600

  • 第二次编辑

在我从1.9更改为9之后,红色错误图标消失了,我现在有了Java 9.然而,现在我收到了这个错误:

 [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? [INFO] 1 error [INFO] ------------------------------------------------------------- [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.542 s [INFO] Finished at: 2018-01-02T05:19:30+01:00 [INFO] Final Memory: 9M/30M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project http_client: Compilation failure [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 

这对我没有意义,因为:

在此处输入图像描述

  • 编辑第三次

在此处输入图像描述

简而言之,添加一个名为module-info.java的缺失/错位的类,以在项目的源根中包含项目的模块声明。 (例如src/main/java

另外,请注意升级到 maven-compiler-plugin 3.7.0版本 ,以防你module-info类中包含注释 。 [日志似乎与此非常相关。]


或者另一方面,如果您希望使用以前版本的Java编译项目,请使用release标志:

  org.apache.maven.plugins maven-compiler-plugin 3.7.0  8 true   

概念

随着Java9标志着Jigsaw项目的完成,其中引入了Java平台模块系统(JPMS) ,基于Java 9及更高版本构建的项目将被模块化 。 这将包括一个名为module-info.class的主编译类,它是该模块的声明 。

最初的草案以及最终的模块系统状态描述了所遵循和实践的概念。


关于使Eclipse Oxygen当前版本与Java 9兼容的另一个技巧

AFAIK 最新的Oxygen版本(此时为Oxygen.2)意味着Java9兼容,不再需要任何额外的插件支持。


其他有用的资源:

  • JDK9迁移指南

  • Maven编译器插件的模块信息包含和排除示例