使用 URLClassLoader 动态加载 JAR?

发布于 2024-10-11 09:24:42 字数 159 浏览 2 评论 0原文

我有一个程序需要能够在运行时动态加载 JAR - 环顾四周后我相信它使用了 URLClassLoader,但我不确定如何让它工作。 JAR“openup.jar”与程序位于同一目录中。

理想情况我希望能够加载这个 JAR,而不必指定其中的每个单独的类。

I have a program which needs to be able to dynamically load JARs at runtime - after looking around I beleive this uses URLClassLoader, but I'm not sure how to get it to work. The JAR "openup.jar" is in the same directory as the program.

Ideally I would like to be able to load this JAR without having to specify each individual class inside it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无需解释 2024-10-18 09:24:42

我成功使用的内容:

@SuppressWarnings("unchecked")
public void addURL(URL u) throws IOException {
    URLClassLoader sysLoader = (URLClassLoader) ThisClass.class.getClassLoader();
    URL urls[] = sysLoader.getURLs();
    for (int i = 0; i < urls.length; i++) {
        if (urls[i].toString().equalsIgnoreCase(u.toString())) {
            return;
        }
    }
    Class sysclass = URLClassLoader.class;
    try {
        Method method = sysclass.getDeclaredMethod("addURL", parameters);
        method.setAccessible(true);
        method.invoke(sysLoader, new Object[] { u });
    } catch (Throwable t) {
        throw new IOException("Error, could not add URL to system classloader");
    }
}

中确实提出了几乎相同的解决方案我应该如何在运行时动态加载 Jas?

What I successfully used:

@SuppressWarnings("unchecked")
public void addURL(URL u) throws IOException {
    URLClassLoader sysLoader = (URLClassLoader) ThisClass.class.getClassLoader();
    URL urls[] = sysLoader.getURLs();
    for (int i = 0; i < urls.length; i++) {
        if (urls[i].toString().equalsIgnoreCase(u.toString())) {
            return;
        }
    }
    Class sysclass = URLClassLoader.class;
    try {
        Method method = sysclass.getDeclaredMethod("addURL", parameters);
        method.setAccessible(true);
        method.invoke(sysLoader, new Object[] { u });
    } catch (Throwable t) {
        throw new IOException("Error, could not add URL to system classloader");
    }
}

An almost identical solution is indeed presented in How should I load Jars dynamically at runtime?

梦言归人 2024-10-18 09:24:42

这里我解释一下创建 jar 然后在另一个项目中动态加载 jar 的完整过程:

创建 jar 的步骤:

  1. 在任何 IDE(Eclipse)中创建一个新项目。
  2. 在包中添加示例类(在我的例子中为 MyClass)。
  3. 右键单击该项目,然后导出为 jar 并提供 jar 想要保留的系统位置的本地路径(右键单击 -> 导出 -> 选择 java/jar 文件 -> 下一步 -> 给出路径 -> 完成)。
  4. 然后 jar 将在给定位置可用。

包 newJar.com.example;

public class MyClass {

public MyClass() {
    // TODO Auto-generated constructor stub
}

public void helloWorld() {
    System.out.println("Hello from the helloWorld");
}

}

动态加载 jar 的步骤:

  1. 创建一个新项目并添加以下代码:

    公共类自定义类{

    公共自定义类() {
    // TODO 自动生成的构造函数存根
    }

    公共无效getCall(文件myJar){

    <前><代码>尝试{

    URLClassLoader 加载器 = new URLClassLoader(new URL[] { myJar.toURI().toURL() },
    CustomClass.class.getClass().getClassLoader());

    类 classToLoad = Class.forName("newJar.com.example.MyClass", true, loader);
    System.out.println(classToLoad);
    方法方法 = classToLoad.getDeclaredMethod("helloWorld");
    对象实例 = classToLoad.newInstance();
    对象结果 = method.invoke(instance);

    } catch (MalformedURLException | ClassNotFoundException | NoSuchMethodException | SecurityException
    |实例化异常 |非法访问异常 |非法参数异常
    |调用目标异常 e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    }

    }

    公共静态无效主(字符串[] args){
    // TODO 自动生成的方法存根

     File myJar = new File("jar 的路径");//"D:\\ECLIPSE\\myjar.jar"
     CustomClass cls = new CustomClass();
     cls.getCall(myJar);
    

    }

}

这就是它如何使用 jar,如果 jar 位于服务器上,则可以提供服务器路径而不是本地路径。

Here I am explaining the full process of creating a jar and then loading a jar dynamically in another project:

Steps to create jar:

  1. Create a new Project in any IDE(Eclipse).
  2. Add a Sample class in packages(in my case MyClass).
  3. Do right-click on the project and then export as jar and give a local path of system location where the jar wants to keep(right-click -> Export -> choose java/jar file -> next ->give path -> finish).
  4. Then jar will be available at given location.

package newJar.com.example;

public class MyClass {

public MyClass() {
    // TODO Auto-generated constructor stub
}

public void helloWorld() {
    System.out.println("Hello from the helloWorld");
}

}

Steps to load the jar dynamically:

  1. Create a new project and add below code:

    public class CustomClass {

    public CustomClass() {
    // TODO Auto-generated constructor stub
    }

    public void getCall(File myJar) {

     try {
    
         URLClassLoader loader = new URLClassLoader(new URL[] { myJar.toURI().toURL() },
                 CustomClass.class.getClass().getClassLoader());
    
         Class classToLoad = Class.forName("newJar.com.example.MyClass", true, loader);
         System.out.println(classToLoad);
         Method method = classToLoad.getDeclaredMethod("helloWorld");
         Object instance = classToLoad.newInstance();
         Object result = method.invoke(instance);
    
     } catch (MalformedURLException | ClassNotFoundException | NoSuchMethodException | SecurityException
             | InstantiationException | IllegalAccessException | IllegalArgumentException
             | InvocationTargetException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
     }
    

    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub

     File myJar = new File("Path of your jar ");//"D:\\ECLIPSE\\myjar.jar"
     CustomClass cls = new CustomClass();
     cls.getCall(myJar);
    

    }

}

This is how it can make use of the jar and if the jar is on the server then can give the server path instead of the local path.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文