java - 在运行时加载 jar

标签 java jar runtime

我正在尝试在运行时将 jar 文件添加到类路径中。我用这个代码

 public static void addURL(URL u) throws IOException {

            URLClassLoader sysloader = (URLClassLoader) ClassLoader
                    .getSystemClassLoader();
            Class<URLClassLoader> sysclass = URLClassLoader.class;

            try {
                Method method = sysclass.getDeclaredMethod("addURL", parameters);
                method.setAccessible(true);
                method.invoke(sysloader, new Object[] { u });
                System.out.println(u);
            } catch (Throwable t) {
                t.printStackTrace();
                throw new IOException("Error");
            }

        }

系统输出打印这个 url:

file:/B:/Java/Tools/mysql-connector-java-5.1.18/mysql-connector-java-5.1.18/mysql-connector-java-5.1.18-bin.jar

我仔细检查了这条路径,这个 jar 存在。即使这个测试显示com.mysql.jdbc。 存在驱动类。

javap -classpath "B:\Java\Tools\mysql-connector-java-5.1.18\
mysql-connector-java-5.1.18\mysql-connector-java-5.1.18-bin.jar" com.mysql.jdbc.
Driver
Compiled from "Driver.java"
public class com.mysql.jdbc.Driver extends com.mysql.jdbc.NonRegisteringDriver i
mplements java.sql.Driver{
    public com.mysql.jdbc.Driver()       throws java.sql.SQLException;
    static {};
}

但是当我使用这个 Class.forName(driver) 时,我仍然得到 java.lang.ClassNotFoundException。 这段代码有什么问题?

最佳答案

URL 没问题,但是您尝试从类路径加载一个 jar,所以这意味着您需要先在 cp 中拥有该文件。 在你的情况下,你想加载一个不在类路径中的 jar,所以你必须使用 URLClassLoader 和 JAR 你也可以使用 JARClassLoader 如果你想要一些示例类(class): http://docs.oracle.com/javase/tutorial/deployment/jar/jarclassloader.html

这是我自己运行的示例,看看是否对您有帮助。它搜索不在我的类路径中的 Log4j 的 Logger 类,当然我在调用构造函数时遇到异常,因为我没有将正确的参数传递给构造函数

package org.stackoverflow;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

public class URLClassLoaderSample
{
  public static void main(String[] args) throws Exception
  {
    File f = new File("C:\\_programs\\apache\\log4j\\v1.1.16\\log4j-1.2.16.jar");
    URLClassLoader urlCl = new URLClassLoader(new URL[] { f.toURL()},System.class.getClassLoader());
    Class log4jClass = urlCl.loadClass("org.apache.log4j.Logger");
    log4jClass.newInstance();
  }
}



Exception in thread "main" java.lang.InstantiationException: org.apache.log4j.Logger
    at java.lang.Class.newInstance0(Class.java:357)
    at java.lang.Class.newInstance(Class.java:325)
    at org.stackoverflow.URLClassLoaderSample.main(URLClassLoaderSample.java:19)

由于调用错误导致的异常,但是在这个阶段我们已经找到了类

关于java - 在运行时加载 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10624907/

相关文章:

java - 父类(super class)不能分配给运行时由 asm 实现的类

c++ - 在运行时加载语法

java - 大输入的运行时错误

java - 异常循环

java - 这些泛型语句之间有什么区别?

java - 我的第一个 Android 应用无法在我的 Android 设备(手机)中正常运行

java - 从Java中的矩阵获取所有 vector

java - MANIFEST.MF 中的条目顺序

java - 编辑 jar 文件后没有任何变化

linux - 在 Unix/Linux 中提取 Jar 的最佳方法?