Java 在同一项目中使用多个JVM语言

Java 在同一项目中使用多个JVM语言,java,scala,jvm,kotlin,polyglot,Java,Scala,Jvm,Kotlin,Polyglot,我想在项目中一起使用Kotlin和Scala,也许还有其他一些语言,但我还没有看到这样做的好方法。我想到的唯一方法是编译一种语言并将其反编译为Java以与另一种语言协同工作。还有其他选择吗?您可以同时使用Scala和Java,因为scalac理解并编译Java文件。其他语言可能也是如此。使用多种可选JVM语言时可能会出现问题,例如,Kotlin编译器可能无法理解Scala文件,反之亦然 我认为最好的方法是将项目分成不同的模块,每个模块最多使用一种替代语言 我说的模块是什么意思? 对于模块,我指的

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

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

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

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

IDEs中的多模块支持 我认为大多数主要的IDE都可以同时在不同的模块上工作,即使每个模块使用不同的语言。IDE中的术语各不相同

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

为了完整性和不让别人说出话来,我想参与进来

我同意你的最后一句话。正确的做法是采取行动,而不是试图在一个组件或项目中组合多种语言

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

由于您坚持使用JVM语言,因此每种语言都可以编译成一个JAR,因此您可以轻松地将可执行二进制文件作为单个JAR文件分发,所有组件都封装在其中。这是Fat-JAR方法(参见)


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

我想在同一个项目中使用多种可选语言。它们都被翻译成字节码,所以在此之前必须有一种方法将它们结合使用。@Phase“一个项目”是什么意思?你是说一件可以交付的东西吗?源代码中的一个根级别?还是一个IDE级项目?还有,@ziggystar所说的“模块”是什么意思?(参见托马斯·欧文斯的评论)@ThomasOwens我认为这是一个IDE级的项目,但在IDE中我看不到这样做的方法。我想从不同类型的文件(.java、.scala和.kt)中得到一个jar。那么,我相信这个答案的最后一句话是正确的。Java、Scala和Kotlin(以及其他JVM语言)都编译成JAR。为每个模块提供单独的IDE项目,并将每个项目构建到具有定义良好的接口的JAR中。最后,您需要一个主入口点,这样您就可以在最后将所有不同语言的组件JAR打包到一个JAR中。一个更具体的问题可能会得到更具体的答案,比如“我在Scala中定义了一个类。如何从Kotlin创建它的实例?”您可以使用Gradle,使用Kotlin和Scala插件?这实际上取决于您是否在IDE中,以及使用哪个IDE。以及您是否在构建工具中,以及使用哪个构建工具。你的问题需要进一步澄清。还可以添加一个当前代码布局的示例,您正在使用的目录结构,它们是在同一个模块中还是在单独的模块(子项目)中,等等。还要注意您以前尝试过但不起作用的内容。