Fat jar 内的 Kotlin JSR-223 ScriptEngineFactory - 找不到 kotlin 编译器 jar

2024-05-03

我有一个胖罐子,我试图在其中获取 Kotlin 的实例ScriptEngine.

出于调试目的,我正在迭代可用的脚本引擎工厂并获取引擎。

val scriptEngineManager = ScriptEngineManager()
for (factory in scriptEngineManager.engineFactories) {
    val scriptEngine = factory.scriptEngine
}

当它到达 Kotlin 引擎时,它会失败并出现以下异常:

Exception in thread "main" java.io.FileNotFoundException: Cannot find kotlin compiler jar, set kotlin.compiler.jar property to proper location
        at org.jetbrains.kotlin.script.jsr223.KotlinJsr223ScriptEngineFactoryExamplesKt$kotlinCompilerJar$2.invoke(KotlinJsr223ScriptEngineFactoryExamples.kt:100)
        at org.jetbrains.kotlin.script.jsr223.KotlinJsr223ScriptEngineFactoryExamplesKt$kotlinCompilerJar$2.invoke(KotlinJsr223ScriptEngineFactoryExamples.kt)
        at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:130)
        at org.jetbrains.kotlin.script.jsr223.KotlinJsr223ScriptEngineFactoryExamplesKt.getKotlinCompilerJar(KotlinJsr223ScriptEngineFactoryExamples.kt)
        at org.jetbrains.kotlin.script.jsr223.KotlinJsr223ScriptEngineFactoryExamplesKt.access$getKotlinCompilerJar$p(KotlinJsr223ScriptEngineFactoryExamples.kt:1)
        at org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory.getScriptEngine(KotlinJsr223ScriptEngineFactoryExamples.kt:56)
        at davidsiro.invoices.InvoiceGeneratorKt.generateInvoice(invoiceGenerator.kt:16)
        at davidsiro.invoices.MainKt.main(main.kt:11)

我的 fat jar 包含所有依赖项(尽管已解压),包括 Kotlin 编译器。我使用 Maven Assembly Plugin 来构建它,其配置如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>${main.class}</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

有任何想法吗?

Update

作为记录,我尝试了两者KotlinJsr223JvmLocalScriptEngineFactory and KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory结果相同。


JSR223 工厂位于kotlin 脚本 util正在尝试找到编译器 jar 以设置编译。在您的情况下,您需要编写自己的工厂来显式提供脚本编译类路径,例如

class MyScriptEngineFactory : KotlinJsr223JvmScriptEngineFactoryBase() {   
    override fun getScriptEngine(): ScriptEngine =
        KotlinJsr223JvmLocalScriptEngine(
            Disposer.newDisposable(),
            this,
            classpath, // !!! supply the script classpath here
            KotlinStandardJsr223ScriptTemplate::class.qualifiedName!!,
            { ctx, types -> ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)), types ?: emptyArray()) },
            arrayOf(Bindings::class)
        )
}

您需要将以下罐子放入classpath:

  • kotlin-script-util.jar- 它包含用作脚本超类的模板类
  • kotlin-script-runtime.jar- 用于脚本编写的基类
  • 您的脚本中很可能需要使用的任何其他罐子 -kotlin-stdlib.jar

您可以将 fat jar 放在那里,但这意味着您的脚本可以访问其中的所有内容。不谈论编译器的开销。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fat jar 内的 Kotlin JSR-223 ScriptEngineFactory - 找不到 kotlin 编译器 jar 的相关文章

随机推荐

  • 无扫描器解析器生成器

    序幕 尽管解析器 上下文无关语法 识别的语言集严格大于扫描器 常规语法 识别的语言集 但大多数解析器生成器都需要扫描器 请不要试图解释其背后的原因 我很了解它们 我见过解析器 不需要像这样的扫描仪 Elkhound http scottmc
  • 如何使用 RSpec 测试 Rails 中的包含验证

    我的 ActiveRecord 中有以下验证 validates active inclusion gt in gt Y N 我正在使用以下内容来测试我的模型验证 should not allow value A for active sh
  • Android Facebook SDK - 无法接收访问令牌

    我正在尝试在我的 Android 应用程序中使用 Facebook SDK 这是片段 Facebook myFacebook new Facebook 123456789012345 myFacebook authorize LogInSc
  • Django模型错误超出最大递归深度

    我正在关注这个guide http www acedevs com blog 2011 07 25 quick qr codes django 保存时出现以下错误 RuntimeError at admin products product
  • 从列表中删除对象的最佳方法是什么

    我有以下逻辑来删除系统中的非活动用户 因为我们在迭代列表时无法删除行 有更好的方法来处理这个问题吗 List
  • 标题中的全日历自定义按钮

    我需要在同一页面上的两个 或更多 完整日历之间切换 并且希望将此功能添加到日历标题内的自定义按钮中 我在自定义按钮上发现了一些有趣的代码 但它有点过时 因为它引用的是 Fullcalendar v 1 6 1 而我正在使用 2 3 1 这是
  • 线程关闭期间 Win64 Delphi RTL 中的内存泄漏?

    很长一段时间以来 我注意到我的服务器应用程序的 Win64 版本存在内存泄漏问题 虽然 Win32 版本工作正常 内存占用相对稳定 但 64 位版本使用的内存却定期增加 可能 20Mb 天 没有任何明显的原因 不用说 FastMM4 没有报
  • 映射器无法组装任何主键列

    我从 sqlite 表创建了一个临时表 该表是基于各种选择标准的原始表的子集 屏幕截图中有一个示例 我试图一次循环一个表记录 以便更新每个记录中的字段 我有 source table self source engine create en
  • 测试 GWT 代码的最佳方法是什么[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MySQL 查询 - 使用 ORDER BY rand( ) 强制区分大小写

    是否可以强制查询区分大小写 我的听起来是这样的 SELECT g path FROM glyphs WHERE g glyph g glyph ORDER BY rand 如果 g glyph r 结果可以是 R 或 r 这不是我所期望的
  • 选择当前项目 id 周围的 N 个上一个项目和 M 个下一个项目

    我有一张有照片的桌子 id year comm count 0 2015 1 1 2016 2 2 2017 5 3 2018 7 4 2019 1 5 2020 9 6 2021 1 7 2022 1 我选择具有给定 ID 的照片 位于所
  • Javascript 闭包问题

    所以 我仍在阅读 Apress Pro Javascript 技术 但我在闭包方面遇到了麻烦 正如约翰 雷西格所说 闭包允许您引用父函数中存在的变量 然而 它在创建变量时并不提供变量的值 它提供父函数中变量的最后一个值 这是最常见的问题 您
  • font-awesome 字体未加载到 Angular 项目中

    我已经使用 Angular 5 一段时间了 似乎我无法将任何字体很棒的图标加载到我的构建项目中 我完全按照下面链接中提到的步骤进行操作 https www npmjs com package angular font awesome htt
  • Android 计费客户端库:如何指定开发人员有效负载(额外数据)

    我正在尝试使用新的Android计费客户端库 1 0 https developer android com google play billing billing library html 以前 在尝试执行购买时 可以选择向意图添加额外的
  • 计算流数据的直方图 - 在线直方图计算

    我正在寻找一种算法来生成大量流数据的直方图 最大值和最小值事先未知 但标准差和平均值在特定范围内 我很欣赏你的想法 Cheers 我刚刚找到了一个解决方案 秒 从流式并行决策树算法构建在线直方图 论文的 2 2 该算法由 Hive 项目中的
  • 查找系统日志最大消息长度

    大多数 Unix 程序员都会习惯由syslog h 并且许多实现 例如 glibc 对发送给它的 syslog 消息的大小没有真正的限制 但通常对侦听的应用程序有限制 dev log 我想知道是否有人知道如何找到系统日志的最大消息大小 或者
  • 通过 Python 在 PostgreSQL 中的 unicode 字符串中是否允许空字节?

    unicode 字符串中是否允许空字节 我不问 utf8 我的意思是 unicode 字符串的高级对象表示 背景 我们通过 Python 在 PostgreSQL 中存储包含空字节的 unicode 字符串 如果我们再次读取字符串 字符串会
  • 使用PM2时如何配置master进程

    我在 NodeJS 中遇到 PM2 问题 如果没有 PM2 我们总是有如下几行代码来配置主进程 if cluster isMaster master process configuration else worker process con
  • 安装应用程序时复制 SD 卡上的文本文件?

    我正在开发一款安卓游戏 我想在用户第一次安装游戏时将文本文件复制到外部 SD 卡 文本文件对于正确运行游戏非常重要 我怎样才能做到这一点 我应该将文本文件放在 Eclipse 源项目中的哪里 以便当我构建 apk 文件时 我的文本文件也会捆
  • Fat jar 内的 Kotlin JSR-223 ScriptEngineFactory - 找不到 kotlin 编译器 jar

    我有一个胖罐子 我试图在其中获取 Kotlin 的实例ScriptEngine 出于调试目的 我正在迭代可用的脚本引擎工厂并获取引擎 val scriptEngineManager ScriptEngineManager for facto