【发布时间】:2022-01-18 14:29:38
【问题描述】:
我收到了一个 Scala jar,需要编写一个 java 程序来使用一个方法。 导入的 Scala 方法肯定有效,因为它已经投入生产多年。
这是程序:
import com.company.VerifyApp // The imported Scala jar
public class Validation {
public static void main(String[] args) {
VerifyApp app = new VerifyApp();
app.main(args);
}
}
反编译的 Scala 代码:
package com.company;
public final class VerifyApp {
public static void main(String[] var0) {
VerifyApp$.MODULE$.main(var0);
}
}
以下是观察结果:
- 错误消息:找不到符号构造函数 VerifyApp()
- 位置:com.company.VerifyApp 类
- 请注意,此位置正确
- 从反编译的代码来看,VerifyApp 是一个没有构造函数的最终类(因此应该有一个默认的 0-arg 构造函数)
- 我正在使用 IntelliJ 并已激活“包含具有“已提供”范围的依赖项”
- 这不是 maven 项目,我只是将 jar 加载为外部库
- 编辑时,IntelliJ 不显示错误或警告
- 我查看了大量具有相同主题的 Stackoverflow 帖子,但找不到任何有用的内容
我想知道可能是什么问题?
编辑:
IntelliJ 警告我我正在实例化一个实用程序类,这很可能是一个错误。由于我是 Java 新手,我用 Google 搜索了一下,发现也许我可以直接调用 VerifyApp.main(args) 而无需实例化对象。这确实通过了构建,但我遇到了运行时错误:
NoClassDefFoundError,由 ClassNotFoundException 引起
现在我没戏了。
【问题讨论】:
-
您调用 JAR 的方式一定是本地类路径问题。如果我使用正确的目录结构(以及
import上缺少的分号)逐字创建这两个.java文件,那么一切正常。所以无论发生什么都是你的开发环境本地的。 -
您是否尝试过:
VerifyApp$.MODULE$.main(args);或类似的东西? lampwww.epfl.ch/~michelou/scala/using-scala-from-java.html。如果它最初是在对象 App.main 中定义的,那么您可以直接调用它:App.main(args). -
在运行时检查它是否在类路径中包含
scala-library.jar。 -
顺便说一句,这是一个有效的问题,所以我不知道为什么人们试图拒绝或关闭它。让我们让它活着。这是 Java/Scala 互操作的有效问题。
-
我会将该 JAR 和 Scala JAR 添加到 IntelliJ 中的库中并尝试编译/运行。我不确定什么是实用程序类。通常所有的库都以 JAR 的形式出现,这就是我们所需要的。
标签: java scala intellij-idea