当classpath顺序改变时,无法启动主类。

问题描述 投票:0回答:1

我试图用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 ...

这是classpaths的正常行为吗?

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

更新:从META-INFR中删除。从META-INFRASCAL.MF中删除这一行。

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

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

java rascal
1个回答
1
投票

如果有命令行参数,RascalShell的主函数会有不同的表现,并且根据它在classpath中找到的第一个RASCAL.MF文件而不同。

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

我怀疑是后者在起作用:classpath的顺序改变了找到哪个RASCAL.MF文件,因此REPL没有启动,而是加载了某个模块,但没有找到。但我不确定,因为我不能从这里设置一个断点;-)


1
投票

我认为你在REPL中发现了两个bug。

  1. 第二种行为是我们尝试运行的bug Main-Function 定义 这是为ide插件准备的,也是在终端。我想问题在于我们在命令行中使用了和ide集成点一样的配置,我们可能需要添加一个单独的标签。
  2. 我们应该提供一种方法来说明我们要运行哪个RASCAL.MF,因为现在它只是选择它看到的第一个(rascal也有一个RASCAL.MF文件)。
© www.soinside.com 2019 - 2024. All rights reserved.