java动态加载jar时,jar中还有第三方jar无法加载的解决方法
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无法加载的解决方法相关推荐
- Java SE Eclipse中引入第三方jar及class
使用eclipse开发Java SE 总免不了需要引入第三方的jar或者calss文件.这里给大家说一下如何在eclipse中引入第三方jar或者calss文件. 让我们先了解一下eclipse项目中 ...
- 关于如何正确地在android项目中添加第三方jar包
在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception ...
- Android Studio 在项目中引用第三方jar包
在Android Studio项目中引用第三方jar包的方法: 步骤: 1.在build.gradle文件中添加如下代码: 备注:要添加在Android作用域下 sourceSets {main {j ...
- double java 精度丢失_java中double和float精度丢失问题及解决方法
在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...
- ORACLE动态sql在存储过程中出现表或视图不存在的解决方法
ORACLE动态sql在存储过程中出现表或视图不存在的解决方法 CREATE OR REPLACE PROCEDURE P_test is strsql varchar2(2000); BEGIN ...
- 投稿时html公式错误,Excel中出现公式常见显示错误原因与解决方法
Excel2007的公式如果写错,就会在单元格中显示各种各样的错误信息.看到这些奇怪的错误代码,有的朋友可能会手忙脚乱,甚至感到烦躁.今天,学习啦小编就教大家在Excel中出现公式常见显示错误原因与解 ...
- linux vim m,关于linux中使用vim打开文件出现^M的解决方法
在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件.我们会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致, 各 ...
- 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 ...
- 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法
模板引擎不关心内容 art-template art-template不仅可以在浏览器使用,也可以在node中使用 npm install art-template该命令在哪执行就会把包下载在哪里,默 ...
最新文章
- Python编程入门到实践 - 笔记( 4 章)
- 3d旋转相册代码源码_实现可旋转的Reflection Probe(原创)
- Linux多线程总结
- 36.迷宫(广度优先搜索)
- Windows Server 2008十大新功能
- smooth_L1_loss_layer.cpp:28] Check failed: bottom[0]-channels() == bottom[1]-channels() (12 vs. 84
- source tree 递归子模块_多模块 Spring Boot 项目
- AOM Summit 来了
- es6解决回调地狱问题
- iOS学习笔记-自定义过渡动画
- 群晖安装pdo_mysql_使用docker方式部署禅道
- AT:关闭PSM和EDRX模式
- linux 的学习笔记-linux 指令大全
- PHP FCKeditor2.5 解决上传图片问题
- html css底部弧度,CSS实现底部弧度效果
- 磁共振计算机都是量子技术吗,IBM利用磁共振对单个原子成像 未来用于量子计算机...
- resin 系统日志_resin 日志
- 金徽酒前三季净赚2.43亿 预计年底前走进华东市场
- python图像分析_python数字图像处理(一)图像的常见操作
- 如何查找下载外文文献,超强外文文献检索网站排名
热门文章
- 清华大学五道口金融学院2021年博士生招生简章(直博、硕博、普博)
- linux mate仿Windows10,华为Mate 10:PC模式超简单
- 用python开发一个影视网站_搜片大师,一个不需要编程就能拥有百万影视站点的搜片神器,Python编写,Windows版界面 - 卖知了的......
- 大数据平台HDP-2.6.4 安装与配置
- [翻译] 在 Overleaf 中分享项目
- 安卓数据丢失拯救工具:9个最好的安卓数据恢复软件
- python科学计算够用吗_为什么Python适合科学计算?/python3科学计算教程
- 团队建设活动——造桥
- Springboot配置多个视图解析器,项目同时有jsp和html
- 计算机的网络硬件和软件有哪些,软件设施包括哪些 硬件设施和软件设施的区别?...