java动态加载jar时,jar中还有第三方jar无法加载的解决方法

当java插件化开发时,即一个java程序在运行的情况下动态加载另一个jar,网上大多数的方法如下

public static void main(String[] args)throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException,IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {String jarPath = "C:\\Users\\ricozhou\\Desktop\\tt.jar";File jarFile = new File(jarPath);String className = "test3.Test1";URL url = jarFile.toURI().toURL();ClassLoader system = new URLClassLoader(new URL[] { url }, Thread.currentThread().getContextClassLoader());Class<?> cs = system.loadClass(className);Object object = cs.newInstance();System.out.println(cs.getMethod("test").invoke(object));}

使用自定义类加载器加载,本来没什么问题,而且示例也都是一些简单的helloworld,但是当tt.jar中引入了第三方jar时,方法test中使用了第三方jar时,则会无法找到第三方类,如:创建一个项目,引入Common lang3

package test3;import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;public class Test1 {public static void main(String[] args) {System.out.println("执行main");System.out.println(StringUtils.isEmpty(null));System.out.println(StringUtils.isEmpty(""));System.out.println(ObjectUtils.anyNotNull(null, null));System.out.println(ObjectUtils.anyNotNull(11, null));System.out.println(RandomUtils.nextBoolean());System.out.println(RandomUtils.nextBoolean());System.out.println(SystemUtils.JAVA_HOME);}public void test() {System.out.println("执行test");System.out.println(StringUtils.isEmpty(null));System.out.println(StringUtils.isEmpty(""));System.out.println(ObjectUtils.anyNotNull(null, null));System.out.println(ObjectUtils.anyNotNull(11, null));System.out.println(RandomUtils.nextBoolean());System.out.println(RandomUtils.nextBoolean());System.out.println(SystemUtils.JAVA_HOME);}
}

导出为普通jar,注意不是可运行jar,因为这只是一个示例,以后可能这是一个类库,不需要main方法的,所以我都是直接打包成普通jar,这样再使用另一个项目动态加载这个jar,则会报错:

Exception in thread "main" java.lang.reflect.InvocationTargetExceptionat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at test4.Test11.main(Test11.java:21)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtilsat test3.Test1.test(Test1.java:14)... 5 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtilsat java.net.URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)... 6 more

找了好久都没有解决这个问题,最后发现,在jar中随便一个类中写一个main方法,然后打包成可执行jar,虽然是可执行jar但是不需要直接执行的,然后就可以了:

执行test
true
true
false
true
true
false
C:\Program Files\Java\jre1.8.0_191
null

如果需要在可执行jar的根目录添加一些文件,可以进行如下操作:

将打包的jar解压成文件夹:tt,然后将需要的文件复制到根目录

执行如下命令:

jar cvfM tt.jar -C tt\ .

cvfM中的M是为了忽略MANIFEST.MF,此文件很重要,原来什么样就什么样即可,不需要改变,所以忽略

特此记录一下,互相学习!

java动态加载jar时,jar中还有第三方jar无法加载的解决方法相关推荐

  1. Java SE Eclipse中引入第三方jar及class

    使用eclipse开发Java SE 总免不了需要引入第三方的jar或者calss文件.这里给大家说一下如何在eclipse中引入第三方jar或者calss文件. 让我们先了解一下eclipse项目中 ...

  2. 关于如何正确地在android项目中添加第三方jar包

                  在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception ...

  3. Android Studio 在项目中引用第三方jar包

    在Android Studio项目中引用第三方jar包的方法: 步骤: 1.在build.gradle文件中添加如下代码: 备注:要添加在Android作用域下 sourceSets {main {j ...

  4. double java 精度丢失_java中double和float精度丢失问题及解决方法

    在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...

  5. ORACLE动态sql在存储过程中出现表或视图不存在的解决方法

    ORACLE动态sql在存储过程中出现表或视图不存在的解决方法 CREATE OR REPLACE PROCEDURE P_test is strsql varchar2(2000); BEGIN   ...

  6. 投稿时html公式错误,Excel中出现公式常见显示错误原因与解决方法

    Excel2007的公式如果写错,就会在单元格中显示各种各样的错误信息.看到这些奇怪的错误代码,有的朋友可能会手忙脚乱,甚至感到烦躁.今天,学习啦小编就教大家在Excel中出现公式常见显示错误原因与解 ...

  7. linux vim m,关于linux中使用vim打开文件出现^M的解决方法

    在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件.我们会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致, 各 ...

  8. dwr运行时出现Servlet.init() for servlet dwr-invoker threw exception的解决方法

    dwr运行时出现Servlet.init() for servlet dwr-invoker threw exception的解决方法 2009-07-29 11:56 错误信息如下: javax.s ...

  9. 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法

    模板引擎不关心内容 art-template art-template不仅可以在浏览器使用,也可以在node中使用 npm install art-template该命令在哪执行就会把包下载在哪里,默 ...

最新文章

  1. Python编程入门到实践 - 笔记( 4 章)
  2. 3d旋转相册代码源码_实现可旋转的Reflection Probe(原创)
  3. Linux多线程总结
  4. 36.迷宫(广度优先搜索)
  5. Windows Server 2008十大新功能
  6. smooth_L1_loss_layer.cpp:28] Check failed: bottom[0]-channels() == bottom[1]-channels() (12 vs. 84
  7. source tree 递归子模块_多模块 Spring Boot 项目
  8. AOM Summit 来了
  9. es6解决回调地狱问题
  10. iOS学习笔记-自定义过渡动画
  11. 群晖安装pdo_mysql_使用docker方式部署禅道
  12. AT:关闭PSM和EDRX模式
  13. linux 的学习笔记-linux 指令大全
  14. PHP FCKeditor2.5 解决上传图片问题
  15. html css底部弧度,CSS实现底部弧度效果
  16. 磁共振计算机都是量子技术吗,IBM利用磁共振对单个原子成像 未来用于量子计算机...
  17. resin 系统日志_resin 日志
  18. 金徽酒前三季净赚2.43亿 预计年底前走进华东市场
  19. python图像分析_python数字图像处理(一)图像的常见操作
  20. 如何查找下载外文文献,超强外文文献检索网站排名

热门文章

  1. 清华大学五道口金融学院2021年博士生招生简章(直博、硕博、普博)
  2. linux mate仿Windows10,华为Mate 10:PC模式超简单
  3. 用python开发一个影视网站_搜片大师,一个不需要编程就能拥有百万影视站点的搜片神器,Python编写,Windows版界面 - 卖知了的......
  4. 大数据平台HDP-2.6.4 安装与配置
  5. [翻译] 在 Overleaf 中分享项目
  6. 安卓数据丢失拯救工具:9个最好的安卓数据恢复软件
  7. python科学计算够用吗_为什么Python适合科学计算?/python3科学计算教程
  8. 团队建设活动——造桥
  9. Springboot配置多个视图解析器,项目同时有jsp和html
  10. 计算机的网络硬件和软件有哪些,软件设施包括哪些 硬件设施和软件设施的区别?...