Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven fat jar中的Kotlin JSR-223 ScriptEngineFactory-找不到Kotlin编译器jar_Maven_Kotlin_Executable Jar_Jsr223 - Fatal编程技术网

Maven fat jar中的Kotlin JSR-223 ScriptEngineFactory-找不到Kotlin编译器jar

Maven fat jar中的Kotlin JSR-223 ScriptEngineFactory-找不到Kotlin编译器jar,maven,kotlin,executable-jar,jsr223,Maven,Kotlin,Executable Jar,Jsr223,我有一个胖罐子,在那里我试图获取Kotlin的脚本引擎的实例 出于调试目的,我正在遍历可用的脚本引擎工厂并获取引擎 val scriptEngineManager=scriptEngineManager() 用于(scriptEngineManager.EngineFactorys中的工厂){ val scriptEngine=factory.scriptEngine } 当它击中Kotlin的引擎时,会出现以下异常: Exception in thread "main" java.io.Fi

我有一个胖罐子,在那里我试图获取Kotlin的
脚本引擎的实例

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

val scriptEngineManager=scriptEngineManager()
用于(scriptEngineManager.EngineFactorys中的工厂){
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>
    <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>

org.apache.maven.plugins
maven汇编插件
2.6
组装
包裹
单一的
${main.class}
带有依赖项的jar
有什么想法吗

更新


为了记录在案,我尝试了KotlinJsr223JvmLocalScriptEngineFactory和KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory,结果相同。

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

类MyScriptEngineFactory:KotlinJsr223JvmScriptEngineFactoryBase(){
重写getScriptEngine():ScriptEngine=
KotlinJsr223JvmLocalScriptEngine(
Disposer.newDisposable(),
这
类路径,/!!!在此处提供脚本类路径
KotlInstandardJSR2223ScriptTemplate::class.qualifiedName!!,
{ctx,types->ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)),types?:emptyArray())},
arrayOf(绑定::类)
)
}
您需要将以下JAR放入
类路径中

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

您可以将您的胖罐子放在那里,但这意味着它的所有内容都可以从您的脚本中访问。不要谈论编译器的开销。

确保包含
META-INF
的资源,或者该文件夹中没有重复的文件。我相信这没关系,这与Kotlin的ScriptEngineFactory解析编译器类的方式有关……好吧,可能是Kotlin模块信息被编写或重写了。谢谢,这似乎是一条路要走。无论如何,请你详细说明一下不要谈论编译器的开销好吗?@DavidSiro在解析阶段,编译器将在编译类路径中查找类型,因此搜索范围越大,开销就越大。我似乎无法在编译期间解析
KotlinJsr223JvmLocalScriptEngine