Java ServiceLoader在打包的Spring引导应用程序中不工作

Java ServiceLoader在打包的Spring引导应用程序中不工作,java,spring,spring-boot,Java,Spring,Spring Boot,(复制自我的GitHub版本:) 我注意到Java的ServiceLoader机制在打包的Spring启动应用程序中不起作用 背景 我尝试使用依赖于ServiceLoaders的javax.script.ScriptEngineManager。我能够从IDE成功启动应用程序,但不能从命令行启动 复制 //Main.java 导入org.springframework.boot.SpringApplication; 导入org.springframework.boot.autoconfigure.

(复制自我的GitHub版本:)

我注意到Java的ServiceLoader机制在打包的Spring启动应用程序中不起作用

背景 我尝试使用依赖于
ServiceLoader
s的
javax.script.ScriptEngineManager
。我能够从IDE成功启动应用程序,但不能从命令行启动

复制
//Main.java
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.autoconfigure.springboot应用程序;
导入javax.script.ScriptEngineManager;
导入java.util.Objects;
@SpringBoot应用程序
公共班机{
公共静态void main(字符串[]args){
SpringApplication.run(Main.class,args);
var engine=new ScriptEngineManager().getEngineByName(“python”);
对象。requirennull(发动机);
System.out.println(“成功”);
}
}
可以从IDE(在我的例子中是IntelliJ)启动,但不能通过命令行:

gradlebootjar&&java-jarbuild/libs/XXX.jar
临时解决办法 可以直接使用Jython的
ScriptEngine
实现,而不是使用
ScriptEngineManager

var engine=new org.python.jsr223.PyScriptEngineFactory().getScriptEngine();

服务加载器
机制正在正确查找
PyScriptEngineFactory
。当它试图从中创建脚本引擎时,问题是一个无声的失败。不幸的是,当您调用
getEngineByName(String)
时,
ScriptEngineManager
会接受
getScriptEngine()
引发的任何异常:

您的变通方法对我不起作用,但这很有用,因为它允许我看到
ScriptEngineManager
所吞噬的异常。具体如下:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:109)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(File.java:418)
    at org.python.core.PrePy.getJarFileNameFromURL(PrePy.java:427)
    at org.python.core.PrePy._getJarFileName(PrePy.java:362)
    at org.python.core.PrePy.getJarFileName(PrePy.java:345)
    at org.python.core.PySystemState.doInitialize(PySystemState.java:1195)
    at org.python.core.PySystemState.initialize(PySystemState.java:1130)
    at org.python.core.PySystemState.initialize(PySystemState.java:1085)
    at org.python.core.PySystemState.initialize(PySystemState.java:1080)
    at org.python.core.PySystemState.initialize(PySystemState.java:1075)
    at org.python.core.PySystemState.initialize(PySystemState.java:1070)
    at org.python.core.PySystemState.<init>(PySystemState.java:207)
    at org.python.util.PythonInterpreter.threadLocalStateInterpreter(PythonInterpreter.java:80)
    at org.python.jsr223.PyScriptEngine.<init>(PyScriptEngine.java:27)
    at org.python.jsr223.PyScriptEngineFactory.getScriptEngine(PyScriptEngineFactory.java:85)
    at com.example.demo.Gh22955Application.main(Gh22955Application.java:11)
    ... 8 more

我不知道Gradle的情况,我也没有基于maven的项目的源代码,我在工作中遇到了类似的问题,但我认为你应该在Gradle插件中寻找一种叫做“布局”的东西:
try {
    ScriptEngine engine = spi.getScriptEngine();
    engine.setBindings(getBindings(), ScriptContext.GLOBAL_SCOPE);
    return engine;
} catch (Exception exp) {
    if (DEBUG) exp.printStackTrace();
}
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:109)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(File.java:418)
    at org.python.core.PrePy.getJarFileNameFromURL(PrePy.java:427)
    at org.python.core.PrePy._getJarFileName(PrePy.java:362)
    at org.python.core.PrePy.getJarFileName(PrePy.java:345)
    at org.python.core.PySystemState.doInitialize(PySystemState.java:1195)
    at org.python.core.PySystemState.initialize(PySystemState.java:1130)
    at org.python.core.PySystemState.initialize(PySystemState.java:1085)
    at org.python.core.PySystemState.initialize(PySystemState.java:1080)
    at org.python.core.PySystemState.initialize(PySystemState.java:1075)
    at org.python.core.PySystemState.initialize(PySystemState.java:1070)
    at org.python.core.PySystemState.<init>(PySystemState.java:207)
    at org.python.util.PythonInterpreter.threadLocalStateInterpreter(PythonInterpreter.java:80)
    at org.python.jsr223.PyScriptEngine.<init>(PyScriptEngine.java:27)
    at org.python.jsr223.PyScriptEngineFactory.getScriptEngine(PyScriptEngineFactory.java:85)
    at com.example.demo.Gh22955Application.main(Gh22955Application.java:11)
    ... 8 more
bootJar {
    requiresUnpack "**/jython-slim*"
}