下面是在客户端JAR中运行服务提供者的代码。
static PokerGameInstance getPokerGame() {
URL[] urls = null;
try {
urls = new URL[] { Paths.get("client.jar").toUri().toURL() };
System.out.println(urls[0]);
}
catch (Exception e) {
System.out.println("Could not create URL[] to use to create " +
"ClassLoader for client.jar.jar.");
return null;
}
URLClassLoader classLoader;
try {
classLoader = new URLClassLoader(urls);
}
catch (Exception e) {
System.out.println("Could not create classloader for " +
"client.jar.");
return null;
}
try { // Test code
classLoader.loadClass("com.brandli.jbpoker.client.PokerGame");
}
catch (ClassNotFoundException e) {
System.out.println("Could not find PokerGame class");
}
ServiceLoader<PokerGameInstance> loader = ServiceLoader
.load(PokerGameInstance.class, classLoader);
Optional<PokerGameInstance> optional = loader.findFirst();
if (optional.isEmpty()) {
System.out.println("Could not load client service provider.");
return null;
}
return optional.get();
}
第一次运行时,没有client.jar。其他代码下载client.jar,然后运行上面的代码。查看这个方法的输出,URLClassLoader能够加载服务提供程序类(它恰好被称为PokerTable)。但是,ServiceLoader没有找到任何东西,并且该方法打印“Could not load client service provider”。
但是,当它第二次运行时,client.jar已经存在了,并且没有下载新的。在这种情况下,ServiceLoader返回适当的类,并且一切正常。
结果是,ServiceLoader无法识别client.jar中的服务,即使URLClassLoader将加载对象。这与下载Client.jar无关,因为即使Client.jar从一开始就存在,问题也存在(除非被系统类加载器拾取)。
请记住client.jar是一个模块jar。上面的代码位于一个模块中,该模块具有以下module-info.java:
module com.brandli.jbpoker.loader {
exports com.brandli.jbpoker.loader;
requires transitive javafx.controls;
requires transitive com.brandli.jbpoker.core;
uses com.brandli.jbpoker.loader.PokerGameInstance;
}
client.jar有这个模块-info.java:
module com.brandli.jbpoker.client {
requires transitive javafx.controls;
requires transitive com.brandli.jbpoker.core;
requires transitive com.brandli.jbpoker.loader;
requires transitive com.brandli.jbpoker.common;
provides com.brandli.jbpoker.loader.PokerGameInstance with
com.brandli.jbpoker.client.PokerGame;
}
对我的问题的一个注释使我研究了modulelayer
/modulefinder
。我注意到有一个serviceLoader.load(ModuleLayer,Class)
。以下代码起作用:
static PokerGameInstance getPokerGame() {
ModuleFinder finder = ModuleFinder.of(Paths.get("client.jar"),
Paths.get("common.jar"));
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = null;
try {
cf = parent.configuration()
.resolveAndBind(finder, ModuleFinder.of(),
Set.of("com.brandli.jbpoker.client"));
}
catch (Throwable e) {
return null;
}
ClassLoader cl = ClassLoader.getSystemClassLoader();
ModuleLayer layer = null;
try {
layer = parent.defineModulesWithOneLoader(cf, cl);
}
catch (Throwable e) {
return null;
}
ServiceLoader<PokerGameInstance> loader = ServiceLoader
.load(layer, PokerGameInstance.class);
Optional<PokerGameInstance> optional = loader.findFirst();
if (optional.isEmpty()) {
return null;
}
return optional.get();
}
我不知道为什么我问题中的代码不起作用。
编辑:此解释来自@slaw:
我正在尝试下载一个文件到目录,可以根据用户选择的任何目录变化。我将当前目录存储在一个file对象中,现在正在尝试下载该文件。文件下载,但它不下载指定的目录。那么,我可以做什么来获得所选目录中的文件。 传递给文件构造函数的名为url的字符串包含url。只是用它来检索文件名。 更新:我刚找到文件。它在手机里而不是sd卡里。它就在这个文件夹里,存储\仿真\00。不知道为什么?另外,我得到的绝对路径是St
我对*nix操作系统不是很有经验,我正在尝试在WSL中建立一个嵌入式编程环境,但我对基本问题很感兴趣。上次我在这个项目上工作时,我下载了一些文件(cargo和rustup,但这不重要),我确认它们在那里,并通过使用-V获取版本号来工作。 重新启动计算机后,WSL无法将rustup或货物识别为命令,并且文件夹不会以ls显示,即使我在Windows资源管理器中检查它们时它们也会显示。 我一直在使用的目
我已经安装了JDK1.7,我需要制作一个JavaWebStart应用程序。我在网上搜索了一下,发现你需要jnlp。jar在您的项目构建路径中。 还有一个类似的问题(http://stackoverflow.com/questions/7593029/where-can-i-download-jnlp-jar)用户说它在jdk文件夹中,特别是在C:\Program Files\Java\jdk1中。
我的java项目使用javax.mail.jar。因此,在netbeans中,我创建了一个新的文件夹库,将jar文件复制到那里,并将其添加到项目属性中。我将这个文件夹添加到git中,它在NetBeans上运行良好。但当我在另一台机器上使用ant构建项目并运行项目jar时 我不确定哪里出了问题。知道怎么让它运行吗? 解决方案:正如@Gimby所指出的,来自Netbeans和ant build的jar
问题内容: 我有以下目录结构: 我尝试在从server.js导出的app.js中调用函数,我这样做: 但是得到错误: 我如何正确包含它? 谢谢。 问题答案: 该路径必须相对于您当前所在的文件。 用
在完成spring-boot服务器之后,我想将它变成一个jar,以便可以将它部署在远程服务器上。我选择使用maven完成此操作 在.jar-with-dependecies.jar创建之后,我将其上载到服务器上并尝试运行 和其他人一样 链接2 链接3 链接4 mvn命令: 这也不起作用: