27 Java动态加载第三方jar包中的类
我加载的方法是:
//参数fileName是jar包的路径,processorName 是业务类的包名+类名
public static A load(String fileName, String processorName) {
String filePath = fileName;
A processor = null;
URL url;
try {
url = new URL(filePath);
} catch (MalformedURLException e1) {
e1.printStackTrace();
log.error("文件不存在");
return null;
}
URLClassLoader loader = new URLClassLoader(new URL[] { url });
try {
Class<?> processorClass = loader.loadClass(processorName);
processor = (A)processorClass.newInstance();
} catch (Exception e) {
log.error("创建业务类失败");
e.printStackTrace();
return null;
}
return processor;
}
问题:用main方法来调用这个load方法是能加载jar包中业务类a的,但是如果在自己系统里面按照正常流程走的时候调用load方法的时候 却报错:接口类A找不到, 但是接口类A是明明定义在系统内部的,(两次调用load方法的入参都是一样的)
解决方法:
parentClassLoader,即Thread.currentThread().getContextClassLoader(),就能从当前程序中查找接口类A
package com.main.java; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader; /**
*/
public class TestClassLoad2 {
private static Logger LOGGER = LoggerFactory.getLogger(TestClassLoad2.class);
public static void main(String[] args) {
args=new String[]{"file://F:/bin/lib/test.jar","com.main.java.TestProcess"};
LOGGER.info("start");
load(args[],args[]);
}
public static Process load(String fileName, String processorName) {
String filePath = fileName;
Process processor = null;
URL url;
try {
url = new URL(filePath);
} catch (MalformedURLException e1) {
e1.printStackTrace();
LOGGER.info("文件不存在");
return null;
}
URLClassLoader loader = new URLClassLoader(new URL[]{url},Thread.currentThread().getContextClassLoader());
//URLClassLoader loader = new URLClassLoader(new URL[] { url });
try {
Class<?> processorClass = loader.loadClass(processorName);
processor = (Process)processorClass.newInstance();
processor.display();
} catch (Exception e) {
LOGGER.info("创建业务类失败");
e.printStackTrace();
return null;
}
return processor;
}
}
package com.main.java;
public interface Process {
void display();
}
另一个jar包的类
package com.main.java;
public class TestProcess implements Process {
@Override
public void display() {
System.out.println("test testProcess");
}
}
注意事项: 两个jar包的Process接口,包路径必须一致
file://F:/bin/lib/ 也可以
27 Java动态加载第三方jar包中的类的更多相关文章
- (转)自定义ClassLoader ----可以加载第三方jar包
package com.classloader.util; import java.io.IOException; import java.net.MalformedURLException; imp ...
- 服务器程序动态加载自定义jar包的过程
需求: 用过hive的都知道,可以自定义hive的一个udf jar,然后将这个jar add到hive服务端,就会加载这个jar实现用户自定义逻辑.现在的需求就是实现这么一个服务端所做的事情! 场景 ...
- Java项目中如何扩展第三方jar包中的类?
有些时候你对第三方得到jar包中的类并不是很满意,想根据实际情况做一些扩展.如果说第三方的jar包已经提供了一些可扩展的类,比如提供了Interceptor,Filter或者其他的类,那么使用原生的比 ...
- maven加载第三方jar包
<dependency> <groupId>com.yeepay</groupId> <artifactId>yop-sdk</artifactI ...
- java动态加载jar文件
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, Invo ...
- 加载所有jar包下指定文件
加载所有jar包下指定文件: 如spring中加载 META-INF/spring.handlers 加载 org.springframework.core.io.support.Properties ...
- 自定义ClassLoader,用于加载用户JAR包
最近在考虑C/S结构程序的软件自动升级的实现方式,比如QQ.飞信等都自动升级的功能. 自动升级模块虽然还没有编码完成,但是思路还是比较清晰的. 自动升级过程中,升级文件的JAR包是专门加载到程序中去的 ...
- java动态加载配置文件(申明:来源于网络)
java动态加载配置文件 地址:http://blog.csdn.net/longvs/article/details/9361449
- Spark on Yarn运行时加载的jar包
spark on yarn运行时会加载的jar包有如下: spark-submit中指定的--jars $SPARK_HOME/jars下的jar包 yarn提供的jar包 spark-submit通 ...
随机推荐
- nosql学习一
1.NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难 ...
- The first time
早上起来发现昨晚申请的博客开通了,\(^o^)/~纪念下,就像刚打代码学的hello world一样,用c,c++写一个程序纪念下.O(∩_∩)O~哈哈哈哈哈. /*C hello world程序*/ ...
- Period
uvalive3026:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&pag ...
- WebSocket 支持的浏览器
http://caniuse.com/#feat=websockets
- HDOJ 2072 单词数
Problem Description lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. ...
- HDOJ 1014 Uniform Generator(公约数问题)
Problem Description Computer simulations often require random numbers. One way to generate pseudo-ra ...
- R学习日记——分解时间序列(季节性数据)
上篇说明了分解非季节性数据的方法.就是通过TTS包的SMA()函数进行简单移动平均平滑.让看似没有规律或没有趋势的曲线变的有规律或趋势.然后再进行时间序列曲线的回归预测. 本次,开始分解季节性时间序列 ...
- 区分width()、css('width')、innerWidth()
#widthTest1 { width: 200px; height: 200px; background-color: #00CCFF; -webkit-box-sizing: border-box ...
- PHP读取文件内容的三种方式
<?php // 第一种读取方式 header("content-type:text/html;charset=utf-8"); // 文件路径 $fileA = " ...
- mongodb3.0 性能測试报告 一
mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三 測试环境: 服务器:X86 pcserver 共6台 cpu: 单颗8核 ...