【问题标题】:Can't start main class when classpath order changes类路径顺序更改时无法启动主类
【发布时间】:2020-06-10 08:11:05
【问题描述】:

我正在尝试从命令行使用 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>

但是当罐子的顺序改变时,它会失败:

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 ...

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

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

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

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

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

【问题讨论】:

  • 我添加了一条注释。似乎没有任何重复的类。
  • 另外,我无法想象克莱尔在命令行上工作,它需要一个 CDT 版本和连接的 Eclipse 设置。我们目前不像为 jdt 那样将其重新打包到 jar 中。
  • 有时我会遇到在 Eclipse Rascal 中发现 Clair 引发异常的问题。我不得不重新安装 Rascal 和 Clair。这可能与它们在类路径中的顺序有关吗?
  • 不这么认为,但如果你能重现它,我们非常感谢 github repo 上的错误报告 :)

标签: java rascal


【解决方案1】:

如果有命令行参数,RascalShell 的 main 函数的行为会有所不同,并且会根据它在类路径中找到的第一个 RASCAL.MF 文件而有所不同。

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • Main-Function 本身并不适用于 IDE 插件。它旨在促进以某种方式启动的 Rascal 应用程序,比如从 java -jar myRascalApp.jar 开始。特别是针对我们没有任何库支持的情况而设计的,因此会有 1 个 jar 和一个 RASCAL.MF。
  • at 2: RASCAL.MF:Main-Module 与 MANIFEST.MF:Main-Class 平行,这也取决于类路径顺序。
  • 我的意思是它在 IDE 和 REPL 中都使用过,并且目前无法从同一个 RASCAL.MF 文件中并行支持两者。
  • 对;但这不是一个错误,因为它也不是一个功能。对于同一个 jar 文件,没有办法支持两个不同的 java MaiN-Class 属性。
猜你喜欢
  • 2018-03-17
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2015-02-02
  • 2020-05-28
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多