首页 > 解决方案 > VS Code 知道 Scala 和 Java,但无法连接它们

问题描述

我正在尝试将ScalaJava进行互操作,并设法创建了一个基于Maven的项目(此处为存储库),该项目可以从命令行(mvn clean package)很好地编译。

但是,我一直遇到我的 IDE(VS Code)根本不理解互操作的问题。

问题

该文件AccessScala.java正在尝试访问WithinModule.scala.

package me.parent.jModule;

import me.parent.jModule.WithinModule;

public class AccessScala {
    public static void main(String[] args) {
        WithinModule within = new WithinModule();
        // -- this is like a static variable, but Scala doesn't allow that
        // System.out.println(WithinModule.string());
        // -- this is the auto-generated getter
        System.out.println(within.string());
        // -- this getter was manually added
        System.out.println(within.getString());
    }
}

VS Code 提出了三个问题:

  1. 导入me.parent.jModule.WithinModule无法解决:AccessScala[3,8]
  2. WithinModule无法解析为类型:AccessScala [7,9]
  3. WithinModule无法解析为类型:AccessScala [7,35]

项目设置

该项目有两个模块,但现在只有jModule相关的。它在不同的文件夹中包含JavaScala代码。sModule包含一些我也想访问的Scala代码,但我当前的问题与Maven模块以及理解Scala - Java连接的 VS Code 无关。

> parent
 | > jModule
 | | > src/main
 | | | > java/me/parent/jModule
 | | | | > AccessScala.java
 | | | > scala/me/parent/jModule
 | | | | > WithinModule.scala
 | | > build.sbt
 | | > project/build.properties
 | | > pom.xml
 | > sModule
 | | > src/scala/me/parent/sModule
 | | | >ExternalModule.scala
 | | > pom.xml
 | | > build.sbt
 | | > project/build.properties
 | > build.sbt
 | > project/build.properties
 | > pom.xml

VS 代码

我正在使用Java 扩展包Scala-Metals和 Scala 语法

对于JavaScala,它都会检测错误等,因此它知道 Scala 就在那里。

问题

为什么 VS Code 会抱怨,我能做些什么来完成这项工作?有没有办法,或者我只需要使用 IntelliJ(我还有其他问题,请继续关注这些问题;)

标签: javascalamavenvisual-studio-codescala-metals

解决方案


对 Visual Studio Code 的 Java 和 Scala 语言支持都基于 LSP(语言服务器协议),目前还没有一种简单的方法可以让不同的语言服务器协同工作。

Metals 目前能够通过 Bloop(构建服务器)或 Sbt 或 Mill 等构建工具编译 Scala 和 Java。但是,它缺少 Java 支持所需的大部分支持。Java LSP 服务器目前根本无法编译 Scala,因此不建议在混合项目中使用它。

我们即将在 Metals 中获得更多 Java 支持,请观看此 PR此问题以了解详细信息,我们计划进一步开展工作。

如果您需要一些严重的重构和自动化,建议当前使用 Intellij Idea。Metals 应该是一个更轻量级的替代品,并且还支持一系列不同的编辑器,例如 Vim、Emacs 或 Sublime。它从未打算成为一对一的体验,而是为用户提供另一种选择。


推荐阅读