gpt4 book ai didi

java - 从外部 JAR 读取图像

转载 作者:行者123 更新时间:2023-12-01 10:02:55 25 4
gpt4 key购买 nike

我有一个简单的插件系统,它将外部 JAR 插件加载到主应用程序中。我正在使用Mountainblade Modular这样做。不确定他们是如何“在幕后”做到这一点的,但可能这是标准的东西。

这工作正常,我从外部 jar 实例化类,一切正常。除了一些插件带有图标/图像。我有点不确定如何加载/引用该外部 JAR 中的图像(在该外部 JAR 中包含代码,因为它是在主 JAR 的上下文中运行的)

我应该如何处理这个问题?

最佳答案

这个问题并不像看起来那么简单。

当您从外部 jar 加载类时,它们会被“加载”到 JVM 中。通过“加载”到 JVM,我的意思是 JVM 负责将它们存储在内存中。通常是这样完成的:

ClassLoader myClassLoader = new MyClassLoader(jarFileContent);
Class myExtClass = myClassLoader.loadClass(myClassName);

可以使用以下命令轻松访问类路径 jar 中的资源

InputStream resourceStream = myClass.getResourceAsStream("/myFile.txt");

你可以这样做,因为这些 jar 位于类路径中,我的意思是它们的位置是已知的。这些文件不存储在内存中。当资源被访问时,JVM 可以在类路径 jar 中(例如在文件系统上)搜索它。

但是对于外部 jar 来说,情况就完全不同了:jar 不知从何而来,一旦被处理就被遗忘了。 JVM 不会从内存中加载资源。为了访问这些文件,您必须手动组织它们的存储。我已经这样做过一次,所以我可以分享代码。它将帮助您理解基本概念(但可能不会帮助您了解特定的库)。

// Method from custom UrlClassLoader class. 
// jarContent here is byte array of loaded jar file.
// important notes:
// resources can be accesed only with this custom class loader
// resource content is provided with the help of custom URLStreamHandler
@Override
protected URL findResource(String name) {
JarInputStream jarInputStream;
try {
jarInputStream = new JarInputStream(new ByteArrayInputStream(jarContent));
JarEntry jarEntry;
while (true) {
jarEntry = jarInputStream.getNextJarEntry();
if (jarEntry == null) {
break;
}
if (name.equals(jarEntry.getName())) {
final byte[] bytes = IOUtils.toByteArray(jarInputStream);
return new URL(null, "in-memory-bytes", new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL u) throws IOException {
return new URLConnection(u) {
@Override
public void connect() throws IOException {
// nothing to do here
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(bytes);
}
};
}
});
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

关于java - 从外部 JAR 读取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36674763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com