我有一个罐子,它的 struct 如下:

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);

当我try 运行此命令时,它只打印出false,然后出现以下异常:

Exception in thread "main" org.rascalmpl.interpreter.staticErrors.ModuleImport: Could not import module Main: can not find in search path

如何访问JAR中的.tpl个文件或.rsc个文件来调用任意函数?

附言:当我编译JAR时,输出中没有包含RASCAL.MF,有必要吗?

推荐答案

如果run-main JAR中有META-INF/RASCAL.MFProject-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文件自动完成的.

Java相关问答推荐

是否可以从@ TrustMapping中删除特定方法的基路径?

RDX触发ChoiceBox转换器(并按字符串值排序)

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

如何粘合(合并)文件Lucene?

Android Studio—java—在onBindViewHolder中,将断点和空白添加到BackclerView中

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

从Spring5迁移到Spring6:无法在雅加达包中找到类

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

类型集合的Jackson JsonNode:类型引用的对象读取器应该是Singleton吗?

在Spring Boot应用程序中,server.port=0的默认端口范围是多少?

如何在EL处理器中定义带有命名空间的变量?

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

OAuth:登录后无法查看Google邮箱地址

如何在单元测试中获得我的装饰Mapstruct映射器的实例?

转换为JSON字符串时,日期按天递减-Java

SonarQube在合并升级到java17后对旧代码提出错误

如何使用Jackson读取以方括号开头的JSON?

UuidGenerator Bean 类型不匹配?