【问题标题】:Read a file residing inside a jar being called from another jar file读取驻留在从另一个 jar 文件调用的 jar 中的文件
【发布时间】:2012-10-07 13:09:49
【问题描述】:

我有两个 jar 文件(比如说 jar1 和 jar2)。 jar2 中有一个 xml 文件。我想读取 xml 文件。我用过

public void readXmlFile(){
InputStream resourceAsStream = MainFile.class.getResourceAsStream("/test.xml");
}

但现在我正在使用 jar1 中的类调用此函数

File file = new File(jar2);
URL url = file.toURL();
URL[] urls = new URL[] { url };
ClassLoader cl = new URLClassLoader(urls);
Class<?> compositeClass = cl.loadClass(XmlFileReader);
Method declaredMethod = compositeClass.getDeclaredMethod("readXmlFile");
Object newInstance = compositeClass.newInstance();
declaredMethod.invoke(newInstance); 

现在我收到 FileNotFoundException,因为在 jar1 而不是在 jar2 中搜索 xml 文件,我不知道为什么会这样。谁能帮帮我?

【问题讨论】:

  • 我能想到的唯一原因是我正在尝试使用 jar2 中的 ClassLoader 加载文件,并且 jar2 是从 jar1 调用的,因此可能只是使用了 jar1 的 classlaoder所以该文件正在 jar1 中而不是 jar2 中查找..请帮助
  • 你试过了吗compositeClass = Class.forName("fqcn.XmlFileReader", cl)
  • 你也可以试试file.getAbsoluteFile().toURL()
  • 您可以使用 getParent() 获取父类加载器,直到您拥有“引导”类加载器。您也可以尝试 getSystemClassloader()。两者都是 ClassLoader 类的方法,并返回一个 ClassLoader。
  • @shyam:你提供的解决方案不起作用,我尝试了这两种方法..

标签: java xml file jar classloader


【解决方案1】:

我找到的唯一解决方案是使用我的 jar1 中的 System.setProperty(key, value) 作为包含我的两个 jar 的文件夹的路径来设置系统属性。然后我读回我的 jar2 中的系统属性,然后像这样修改我的 readXml 方法

public void readXmlFile(){ 
JarFile jarFile = new JarFile(pathToJar2);
JarEntry entry = jarFile.getJarEntry("/test.xml");
InputStream inputStream = jarFile.getInputStream(entry);}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多