class 路径顺序更改时无法启动 main class

Can't start main class when classpath order changes

我正在尝试从命令行使用 clair 启动 rascal,但我不明白为什么会这样:

java -cp "rascal-0.18.0.jar;clair_0.1.0.202005281059.jar;org.eclipse.cdt.core_6.11.0.202003081657.jar" org.rascalmpl.shell.RascalShell
Version: 0.18.0
INFO: detected |lib://rascal| at |jar+file:///C:/ws/rascal-0.18.0.jar!/|
INFO: detected |lib://clair| at |jar+file:///C:/ws/clair_0.1.0.202005281059.jar!/|
rascal>

但是当 jar 的顺序改变时,它失败了:

java -cp "clair_0.1.0.202005281059.jar;rascal-0.18.0.jar;org.eclipse.cdt.core_6.11.0.202003081657.jar" org.rascalmpl.shell.RascalShell
Version: 0.18.0
INFO: detected |lib://clair| at |jar+file:///C:/ws/clair_0.1.0.202005281059.jar!/|
INFO: detected |lib://rascal| at |jar+file:///C:/ws/rascal-0.18.0.jar!/|
main function should either have one argument of type list[str], or keyword parameters
Usage: java -jar ...

这是 class 路径的正常行为吗?

注意:clair jar 不包含 org.rascalmpl.shell.RascalShell class。

更新:从 META-INF/RASCAL.MF 中删除行:

Main-Function: main
Main-Module: lang::cpp::IDE

解决了这个问题,所以这似乎是 Rascal(和一个 rascal 函数)的问题,而不是 Java(和一个 Java 函数)。

我认为您在 REPL 中发现了两个错误:

  1. 第二个行为是我们尝试 运行 Main-Function definition 的错误,它是为 IDE 插件设计的,也在终端中。我认为 issue/bug 是我们使用与 ide 集成点相同的命令行配置,我们可能需要为此添加一个单独的标签。
  2. 我们应该提供ide 一种方式来说明我们想要 RASCAL.MF 哪个 运行,因为现在它只选择它看到的第一个(rascal 也有一个 RASCAL.MF 文件).

如果有命令行参数,RascalShell 的主要函数的行为会有所不同,并且会有所不同,具体取决于它在类路径中找到的第一个 RASCAL.MF 文件。

  • 如果有一个参数,那么它会将该参数作为模块名称加载并调用该模块中的 main 函数,将其他命令行参数传递给它
  • 否则它会启动 REPL
  • But:如果它在类路径中找到的第一个 RASCAL.MF 文件有 Main-Module 和 Main-Function,那么它总是加载这个模块并开始它的主要功能。

我怀疑后者在起作用:类路径的顺序发生了变化,找到了 RASCAL.MF 文件,因此 REPL 没有启动,但一些模块正在加载但没有找到。不过我不确定,因为我不能从这里设置断点 ;-)