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

标签 java classloader

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

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

我想做的是,从 src“ClassThatLoads.java”下的类中加载“Class2Bloaded.class”并告诉类加载器查看“jar2”以搜索实现接口(interface)“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 中的接口(interface)。

Exception in thread "main" java.lang.NoClassDefFoundError: com/packagewithinJar2/Dependency

所以最终我准备了另一个指向“jar2”的类加载器,我什至得到了我需要的实际接口(interface):

URL jar2Url = getJarUrl(jar2);
  ClassLoader jar2classLoader = new URLClassLoader(new URL[] { jar2Url });
  Class<?> Interface2Bloaded = Class.forName(fullClassName, false, jar2classLoader );

第二种情况中的“fullClassName”是“Class2Bloaded”所依赖的接口(interface)的完全限定名称。 只是我在 ClassLoader 的 javadoc 中找不到任何允许我为依赖项“注入(inject)”附加类加载器的内容。 我希望我的解释很清楚。

最佳答案

要做的第一件事是将 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...
  }
}

关于java - 从依赖于另一个 jar 的 jar 加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41464706/

相关文章:

java - Eclipse 找不到主要方法

java - 如何在 Android 上跟踪 "like"系统?

java - 什么是 Java 类加载器?

java - 如何防止类路径上的第三方 JAR 覆盖我的类依赖项?

java - 自定义类加载器有什么用

java - AngularJS - 没有 Web 服务器的独立 - 调用 CXF REST 服务时出错

java - Spring 3、Spring Security、LDAP、如何向 LDAP 添加角色?

java - seam iText 集成库

java - 使用 ByteBuddy 装饰 ClassLoader 方法

java - 如何在 Tomcat 中为 WebappClassLoader 设置日志记录?