【问题标题】:Load a class from a jar having dependency on another jar从依赖于另一个 jar 的 jar 加载一个类
【发布时间】:2017-01-04 21:35:04
【问题描述】:

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

所以在lib-ext 下,我每天从 Jenkins 服务器下载 2 个 jar 文件 'jar1 和 jar2' 以供我的程序检查,我需要来自 'jar1' 的一个文件让我们称之为:“Class2Bloaded”。 问题是这个文件实现了一个可以在“jar2”中找到的接口,我们称之为“依赖”

我想做的是,从我在 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 中找不到任何允许我为依赖项“注入”一个额外的类加载器的东西。 我希望我的解释清楚。

【问题讨论】:

  • 这些问题是我喜欢maven的原因
  • 为什么不把两个类都放在类路径中,然后简单地加载默认的ClassLoader来加载Class2Bloaded
  • 一个URLClassLoader 可以加载任意数量的 JARS....不仅仅是 1 个
  • @GyroGearless 谢谢,我把两个 jar 放到一个类加载器中,它工作正常

标签: java classloader


【解决方案1】:

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

【讨论】:

  • 谢谢,第一个解决方案是目前最合适的解决方案,正如我在 Gyro Gearless 问题的 cmets 中提到的那样
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2012-12-28
  • 1970-01-01
  • 2013-12-31
  • 2011-02-27
  • 1970-01-01
相关资源
最近更新 更多