我有一个具有以下结构的罐子:
main-app/
├─ META-INF/
│ ├─ maven.org.rascalmpl.runmain/
│ │ ├─ pom.xml
│ │ ├─ pom.properties
│ ├─ MANIFEST.MF
├─ rascal/
│ ├─ Main.tpl
│ ├─ MyModule.tpl
├─ Main.rsc
├─ MyModule.rsc
我正在编写一个评估器来运行 JAR 中的函数,到目前为止我有以下内容:
final GlobalEnvironment heap = new GlobalEnvironment();
final ModuleEnvironment top = new ModuleEnvironment("test", heap);
Evaluator eval = new Evaluator(vf, System.in, System.err, System.out, top, heap);
eval.addRascalSearchPathContributor(StandardLibraryContributor.getInstance());
eval.addRascalSearchPath(URIUtil.rootLocation("std"));
ISourceLocation tmp = URIUtil.correctLocation("jar", "", "/path/to/runmain-0.1.0-SNAPSHOT.jar!");
eval.addRascalSearchPath(tmp);
eval.doImport(null, "Main");
eval.doImport(null, "MyModule");
System.out.println(eval.getHeap().existsModule("Main")); // Check if module has been added to heap
eval.call("main", tmp, null);
当我尝试运行它时,它只打印出
false
,然后出现以下异常:
Exception in thread "main" org.rascalmpl.interpreter.staticErrors.ModuleImport: Could not import module Main: can not find in search path
如何访问 JAR 中的
.tpl
文件或 .rsc
文件来调用任意函数?
P.S:当我编译 JAR 时,RASCAL.MF 未包含在输出中,有必要吗?
如果
run-main
jar 中包含 META-INF/RASCAL.MF
和 Project-Name: run-main
,则 Rascal URI 名称解析器会自动注册 lib://run-main
并让它指向 jar 的根目录。这样您就可以做到这一点:
ISourceLocation tmp = URIUtil.correctLocation("lib","run-main","");
除此之外,您还可以使用
jar
方案。但这需要你找到jar文件位置:
jar+file:///path/to/run-main.jar/!/
!
之后是路径 into jar 文件开始的位置,也是可以找到 .rsc
文件的位置。早期的 lib
方案正是这样做的,但自动基于在类路径中搜索 RASCAL.MF 文件。