Java自动加载程序目录下的jar包

Wesley13
• 阅读 705

Java有个比较傻的地方,没有提供从程序目录加载jar包的功能,包括class-path等的配置,全部基于【相对于当前工作目录路径】和【绝对路径】两种,并没有【相对于程序路径】。

网上找了一些资料,东拼西凑把这个功能实现了。在需要的时候调用即可。

package example.autoload;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class Utils {
    public static String getApplicationFolder() {
        String path = Utils.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        return new File(path).getParent();
    }

    public static void loadJarsFromAppFolder(String sub_folder) throws Exception {
        String path = getApplicationFolder() + File.pathSeparator + sub_folder;
        File f = new File(path);
        if (f.isDirectory()) {
            for (File subf : f.listFiles()) {
                if (subf.isFile()) {
                    loadJarFile(subf);
                }
            }
        } else {
            loadJarFile(f);
        }
    }

    public static void loadJarFile(File path) throws Exception {
        URL url = path.toURI().toURL();
        URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
        method.setAccessible(true);
        method.invoke(classLoader, url);
    }
}


package example.autoload;

public class test {

    public static void main(String[] args) {
        try {
            Utils.loadJarsFromAppFolder("lib");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java Compiler API
在早期的版本中(JavaSE5及以前版本)中只能通过tools.jar中的com.sun.tools.javac包来调用Java编译器,但由于tools.jar不是标准的Java库,在使用时必须要设置这个jar的路径。而在JavaSE6中为我们提供了标准的包来操作Java编译器,这就是javax.tools包。编译java文件
技术小男生 技术小男生
3年前
tongweb部署应用的时候出现java.lang.ClassNotFoundException处理办法
1:当通过tongweb部署应用的时候经常会遇到java.lang.ClassNotFoundException这种错误。2:当出现这种报错的时候代表应用缺少某个class文件,需要通过报错的具体的路径去寻找对应的jar包,找到之后放到%tongweb%/lib目录下面。例如:Causedby:java.lang.ClassNotFoundExceptio
Easter79 Easter79
3年前
springboot服务优雅关机脚本
阅读文本大概需要3分钟。自从使用springboot开发项目后,服务很多时候都是打成jar包,然后通过javajarxx.jar的方式来启动程序的。比如下面这个脚本就是启动payserver的脚本,加载prd配置文件,启动后在后台运行,将日志写在jar包目录下的pafa.log 里!/bin/bash eja
东方客主 东方客主
3年前
Android动态加载基础 ClassLoader工作机制
类加载器ClassLoader早期使用过Eclipse等Java编写的软件的同学可能比较熟悉,Eclipse可以加载许多第三方的插件(或者叫扩展),这就是动态加载。这些插件大多是一些Jar包,而使用插件其实就是动态加载Jar包里的Class进行工作。这其实非常好理解,Java代码都是写在Class里面的,程序运行在虚拟机上
Wesley13 Wesley13
3年前
Java项目读取resources资源文件路径那点事
  今天在Java程序中读取resources资源下的文件,由于对Java结构了解不透彻,遇到很多坑。正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径。在本地工程和服务器中读取文件的方式有所不同,以下图配置文件为例: !(https://oscimg.oschina.net/o
Stella981 Stella981
3年前
MyBatis入门程序(基于XML配置)
创建一个简单的MyBatis入门程序,实现对学生信息的增删改查功能(基于XML配置)一、新建一个Java工程,导入MyBatis核心jar包、日志相关的jar包以及连接Oracle数据库所需驱动包,目录结构如下!(https://oscimg.oschina.net/oscnet/28c5fe2affd83c527baffdfd799ff796f
Wesley13 Wesley13
3年前
Unable to instantiate activity ComponentInfo
不知道怎么回事,在libs中添加了jar包后,无法给jar包附加上源码,于是采取以下措施:删除自动生成的依赖:在AndroidDependences目录上右击BuildPathRemovefromBuildPath然后往libs中拖入jar包,然后添加jar的引用,这样,就可以给jar包附上源码了。但是运行程序的时候
Wesley13 Wesley13
3年前
Java类加载机制
启动(Bootstrap)类加载器启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C语言实现的,是虚拟机自身的一部分,它负责将<JAVA\_HOME/lib路径下的核心类库或Xbootclasspath参数指定的路径下的jar包加载到内存中,注意必由于虚拟机是按照文件名识别加载jar包的,如rt.jar,如果文件名不被虚拟机
Wesley13 Wesley13
3年前
JAR冲突问题的解决以及运行状态下如何查看加载的类
今天碰到群里小伙伴问,线上程序好像有多个不同版本的Netty包,怎么去看到底加载了哪一个?在说如何看之前,先来说说,当你开始意识到项目里有多个不同版本的Jar包,都是因为遇到了这几个异常:1.java.lang.NoSuchMethodException:自己代码中调用了某个方法,因为加载了其他版本的jar,这个版本正好没这个方法。2.