精华内容
下载资源
问答
  • 在c/s结构的应用中,很多时候我们都需要在启动时指定很多jar文件的路径,jar少点还好,多了就很麻烦,还要...加载jar的代码:private static class JarLoader {private URLClassLoader urlClassLoader;public J...

    在c/s结构的应用中,很多时候我们都需要在启动时指定很多jar文件的路径,jar包少点还好,多了就很麻烦,还要维护他。

    为方便起见,程序启动时,由main函数动态去加载指定路径下的jar文件到jvm,这样启动命令就干净了很多。

    加载jar包的代码:

    private static class JarLoader {

    private URLClassLoader urlClassLoader;

    public JarLoader(URLClassLoader urlClassLoader) {

    this.urlClassLoader = urlClassLoader;

    }

    public void loadJar(URL url) throws Exception {

    Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);

    addURL.setAccessible(true);

    addURL.invoke(urlClassLoader, url);

    }

    }

    private static void loadjar(JarLoader jarLoader, String path) throws MalformedURLException, Exception{

    File libdir = new File(path);

    if (libdir != null && libdir.isDirectory()) {

    File[] listFiles = libdir.listFiles(new FileFilter() {

    @Override

    public boolean accept(File file) {

    // TODO Auto-generated method stub

    return file.exists() && file.isFile() && file.getName().endsWith(".jar");

    }

    });

    for (File file : listFiles) {

    jarLoader.loadJar(file.toURI().toURL());

    }

    }else{

    System.out.println("[Console Message] Directory ["+path+"] does not exsit, please check it");

    System.exit(0);

    }

    }

    public static void main(String[] args) {

    JarLoader jarLoader = new JarLoader((URLClassLoader)ClassLoader.getSystemClassLoader());

    loadjar(jarLoader, System.getProperty("user.dir")+"/lib");

    }

    这样,我们在启动的时候就java -jar app.jar 就好了,其他Jar包由main函数搞定。

    展开全文
  • 最近做一个远程接口测试系统,遇到了动态加载jar的问题,如将用户上传的jar动态加载后调用远程接口的方法,特将例子记录下来以便查找。package cn.baokx.test_addjar;import java.io.File;import java.lang....

    最近做一个远程接口测试系统,遇到了动态加载jar包的问题,如将用户上传的jar包动态加载后调用远程接口的方法,特将例子记录下来以便查找。

    package cn.baokx.test_addjar;

    import java.io.File;

    import java.lang.reflect.InvocationTargetException;

    import java.lang.reflect.Method;

    import java.net.MalformedURLException;

    import java.net.URL;

    import java.net.URLClassLoader;

    public class Main {

    public static void main(String[] args) throws NoSuchMethodException,

    SecurityException, MalformedURLException, ClassNotFoundException,

    InstantiationException, IllegalAccessException,

    IllegalArgumentException, InvocationTargetException {

    loadJar(Main.class.getResource("/lib/test.jar").getPath());

    Class clazz = Class.forName("cn.baokx.testjar.Demo1");

    Object obj = clazz.newInstance();

    Method method = clazz.getMethod("fun1");

    method.invoke(obj);

    }

    public static void loadJar(String jarPath) {

    File jarFile = new File(jarPath);

    // 从URLClassLoader类中获取类所在文件夹的方法,jar也可以认为是一个文件夹

    Method method = null;

    try {

    method = URLClassLoader.class

    .getDeclaredMethod("addURL", URL.class);

    } catch (NoSuchMethodException | SecurityException e1) {

    e1.printStackTrace();

    }

    // 获取方法的访问权限以便写回

    boolean accessible = method.isAccessible();

    try {

    method.setAccessible(true);

    // 获取系统类加载器

    URLClassLoader classLoader = (URLClassLoader) ClassLoader

    .getSystemClassLoader();

    URL url = jarFile.toURI().toURL();

    method.invoke(classLoader, url);

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    method.setAccessible(accessible);

    }

    }

    }

    展开全文
  • 最近在学习java的反射和注解,实际情景中需要扫描某个下的所有java类,然后使用类加载加载类。基本思路,获得程序的路径扫描src下某个内的子java类,实现也比较简单。运行环境:windows10+jdk1.8+eclipse...

    最近在学习java的反射和注解,实际情景中需要扫描某个包下的所有java类,然后使用类加载器加载类。

    基本思路,获得程序的路径扫描src下某个包内的子包和java类,实现也比较简单。

    运行环境:windows10+jdk1.8+eclipse

    直接贴代码

    packageorg.test.scanner;importjava.io.File;importjava.util.ArrayList;importjava.util.List;/** date:2019-07-23

    **/

    public classPackageScanner {private List>classes;private String packagePath = null;/** 无参构造方法,内部调用带参的构造方法。

    *

    * @throw classNotFound

    **/

    public PackageScanner() throwsClassNotFoundException {this("");

    }/** 实现,调用fileScanner进行目录扫描和加载

    *

    * @param String 传入需要扫描的包

    *

    * @throw classNotFound*/

    public PackageScanner(String basePackage) throwsClassNotFoundException {

    packagePath= System.getProperty("user.dir") + "\\src\\";

    String filePath= packagePath + basePackage.replace('.', '\\');

    classes= new ArrayList>();

    fileScanner(newFile(filePath));

    }private void fileScanner(File file) throwsClassNotFoundException {if (file.isFile() && file.getName().lastIndexOf(".java") == file.getName().length() - 5) {//5是".java"的长度

    String filePath =file.getAbsolutePath();

    String qualifiedName= filePath.substring(packagePath.length(), filePath.length() - 5).replace('\\', '.');

    System.out.println(qualifiedName);

    classes.add(Class.forName(qualifiedName));return;

    }else if(file.isDirectory()) {for(File f : file.listFiles())

    fileScanner(f);

    }

    }/** 得到加载到的类对象的List,返回的是ArrayList*/

    public List>getClasses() {return this.classes;

    }

    }

    这是一个简单的包扫描类,这里直接使用Class.forName()加载扫描到的类

    我们可以看一下forName实现

    public static Class> forName(String className) throws ClassNotFoundException {

    return forName0(className, true, ClassLoader.getCallerClassLoader());

    }

    发现调用了ClassLoader.getCallerClassLoader()

    从名字上可以看出是得到调用类的类加载器,我们可以看一下它的实现

    static ClassLoader getCallerClassLoader() {

    // NOTE use of more generic Reflection.getCallerClass()

    Class caller = Reflection.getCallerClass(3);

    // This can be null if the VM is requesting it

    if (caller == null) {

    return null;

    }

    return caller.getClassLoader0();

    }

    关键一句: Reflection.getCallerClass(3)。

    一直往上传递,直到获取到它的调用类,然后得到调用类的类加载器

    其中 REflection.getCallerClass()的参数有:

    0 和小于0  -   返回 Reflection类

    1  -   返回自己的类

    2  -    返回调用者的类

    3. 4. ....层层上传。

    最后的目的就是谁调用这个类,调用类的类加载器就负责加载这个类。只有当它的加载类为null时,即没有任何加载器可用时,才使用getClassLoader0()这个native方法,这是启动类加载器的实现方法,如果不是java lib目录里的库,该类是不会被加载的。

    通过学习java 的包扫描和类加载,我简单的了解了java类加载器的用法。

    能力有限,如有错误请告知一声。

    ps:学而不思则罔,思而不学则殆。

    展开全文
  • 参考了几篇文章加载jar的类URLClassLoader中使用的方法为addURL,但是这个方法是protected类型分别用了两种方法一、反射到这个类Methodadd=URLClassLoader.class.getDeclaredMethod("addURL",newClass[]{URL.class...

    参考了几篇文章

    加载jar包的类URLClassLoader中使用的方法为addURL,但是这个方法是protected类型

    分别用了两种方法

    一、

    反射到这个类

    Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });

    add.setAccessible(true);

    然后再执行add加载jar包,之后再次反射获取需要执行的类

    URLClassLoader classloader = (URLClassLoader)ClassLoader.getSystemClassLoader();

    URL url = new File(jarPath).toURI().toURL();

    add.invoke(classloader, new Object[] { url });

    Class> clazz = Class.forName(className);

    Method method = clazz.getDeclaredMethod("xxxx");

    method.invoke(clazz.newInstance());

    最开始使用的是下面的方法,感觉简单,但是由于没设置parentClassLoader,导致出现各种bug,最后虽然调通了,但是依然选择了上面的方法(不确定是否还有其他问题)

    二、

    文章中先建立个子类,这样可以执行addURL这个方法了

    static class MyClassLoader extends URLClassLoader {

    public MyClassLoader(URL[] urls) {

    super(urls);

    }

    public MyClassLoader(URL[] urls, ClassLoader parent) {

    super(urls, parent);

    }

    public void addJar(URL url) {

    this.addURL(url);

    }

    }

    加载jar,并执行

    URL[] urls = new URL[] {};

    MyClassLoader classLoader = new MyClassLoader(urls,ClassLoader.getSystemClassLoader())

    try {

    classLoader.addJar(new File("c:/hello.jar").toURI().toURL());

    Class> clazz = classLoader.loadClass("pakcagename.classname");

    Method method = clazz.getDeclaredMethod("run");

    method.invoke(clazz.newInstance());

    classLoader.close();

    } catch (Exception e) {

    e.printStackTrace();

    }

    另、

    如果是本地jar的话,这样就ok了,在hdfs上的话,会有点问题,URL不支持hdfs协议

    URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());

    这样就支持hdfs协议了,path就可以转url了,当然,得加载下hdfs相关配置文件,获取FileSystem实例

    Path path = fs.getFileStatus(new Path(jarPath)).getPath();

    URL url = path.toUri().toURL();

    classLoader.addJar(url);

    只运行普通jar的话,在hdfs上是可以的

    但是

    如果加载的是mapreduce程序的jar包,只能是本地路径,不能使用hdfs路径,在setJarByClass方法中,是需要寻找到jar包绝对路径的

    ----------------------------------------------

    使用一段时间后发现,进程是不停的,需要加载的jar包是可能需要修改的,所以导致多次加载不同版本的jar包之后,程序会有bug,读不到最新的jar包,不太可能更新jar包就重启下程序

    于是,又研究了下classloarder,在当前线程加载jar包比较保险,线程结束会释放掉,保证每次加载都是最新的,而且也不占内存

    (URLClassLoader)ClassLoader.getSystemClassLoader();改为当前线程类加载器

    (URLClassLoader)Thread.currentThread().getContextClassLoader();

    展开全文
  • 本人JAVA菜鸟,弱弱的问个问题(Centos6.4环境JDK7):我写了个JAVA脚本,路径为:/tmp/Test.java,其中用到了第三方Java路径为/java/mylib/xxx.jar--我通过javac-classpath/java/...本人JAVA菜鸟,弱弱的问个问题 ...
  • 在Eclipse上创建Web项目,默认会产生一个WebRootWEB-INFlib目录,jar复制到该目录后会自动加载到Web App Libraries库中,效果如下:而如果创建普通的Java项目,一般需要自己创建一个lib目录,再将jar复制到该...
  • https://blog.csdn.net/itachiwwwg/article/details/9003261当java的源代码中出现了和系统的lib库中的包名与类名完全一样的类时,系统应当怎么加载?我们都知道在JVM启动的时候会先调用bootstrap classloader 加载...
  • JAVA通过类加载器名称、包名、类名、方法唯一确定一个方法,因此JAR冲突可以通过改变类加载器实现。JAVA8及以下版本破坏双亲委派机制,实现JAVA类隔离加载依赖 loadClass()方法实现。JAVA9开始模块化后,加载器...
  • 简述java加载机制? 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。 描述一下JVM加载Class文件的原理机制 Java中的所有类,都需要由类...
  • (转)jar加载顺序

    千次阅读 2021-02-25 19:11:55
    加载顺序:1.$java_home/lib 目录下的java核心api2.$java_home/lib/ext 目录下的java扩展jar3.java -classpath/-Djava.class.path所指的目录下的类与jar4.$CATALINA_HOME/common目录下按照文...
  • 本篇文章给大家带来的内容是关于Java动态类加载和重新加载的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。Java中可以在运行时加载和重新加载类,虽然并不像我们想像中那么简单。本文将...
  • 我最近发了一篇文章Update Java code during runtime,经过几个小时摆弄不同的示例代码和阅读教程后,我遇到了以下问题:通过使用ClassLoader,我可以在运行时使用...的代码将类MyVar1中的局部变量更改为类MyVar2,但是我...
  • 这一切都在 Tomcat’s ClassLoading HOW-TO中描述。它不一定是按字母顺序排列的。如果您观察到这种行为,如果您打算将WebApp在服务器... 对于每个加载程序,只要JVM需要导入/执行并且尚未加载,JVM将按顺序加载这些类。
  • /** * @author wangcanfeng * @description jar包加载器 * @Date Created in 10:11-2019/9/10 */ public class JarLoader { public JarLoader() { //NO_OP } /** * 功能描述: 扫描一个文件夹下面的所有jar,不包含...
  • java加载so文件

    2021-02-28 19:10:49
    java 程序从文件夹动态加载“SomeClass”脚本。然后,该脚本从 Internet 下载.jar 文件,并在其中打开并运行“LoadedClass”脚本。 如果 SomeClass 不在同一个.jar ......再在Java中通过 System.loadLibrary加载 so 库...
  • java图形化编程主要依赖于awt以及swing,这两个包中提供了大部分基本控件。 编程人员基本可以通过从包中查找相关组件,通过相关语法,即可完成相应的图形化编程(此处不赘述)。 现在谈谈如何实现将java编辑的图形化...
  • 以达到客户可以自己动态增加相关功能的目的,然后我们就根据需求制定出接口,再由客户自己实现接口,通过项目提供的相应界面将实现的jar上传,由服务器应用对jar进行热加载/卸载,jar的热加载java原生的一些...
  • 这跟web没关系,是java的类加载机制。这个问题是jvm固有的。有这么几种情况:第一种,A和B两个jar都有同一个来自于C的类。但是他们没有用C.jar,而直接把C.jar里的那个类打到A和B里了。根据加载机制,JVM只会加载...
  • 我正在尝试在Java中运行时加载linux .so文件,但我得到了一个UnsatisfiedLinkError.当我从Test.class运行下面的java main时,我正在传递-Djava.library.path = / Users / tom / codebase / jni / dist VM参数. lib...
  • java重新加载类的探寻

    2021-03-06 04:17:18
    java重新加载类的探寻首先上结论:java加载器不支持重新加载类。如果想重新加载,那就新建一个类加载器。接下来慢慢讲:项目背景在近日做的一个项目中,有一个动态获取用户输入的代码,并进行运行的需求。现在遇到...
  • java如何导入

    千次阅读 2021-02-12 10:31:51
    展开全部1、首先在项目下创建一个新的文件夹,用来保存jar。在项目上点击鼠标62616964757a686964616fe4b893e5b19e31333431336665右键,按顺序点击【New】→【Floder】,打开新建文件夹的窗口2、输入文件夹名称...
  • 类的加载顺序什么时候类加载:第一次需要使用类信息时加载。类加载的原则:延迟加载,能不加载就不加载。触发类加载的几种情况:1、调用静态成员时,会加载静态成员真正所在的类及其父类。 通过子类调用父类的静态...
  • 在做项目过程中,发现有些jar不是固定的名称,版本号会变,那么放到maven里无法获取到最新的,那么就需要动态获取jar路径并加载到类加载路径中。 1、调用: String path=System.getProperty("user.dir"); ...
  • java加载时机与过程

    2021-03-06 03:51:02
    加载”(Loading)阶段是“类加载”(Class Loading)过程的第一个阶段,在此阶段,虚拟机需要完成以下三件事情:1、通过一个类的全限定来获取定义此类的二进制字节流。2、将这个字节流所代表的静态存储结构转化为...
  • 所以这个过程中就会有参数对应、包名、路径、方法名称等的一致性要求。否则不是找不到方法,就是实例化不了。 还有2种常见的错误 1.java.lang.UnsatisfiedLinkError: no HelloWorld in java....
  • j今天打代码的时候出现了无法加载主类的情况,我就收集了一些,java无法加载主类的方法ava无法加载主类解决办法今天启动项目,又遇到找不到或无法加载主类的情况,清除项目后无法编译,class文件下没有.class文件,...
  • 在学习反射那一章节时想到自己之前学过的知识,故整理一番,希望能提供一点帮助,水平有限,...1.预先加载这里有Java基础类的加载和含main()函数类的加载。类加载器见文末补充。Java基础类的加载流程:启动程序到...
  • 导读:在实际项目开发中,有时会遇到需动态加载jar的应用场景。如将Flink的UDF自定义方法制作成方法库(既打成一个Jar),在提交给Flink集群的Job中动态加载jar便可使用。下面将举一个简单实现Java动态加载Jar的例子...
  • 加载卸载jar

    2021-03-09 07:23:41
    加载卸载jar2020-12-291 类层次2 源代码hot-load-unload-jar项目PluginClassLoader.java内容如下:packagecom.test;importjava.net.JarURLConnection;importjava.net.URL;importjava.net.URLClassLoader;import...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 800,496
精华内容 320,198
关键字:

java根据包名加载

java 订阅