因此,在lib-ext
我每天从Jenkins服务器下载2个jar文件“ jar1和jar2”以由我的程序检查的情况下,我需要从“ jar1”中获取一个文件,称为“ Class2Bloaded”。问题在于该文件实现了在“ jar2”中可以找到的接口,我们称其为“ Dependency”
我想做的是,从我的类在src的“ ClassThatLoads.java”下,加载“ Class2Bloaded.class”,并告诉类加载器查看“ jar2”以搜索实现接口“ Dependency.class”
到目前为止,我的代码(省略了异常处理):
//Create the URL pointing to Jar1
private URL getJarUrl(JarFile jarFile)
{
return new File(jarFile.getName()).toURI().toURL();
}
URL jar1Url = getJarUrl(jar1);
ClassLoader jar1classLoader = new URLClassLoader(new URL[] { jar1Url });
Class<?> Class2Bloaded = Class.forName(fullClassName, false, jar1classLoader );
因此问题发生在Class.forName
调用内,因为我要加载的类实现了jar 2中的接口。
Exception in thread "main" java.lang.NoClassDefFoundError: com/packagewithinJar2/Dependency
因此,最终我准备了另一个指向“ jar2”的类加载器,甚至获得了所需的实际接口:
URL jar2Url = getJarUrl(jar2);
ClassLoader jar2classLoader = new URLClassLoader(new URL[] { jar2Url });
Class<?> Interface2Bloaded = Class.forName(fullClassName, false, jar2classLoader );
在第二种情况下,“ fullClassName”是“ Class2Bloaded”所依赖的接口的标准名称。只是我无法在javadocs中找到任何东西ClassLoader
,使我能够“注入”依赖项的其他类加载器。希望我的解释清楚。
首先要做的是将jar2添加到您的URLClassLoader读取的jar列表中:
ClassLoader jarclassLoader = new URLClassLoader(new URL[] { jar1Url, jar2Url });
但是通常要做的是从一开始就在您的类路径上添加jar1和jar2。
为此,您将使用java可执行文件的-cp参数。
例如,如果将类编译到bin目录中:
java -cp libext/jar1.jar:libext/jar2.jar:bin ClassThatLoads
这样,您可以在自己的Java源代码中使用无缝的类,并摆脱繁琐的加载部分:
public class ClassThatLoads {
public static void main(String[] args) {
Class2Bloaded stuff = new Class2Bloaded();
//use stuff from here...
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句