通过java

时间:2016-03-07 16:24:33

标签: java reflection classloader

我有一个jar文件,它是一个名为lib的单独文件夹,所以我试图从那里加载一个jar,如下面的代码所示,但我得到异常,这是一个错误的异常请告诉我如何纠正这个请告知

import java.net.URL;
import java.net.URLClassLoader;
import java.net.MalformedURLException;

public class JarFileLoader extends URLClassLoader {
  public JarFileLoader(URL[] urls) {
    super(urls);
  }

  public void addFile(String path) throws MalformedURLException {
    String urlPath = "jar:file://" + path + "!/";
    addURL(new URL(urlPath));
  }

  public static void main(String args[]) {
    try {
      System.out.println("First attempt...");
      Class.forName("org.apache.poi.ss.usermodel.HssfSheet");
    } catch (Exception ex) {
      System.out.println("Failed.");
    }
    try {
      URL urls[] = {};
      JarFileLoader cl = new JarFileLoader(urls);
      cl.addFile("/lib/poi3.10final.jar");
      System.out.println("Second attempt...");
      cl.loadClass("org.apache.poi.ss.usermodel.HssfSheet");
      System.out.println("Success!");
    } catch (Exception ex) {
      System.out.println("Failed.");
      ex.printStackTrace();
    }
  }
}

1 个答案:

答案 0 :(得分:0)

这应该是评论,但我没有足够的位置。请不要投票。

我拿了一个存在于我机器上的随机罐子:

  

/home/adenoyelle/.m2/repository/antlr/antlr/2.7.2/antlr-2.7.2.jar

这个jar包含很多类。其中一个是antlr.ActionElement。所以这是我在代码中改变的内容:

try {
  System.out.println("First attempt...");
  Class.forName("antlr.ActionElement"); //Changed this line
} catch (Exception ex) {
  System.out.println("Failed.");
}
try {
  URL urls[] = {};
  JarFileLoader cl = new JarFileLoader(urls);

  //Changed this line
  cl.addFile("/home/adenoyelle/.m2/repository/antlr/antlr/2.7.2/antlr-2.7.2.jar");
  System.out.println("Second attempt...");
  cl.loadClass("antlr.ActionElement"); //Changed this line
  System.out.println("Success!");
} catch (Exception ex) {
  System.out.println("Failed.");
  ex.printStackTrace();
}

输出:

First attempt...
Failed.
Second attempt...
Success!

我的猜测是你的罐子的路径是错误的。我通过提供绝对路径(并且您给出的路径也被解释为可能是问题的根源的绝对路径)以简单的方式完成了它。

请尝试以下方法:

  • cl.addFile( “LIB / poi3.10final.jar”);
  • cl.addFile( “poi3.10final.jar”);
  • cl.addFile( “C:/absolute/path/to/poi3.10final.jar”);