【问题标题】:How to make IntelliJ IDEA use javac for Java and scalac for Scala?如何让 IntelliJ IDEA 对 Java 使用 javac,对 Scala 使用 scalac?
【发布时间】:2013-10-06 10:13:56
【问题描述】:

在我的 IDEA 项目中,Scala 模块依赖于 Java 模块。当我尝试编译 Scala 模块时,只会触发 scalac。它编译 Java 和 Scala 源代码。

我希望 scalac 只编译 Scala 模块,因为 javac 对于 Java 源代码要快得多(而且我的 Java 项目很大)。 如何让IDEA对不同的模块使用不同的编译器?


我的解决方法是(对于 Java 模块的每个依赖项):

  1. 在项目配置中删除模块依赖
  2. 将依赖添加到适当的编译输出目录“MyJavaModule/target/classes”

显然我对此并不满意,因为每次我重新导入 Maven 项目时,我都需要重复所有这些以进行快速编译。我希望有人知道更好的方法。


澄清:我想强调,像 SBT 或 Maven 这样的工具并不能解决我的问题。这不仅仅是编译。它是关于 IDEA 中的编译,是 Scala Worksheet 或从 IDEA 运行单元测试所必需的。我的目标是在 SBT 的编译速度下拥有全方位的 IDEA 细节(语法高亮、智能自动完成、自动导入等)。现在我不得不忍受较长的编译时间(由于对我的 Java 模块的依赖),或者在 SBT 中使用准系统 REPL 和测试。

【问题讨论】:

  • 为什么编译工具很重要?
  • 因为如果我想在其中运行测试或 Scala Worksheet,IDEA 需要自己进行编译。我想要它,因为它比 SBT 控制台更有效。此外,工具很重要,因为编译速度取决于它。
  • 语法高亮、自动完成、自动导入不依赖于IDEA进行编译。这些东西是从源代码的内部派生索引中删除的。除了工作表功能之外,您还可以使用 SBT 定义您的项目并使用 sbt-idea 插件生成 IDEA 项目定义文件。单元测试在 SBT 中同样快(可能更快),只需执行~test 即可完全自动化(由 IDEA 中的 Save 命令触发)。
  • 我同意,如果不介意在窗口之间切换,SBT 非常适合单元测试(您不是每次都必须运行整个测试套件吗?)。虽然 SBT REPL 显然比 IDEA Scala Console 差。如果我想使用 IDEA Scala 控制台,仍然需要通过 IDEA 进行编译,除非可以以某种方式将其关闭。我还没有找到这样的选择......哦,等等......我刚刚找到它......哇!只需在运行配置中删除“make”步骤。当然现在这意味着我需要完全从 Maven 切换到 SBT :) 但我认为我会那样做 :)
  • 上一条评论的溢出:如果有一个单独的窗口对你来说有点麻烦,你可以使用 IDEA 的 SBT 插件,它将 SBT 的操作集成在一个 IDEA 窗口中。这(对我来说)有一个很大的优势:来自编译器(和测试?)的错误超链接到源代码。

标签: java scala compiler-construction compilation intellij-idea


【解决方案1】:

您应该考虑使用 Apache Ivy 或 Apache Maven 等依赖管理套件。然后将您的 Java 源代码放在一个单独的工件中,并让您的 Scala 项目依赖于 Java 项目工件。

如果你走 Maven 路线,有一个Scala plugin

【讨论】:

  • 真的吗?这么难?几乎没用了。有更简单的方法吗?
  • 这不相关。我已经在使用 Maven。 IDEA 从 maven 模型生成了自己的模块。无论您选择何种依赖管理套件,最终都会遇到同样的问题。只是因为IDEA为了自己的目的使用了自己内置的模块管理。
【解决方案2】:

获取已编译的 Scala 和 Java 文件的最简单方法可能是 SBT - 简单构建工具。只需创建一个项目(+ 添加依赖项等)并编译它。 Scala + Java 编译开箱即用。我已经从 Maven 切换到 SBT。

如果您有一个复杂的 POM,或者您有其他不迁移到 SBT 的原因,您可以尝试配置 POM。只需添加(并可能配置)Scala 插件就足够了。我希望它不会破坏对 Java 的支持。

【讨论】:

  • 我的问题是关于 IDEA 中的编译 - 从 IDE 中运行单元测试和 Scala 工作表所需的(我可以在其中获得完全自动完成、自动导入、语法突出显示等)。因此,虽然 SBT 很棒(我在其他一些项目中使用它),但我更喜欢将它仅用于构建和使用 IDEA 进行编辑和实验。
  • 我使用 IDEA 并在其外部编译 SBT 项目。自动补全效果很好。 IDEA 和 SBT 的合作有两个插件。第一个从 SBT 生成 IDEA 项目(效果很好,虽然需要添加依赖后重新生成项目),第二个是添加 SBT 支持的 IDEA 插件。我对第二个没有太多经验,但它可能会很好。
  • 我知道那个设置,我已经使用它了。然而,它并没有比集成 IDEA 的 Scala 控制台的便利性(Ctrl+Alt+Space 任何人?)以及在 IDE 中编辑和快速运行单元测试的能力。
  • 测试可以通过~test命令自动运行,控制台可以通过console命令运行。从 IDEA 做这件事会很棒,但 SBT 对我来说已经足够了。
【解决方案3】:

Randall Schulz 在评论中提出了正确的问题:“为什么编译哪个工具很重要?” 到目前为止,我认为如果您想使用 IDEA 的出色功能(例如 IDEA 的 Scala 控制台或在其中运行测试),IDEA 需要自己编译所有类。我错了。

事实上,IDEA 会选择由任何其他工具编译的类(例如伟大的 SBT)。在使用 IDEA 的任何有用功能之前,您只需要确保所有课程都是最新的。最好的方法是:

  1. 在后台启动持续增量编译(对于 例如通过在 SBT 中发出“~ compile”)
  2. 删除 IDEA 中的“制作”步骤 运行配置

就是这样!然后,您可以使用 IDEA 的所有很酷的功能(不仅是语法高亮和代码完成,还有 Scala 控制台中的所有自动导入,快速运行选定的单元测试),而无需在不同窗口之间切换。 这就是我到现在为止错过的工作流程!感谢大家对这个问题的所有 cmets。

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多