如何使用 Rascal Evaluator 从已编译的 JAR 访问 Rascal 函数?

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

我有一个具有以下结构的罐子:

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 未包含在输出中,有必要吗?

java rascal
1个回答
1
投票

如果

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 文件。

© www.soinside.com 2019 - 2024. All rights reserved.