Java jjs.exe和ServiceLoader

Java jjs.exe和ServiceLoader,java,nashorn,Java,Nashorn,jjs.exe运行的脚本是否应该像任何Java程序一样,能够通过ServiceLoader定位服务 我已将我的案例简化为以下脚本: function dump (stream) { (new BufferedReader(new InputStreamReader(stream))).lines().forEach(function (x) { print(x); }); } var BufferedReader = Java.type("java.io.BufferedReader"

jjs.exe运行的脚本是否应该像任何Java程序一样,能够通过
ServiceLoader
定位服务

我已将我的案例简化为以下脚本:

function dump (stream)
{
    (new BufferedReader(new InputStreamReader(stream))).lines().forEach(function (x) { print(x); });
}

var BufferedReader = Java.type("java.io.BufferedReader");
var InputStreamReader = Java.type("java.io.InputStreamReader");
var ServiceLoader = Java.type("java.util.ServiceLoader");

var Sts = Java.type("prodist.sts.Sts");
print(Sts);
// A

var stsConfigStream = Sts.class.getResourceAsStream("/META-INF/services/prodist.sts.Sts");
dump(stsConfigStream);
// B

var StsImpl = Java.type("prodist.sts.internal.StsImpl");
print(new StsImpl());
// C

var stsLoader = ServiceLoader.load(Sts.class);
var stsIterator = stsLoader.iterator();
stsIterator.next();
// D
我调用
jjs.exe
在命令行上设置类路径。我的脚本正确地找到并打印A点中的接口名称。它定位服务描述资源;当我转储资源的内容时,我在点B中看到了预期的内容。我确保预期的实现类在点C中可用

在点D中,程序抛出一个
NoSuchElementException
,我将其解释为ServiceLoader没有找到接口的任何服务描述资源

这样行吗?
我遗漏了什么吗?

您需要设置线程上下文类加载器。引用jjs类路径中的任何类,获取它的类对象,然后获取它的类装入器。然后将该加载程序设置为线程上下文类加载程序。这应该在使用服务加载程序API之前完成:

var StsClass = Java.type("prodist.sts.Sts").class;
java.lang.Thread.currentThread().contextClassLoader = StsClass.classLoader;

我对纳肖恩的了解还不够,无法确定这是否相关,但似乎在一个相关的问题上,至少可以给你一些见解。谢谢。这表明了一种潜在的解决方法。我最初的解决方法是使用
ServiceLoader.load(Sts.class,Sts.class.classLoader)
。这是不够的,因为用Java编写的组件在内部也会使用ServiceLoader,而这些查找仍然会失败。