当前位置: 首页 > 面试题库 >

在运行时加载jar

孔安阳
2023-03-14
问题内容

我试图在运行时将jar文件添加到classpath。我用这个代码

 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。如果您希望在其上获得一些示例课程,请访问: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字节码(即已编译的Java源代码)。现在,我想将此字节代码加载到当前运行的Java- VM中并运行特定功能。我不确定如何做到这一点,我对Java类加载器进行了一些研究,但没有找到直接的方法。 我找到了一个在硬盘上接收类文件的解决方案,但是我得到的字节码在字节数组中,我不想将其写入磁盘,而是直接使用它。 谢谢! 问题答案: 您需要编写一个自定义的类加载器

  • 问题内容: 我被要求构建一个Java系统,该系统在运行时能够加载新代码(扩展)。我的代码运行时如何重新加载jar文件?或如何加载新的jar? 显然,由于持续的正常运行时间很重要,因此,我想增加在此过程中重新加载现有类的功能(如果这样做不会使事情复杂化)。 我应该注意什么?(将其视为两个不同的问题-一个关于在运行时重新加载类,另一个关于添加新类)。 问题答案: 用现有数据重新加载现有类可能会破坏事情

  • 摘要:从正在运行的Java程序加载jar会导致由类间依赖(例如语句)引起的引起的。我如何绕过它? 更详细的问题是: 我试图通过自己的Java程序将jar文件(我们称之为“服务器”)以编程方式加载到Java虚拟机中(我们称之为“ServerAPI”),并使用扩展和其他一些技巧来修改服务器的行为并与之交互。ServerAPI依赖于服务器,但如果服务器不存在,ServerAPI仍然必须能够从网站上运行和

  • 问题内容: 我试图在运行ajax调用时显示加载图像,但是使用该属性不会更改结果区域。 提前致谢。 问题答案: 我有一个解决方案,它可能不是最好的方法,但在这种情况下有效。 通过在调用ajax函数之前设置共振内容,它将一直显示加载文本,直到ajax调用更新相同的内容为止。 感谢所有花时间回答的人。 艾伦

  • 问题内容: 是否可以在运行时动态加载Django应用?通常,应用是在初始化时使用settings.py中的INSTALLED_APPS元组加载的。但是,是否可以在运行时加载其他应用程序?我在不同情况下遇到此问题。例如,一种情况是在测试期间出现的,当时我想动态加载或卸载应用程序。 为了使问题更具体,想象一下我有一个名为我放置应用程序的目录,并且我想自动安装安装在其中的任何新应用程序,而无需手动编辑s

  • 我想在运行时加载一些scala类,该类在我的scala项目中呈现。更准确地说,在我项目的根文件夹中,我有tmpcaseclass.scala: 我想编译它,并在运行时使用工具箱,如下所示: 但我遇到了follwing错误: