繁体   English   中英

从依赖于另一个jar的jar加载类

[英]Load a class from a jar having dependency on another jar

我的项目结构如下(当然非常简化): 项目结构

因此,在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”所依赖的接口的标准名称。 只是我在ClassLoader的javadocs中找不到任何东西,允许我为依赖项“注入”其他类加载器。 希望我的解释清楚。

首先要做的是将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...
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM