从依赖于另一个jar的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”所依赖的接口的标准名称。只是我无法在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从一个jar文件中加载一个依赖于另一个库的库

一个CSS类依赖于另一个

如何使用命令行创建一个 jar,其中一个类依赖于同一项目中的另一个类?(请不要使用构建工具!)

如何键入依赖于另一个类参数值的类参数?

运行依赖于另一个Java类的Java文件

如何使用@InjectMocks依赖于另一个要模拟的类?

setState 依赖于另一个类的值

解耦依赖于另一个类的类,该类的构造函数接受参数

如何测试依赖于另一个服务(又依赖于Http服务)的服务/组件?

PHPUnit测试一个依赖于另一个方法的方法

如何使一个Maven模块依赖于另一个?

测试一个对象是否依赖于另一个对象

创建一个依赖于另一个Pod的Pod

Django:一个modelChoiceField 依赖于另一个modelChoiceField

一个按钮依赖于另一个被单击

在cmake中,如何使一个目标依赖于另一个目标?

在Swift中从UIViewController继承的类中是否可以初始化依赖于另一个变量?

构造对象,其属性之一依赖于另一个。在C ++中

React-提取和显示依赖于另一个提取的数据

依赖于另一个列表框的用户窗体列表框

Python:如何从依赖于模块的另一个文件中正确导入函数

如何编写依赖于另一个定义文件的打字稿定义文件

使下拉列表依赖于MVC Core中的另一个下拉列表

类型属性依赖于另一个属性的返回类型

编译依赖于另一个扩展的VS Code扩展时出错

WPF 按钮位置依赖于另一个元素

如何使用 Kotlin/native 生成依赖于另一个的 .framework?

重复的angularjs依赖于另一个重复

如何使参数的默认值依赖于另一个参数(在Python中)?