【问题标题】:Using multiple JVM languages in the same project在同一个项目中使用多种 JVM 语言
【发布时间】:2015-08-24 06:27:54
【问题描述】:

我想在项目中同时使用 Kotlin 和 Scala,也许还可以使用其他一些语言,但我没有看到这样做的好方法。我想到的唯一方法是编译一种语言并将其反编译成 Java 以与另一种语言一起使用。有其他选择吗?

【问题讨论】:

  • 一个更具体的问题可能会为您提供更具体的答案,例如“我在 Scala 中定义了一个类。如何从 Kotlin 创建它的实例?”
  • 你可以使用 Gradle,并使用 Kotlin 和 Scala 插件吗?
  • 这实际上取决于您是否在 IDE 中,以及在哪个 IDE 中。以及您是否在使用构建工具,以及使用哪个构建工具。您的问题需要进一步澄清。还要添加您当前代码布局的示例,您正在使用什么目录结构,它们是在相同的模块还是单独的模块(子项目)中,等等。
  • 另请注意您之前尝试过的方法无效。

标签: java scala jvm kotlin polyglot


【解决方案1】:

为了完整起见,不把话放在别人嘴里,我想权衡一下。

我同意ziggystar's answer的最后一句话。正确的做法是使用component-based approach,而不是尝试在一个组件或项目中组合多种语言。

从技术角度来看,每种 JVM 语言都有自己的编译器。有些,例如 Scala 的,可以编译 Scala 和 Java 文件。但是,对于其他编译器,这可能是正确的,也可能不是。为了避免奇怪的构建过程,一个好的方法是为每个构建的模块使用一种语言。

由于您坚持使用 JVM 语言,因此每种语言都可以编译成 JAR,因此您可以轻松地将可执行二进制文件作为单个 JAR 文件分发,其中包含所有组件。这是 Fat JAR 方法(参见this question on Stack Overflowthis post on Java Code Geeks)。

从人类可读性的角度来看,这也应该使您的软件更易于理解。您不仅将其分解为逻辑构建块(每个组件),而且进行修改的人只需要了解他们正在处理的组件所使用的语言以及他们需要与之交互的组件的公共接口。语言之间没有心理上下文切换。

【讨论】:

    【解决方案2】:

    您可以同时使用 Scala 和 Java,因为 scalac 可以理解和编译 Java 文件。其他语言可能也是如此。使用多种替代 JVM 语言时可能会出现问题,因为例如 Kotlin 编译器可能无法理解 Scala 文件,反之亦然。

    我认为最好的方法是将项目拆分为不同的模块,每个模块最多使用一种替代语言。

    模块是什么意思?

    对于module,我的意思是一组源文件被翻译成一个(二进制)工件,即一个jar文件。在不同的情况下,我会简单地将“模块”称为项目。请注意,一个模块可能依赖于二进制级别的其他模块(例如,有一些 jar 文件作为依赖项)。

    IDE 中的多模块支持

    我认为大多数主要 IDE 应该可以同时处理不同的模块,即使每个模块使用不同的语言。术语因 IDE 而异。

    术语

    对于 Intellij IDEA,我的模块之一称为“模块”。对于 Eclipse,它将被称为“项目”。

    【讨论】:

    • 我想在同一个项目中使用多种替代语言。它们都被翻译成字节码,所以在此之前必须有一种方法可以一起使用它们。
    • @Phase “一个项目”是什么意思?你的意思是一件可交付的东西吗?源代码中的一个根级别?还是一个 IDE 级别的项目?
    • 另外,@ziggystar 所说的“模块”是什么意思? (见 Thomas Owens 的评论)
    • @ThomasOwens 我认为这是一个 IDE 级别的项目,但我认为在 IDE 中无法做到这一点。我想从不同类型的文件(.java、.scala 和 .kt)中取出一个 jar。
    • 我相信这个答案的最后一句话是正确的。 Java、Scala 和 Kotlin(以及其他 JVM 语言)都编译成 JAR。每个模块都有单独的 IDE 项目,并将每个模块构建到具有明确定义的接口的 JAR 中。最后,您需要一个主入口点,这样您就可以在最后将不同语言的所有组件 JAR 打包到一个 JAR 中。
    猜你喜欢
    • 2011-01-12
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多