【问题标题】:Why is javac still need when compiling with maven-compiler-plugin [closed]为什么使用 maven-compiler-plugin 编译时仍然需要 javac [关闭]
【发布时间】:2018-07-21 04:52:55
【问题描述】:

我在maven-compiler-plugin 上读到过这个。在链接页面上,它告诉:

目前,Compiler Plugin 与 javac 编译器工件捆绑在一起,artifactId 为 plexus-compiler-javac,可以看作是 Compiler Plugin 的 POM 中声明的依赖项之一

根据我的理解,我们不再需要本地的javac,比如说在我的本地操作系统上,仅仅JRE而不是JDK就足够了。

我确实尝试删除 JDK 并在我的本地系统上只安装了 JRE。但是,当我尝试使用命令 mvn clean compile 编译 maven 时,出现错误消息 -

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

谁能解释为什么会这样?大概是我的理解有误吧?

【问题讨论】:

  • "据我了解,我们不再需要本地 javac。"好吧,除非你想编译一些东西。
  • @Kayaman 我的理解是:如果我想编译一些东西,plexus-compiler-javac 应该可以用来代替本地的javac
  • 您的理解中有哪一部分是错误的,并且基于错误的假设(基于误读了文档)?
  • “与此插件的名称相反,Compiler Plugin 不会自行编译项目的源代码”的哪一部分您不明白吗?这是您引用的文档的第一行。
  • 阅读整个文档以便下次理解。重点是我的; 与此插件的名称相反,Compiler Plugin 不会自行编译项目的源代码。 为了进行编译,Compiler Plugin 使用另一个类来编译它们。参数 compilerId 确定将使用哪个类。目前,Compiler Plugin 与 javac 编译器工件捆绑在一起,artifactId 为 plexus-compiler-javac,可以看作是 Compiler Plugin 的 POM 中声明的依赖项之一。

标签: java maven javac maven-compiler-plugin


【解决方案1】:

来自the documentation

Plexus 编译器

Plexus Compiler 是一个 Plexus 组件,用于使用不同的编译器 通过统一的 API。

与此插件的名称相反,Compiler Plugin 不会自行编译项目的源代码。

所以plexus-compiler-javac 工件必须被视为wrapper 才能编译。
没有说明它包含javac 程序。

确切地说,从 3.0 版本开始,默认使用的不再是直接javac,而是javax.tools(尤其是javax.tools.JavaCompiler)。
maven-compiler-plugin 文档确实指出:

自 3.0 起,默认编译器为 javax.tools.JavaCompiler(如果您 正在使用 java 1.6) 并用于编译 Java 源代码。如果你想 要强制使用javac 插件,您必须配置插件选项 forceJavacCompiler使用

您必须了解 Maven 核心插件不会重新发明轮子并猜测您需要什么。
要编译 Java 类,您需要 Java 编译器,并且通常您希望能够确保使用特定的 Java 编译器作为操作系统和 Java 版本问题。
因此,maven 编译器插件需要并在后台使用 JDK。

【讨论】:

  • 我们使用纯 JRE(没有 javac)和 plexus Eclipse 编译器插件对 Maven 进行了编译——这回到了 3.5 版左右。对于真正需要长期支持的项目,这是一个可行的选择。
  • @ThorbjørnRavnAndersen - 这是因为 Eclipse 在旧版本中包含了它自己的 非标准 编译器。 Maven 从未包含javac。现在不确定,因为 Intellij 一出来我就切换到了。
  • @JarrodRoberson 我不确定“非标准”编译器是否正确。他们自己编写,但字节码格式定义明确,因此通常哪个编译器完成工作并不重要。那些在 Eclipse 中工作的人一直都在使用它。 stackoverflow.com/a/33165304/53897 演示了如何在 maven 中使用它。另一个特性是它允许使用 Java 的新版本编译非常旧的代码,而 javac 不再需要。我也不提倡;编译器的竞争是健康的。
【解决方案2】:

Maven 不是 java 编译器。 Maven 为您运行 java 编译器并配置所有路径。

当您运行 mvn -X compile 时,您将看到编译器详细信息。

总结:你需要安装一个 java 编译器来编译 java - 即使 maven 为你启动编译器。

【讨论】:

  • 首先感谢您的回答 :) 那么 maven-compiler-plugin 中的plexus-compiler-javac 依赖项的目的是什么?在我看来,plexus-compiler-javac 应该可以用来代替本地的javac。但似乎我的理解是错误的。如果我错了,我希望任何人都可以帮助修改我的理解:)
  • NO 工件是支持javac 的工件,它没有说明包含javac 可执行文件,这在平台中立的方式中是不可能的。想一想,使用一些常识。
  • @JarrodRoberson 我的母语不是英语,但是当我看到“插件与javac 捆绑在一起”时,我觉得javac 也可能提供插件,并不是说它只是使用可用的javac
  • @Pshemo 还有很多东西要看。请参阅他引用的文档的第一行
  • @Pshemo - 你喜欢 OP 正在参与完整的句子和内容段落。这是完整的上下文; 与此插件的名称相反,Compiler Plugin 不会自行编译项目的源代码。 为了进行编译,Compiler Plugin 使用另一个类来编译它们。参数 compilerId 确定将使用哪个类。目前,Compiler Plugin 与 javac 编译器工件捆绑在一起,artifactId 为 plexus-compiler-javac,可以看作是 Compiler Plugin 的 POM 中声明的依赖项之一。
猜你喜欢
  • 1970-01-01
  • 2021-04-18
  • 2021-02-07
  • 2018-11-25
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
相关资源
最近更新 更多