java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式

发布时间:2018-08-20 12:02,

浏览次数:774

, 标签:

java

spring

jar

tomcat

webapp

加载器加载的是配置好classpath路径上的class文件或jar包,资源文件等等,

使用继承URLClassLoader的自定义加载器,设置好url(URLClassLoader.addUrl)可以方便的实现自定义加载,多版本类文件隔离共存等等问题

目标是能够加载spring-core-4.3.10.RELEASE.jar,调用SpringVersion.getVersion(),然后打印类是哪个启动器加载的

文件:

MyLoader.java 自定义classloader,继承URLClassLoader,可以实现自己的定制化加载方式

Handler.java 方便操作加载后的类,强转,调用等等

Spring.java

编译后的class,被加载的类,继承Handler,并在方法内调用SpringVersion.getVersion(),判断是否能加载使用spring包

Test.java main, 测试类

MyLoader.java

import java.net.URL; import java.net.URLClassLoader; public class MyLoader

extends URLClassLoader { public MyLoader(URL[] urls) { super(urls); } public

ClassloadClass(String name) throws ClassNotFoundException{ return super

.loadClass(name); } }

Handler.java

public interface Handler { void doIt(); }

Spring.java

import org.springframework.core.SpringVersion; public class Spring implements

Handler{ @Override public void doIt() {

System.out.println(Spring.class.getClassLoader());

System.out.println(SpringVersion.class.getClassLoader()); SpringVersion

springVersion =new SpringVersion(); System.out.println(springVersion);

System.out.println(SpringVersion.getVersion()); } }

Test.java

import java.net.URL; public class Test { public static void main(String[] args)

throws Exception{ URL[] urls = new URL[2]; //字节码路径,包根目录 urls[0] = new URL("file"

,null,"/Users/lukecheung/proj/testclass/"); //jar包目录 //使用jar

protocol不能打印版本,SpringVersion.getVersion() null // urls[1] = new

URL("jar",null,"file:/Users/proj/proj/mspringmvc/out/WEB-INF/lib/spring-core-4.3.10.RELEASE.jar!/");

urls[1] = new URL("file",null,

"/Users/proj/proj/mspringmvc/out/WEB-INF/lib/spring-core-4.3.10.RELEASE.jar");

ClassLoader classLoader =new MyLoader(urls); //需要类全路径,包括全包名 Class c =

classLoader.loadClass("Spring"); //测试加载jar包内的类 // Class c =

classLoader.loadClass("org.springframework.core.SpringVersion"); Handler

handler = (Handler) c.newInstance(); handler.doIt(); } }

idea 普通java项目,project

structure—modules–dependencies,加入spring-core-4.3.10.RELEASE.jar

才能编译Spring.java运行,然后删除刚才添加的dependencies配置与Spring类代码,把编译的spring.class复制到其他目录(非classpath目录),再次运行Test#main

方法查看输出的classloader变化

java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...相关推荐

  1. eclipse手动pom本地包_(转)如何在maven的pom.xml中添加本地jar包

    1 maven本地仓库认识 maven本地仓库中的jar目录一般分为三层:图中的1 2 3分别如下所示: 1 groupId 2 artifactId 3 version 4 jar包的依赖 如果要将 ...

  2. java interceptor用法_java自定义拦截器用法实例

    本文实例讲述了java自定义拦截器及其用法.分享给大家供大家参考.具体如下: LoginInterceptor.java文件如下: package com.tq365.util; import jav ...

  3. java 反射 工厂_JAVA反射机制、工厂模式与SPRING IOC

    ABSTRACT Spring的IOC(控制反转)是Spring框架的灵魂,有了它才有了Spring的很多其他的灵活的特性.使用 Spring 开发项目时,控制层.业务层.DAO 层都是通过 IoC ...

  4. java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】

    本文实例讲述了java实现切割wav音频文件的方法.分享给大家供大家参考,具体如下: import it.sauronsoftware.jave.Encoder; import it.sauronso ...

  5. erp开发和java开发区别_Java程序员求职必学:Spring boot学习指南!

    黑马程序员上海中心 学姐微信:CZBKSH 关注 咳咳,今天学姐就来和你们说说Spring对于Java程序员的重要性. 首先,Spring 官网首页是这么介绍自己的--"Spring: th ...

  6. 已经导入jar包mysql还是报错_java通过JDBC连接数据库,老是报错:ClassNotFoundException.该导入的jar包我也已经导入了。...

    代码如下:publicfinalclassDBclass{publicstaticStringuser="root";publicstaticStringpassword=&quo ...

  7. 懒加载和预加载的区别_类的动态创建(ro,rw)amp; 懒加载类和非懒加载类底层加载的区别 amp; 类和分类的搭配分析...

    黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Python开发点击右侧关注,探讨技术话题!作者丨OSMin链接:https://juejin.im/post/5 ...

  8. Java程序利用POJ读写Excel的.xls或.xlsx文件所需的3个jar包

    Java程序利用POJ读写Excel文件时,不能只用poi的jar包,因为它还依赖于xmlbeans的jar包,xmlbeans又以来与common-collections的jar包,因此,正常使用P ...

  9. Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)

    ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...

最新文章

  1. body,td,th {
  2. (已加马赛克)10 行代码判定色*情*图片——Python 也可以系列之二
  3. 数据结构——树、森林和二叉树之间的转换
  4. 计算机专业简历自我评价,计算机专业毕业生简历自我评价
  5. Postman查看完整的请求报文
  6. mine layer(2008 World Final C)
  7. Java程序性能优化
  8. layui离线文档2.2.5
  9. SpringBoot项目多环境配置(亲测有效)
  10. 捷径|皮皮虾去水印教程
  11. analyze怎么优化oracle,Analyze table对Oracle性能的提升
  12. iphone和mac互传文件_华为手机连接苹果电脑文件传输教程:一键文件互传、备份和恢复...
  13. Mybatis使用choose when
  14. “九阳神功”是怎么炼成的?
  15. Wangle源码分析:编解码Handler
  16. 在微信小程序中怎么让一个页面的信息传递到另一个页面
  17. nbu客户端卸载_卸载NETBACKUP FOR LINUX
  18. 任正非自罚100万:“不要脸”的人,有多可怕?
  19. pip安装Cartopy小白版
  20. 高效能创业者的七项习惯

热门文章

  1. java treemap api_Java 8 Stream API toMap转换为TreeMap
  2. emit传参,获取返回值
  3. IEnumerable.EachTSource(FuncTSource, TSource predicate) 逐个更改列表成员的值
  4. C++学习笔记之对文件的操作2
  5. Android程序杀死自己的进程和其他程序进程方法
  6. php io select,Python IO多路复用之——select方案服务端和客户端代码【python源码详解】...
  7. grav html5,如何通过html5实现摇一摇的功能
  8. phpMyAdmin 配置
  9. 依赖注入模式中,为什么用对象而不是用数组传递?
  10. Python爬虫爬取美剧网站