如何从作为blob存储在数据库中的jar文件中加载类,因为URL类加载器只接受URL或文件路径?
答案 0 :(得分:2)
从java.lang.ClassLoader
实现自己的子类,从数据库加载。
也许这篇文章有助于开始:http://www.javablogging.com/java-classloader-2-write-your-own-classloader/
答案 1 :(得分:2)
编写自己的ClassLoader可能会非常混乱,特别是对于初学者。我最近需要动态加载一些jar并发现this answer非常有帮助。它解释了如何使用ResourceFinder,一个来自Apache xbean的类或其他东西。这是一个可以轻松放入项目的单个文件。
最有利于您的情况,尽管ResourceFinder按URL加载,但readContents
函数(用于实际加载jar文件)如下所示:
private String readContents(URL resource) throws IOException {
InputStream in = resource.openStream();
BufferedInputStream reader = null;
StringBuilder sb = new StringBuilder();
try {
reader = new BufferedInputStream(in);
int b = reader.read();
while (b != -1) {
sb.append((char) b);
b = reader.read();
}
return sb.toString().trim();
} finally {
try {
in.close();
reader.close();
} catch (Exception e) {
}
}
}
可轻松修改以适用于您拥有的任何Stream / blob。 我确信,课程的一些细微变化可以使它完全符合您的要求,或者至少指向正确的方向。从头开始编写ClassLoaders并不好玩。
编辑: 你知道吗,我刚看了一眼,我不太确定你只能对ResourceFinder进行微小的改动。不过,看一遍,看看你能从中得到什么。
答案 2 :(得分:1)
如果您查看JarClassLoader in the Java tutorial的代码,可以帮助您入门。
如果您使用Google for Jar Class Loader,还可以使用其他资源 您需要修改代码以传入从数据库中的BLOB获取的ByteStream。
答案 3 :(得分:0)
实现自己的类加载器是明显的答案。取决于您需要如何使用可能有问题的类。另一个鲜为人知的选择是实现自己的url处理程序。你可以提出像"db://<dbname>/<tablename>/<jarfile>"
之类的自定义网址方案。您将实现自定义URLStreamHandler,详细信息here。
答案 4 :(得分:-4)
one way to laod jar file .. it may helpful to you.
public class JarLoad {
public static void main(String[] args) throws ZipException, IOException {
File jarfile = new File("C\\scan.jar");
if(! jarfile.isDirectory()){
ZipFile jar = new ZipFile(jarfile);
Enumeration enumeration = jar.entries();
while(enumeration.hasMoreElements()){
ZipEntry zipEntry = (ZipEntry)enumeration.nextElement();
System.out.println(zipEntry.getName());
}
}
}
}