Jboss7类加载器
来源:互联网 发布:nginx 限制ip访问 编辑:程序博客网 时间:2024/05/16 19:17
1. 类加载器理论知识介绍
类加载器基于Jboss Module,取代了层次类加载环境,避免了当类存在多个版本时,导致类加载错误。
类加载是基于模块的,必须显示的定义模块依赖。部署也是模块化的,如果没有显示的定义类依赖则不能访问应用服务器jar中的类。在部署过程中,一些由应用服务器定义的模块依赖会自动装配。例如,如果部署一个Java EE 应用,将自动添加Java EE API依赖,这也成为隐式模块依赖。对于其他的类,必须在MANIFEST.MF文件的”Dependencies:”或”Class-Path:”项,或在jboss-deployment-structure.xml文件中定义显示的模块依赖。
类加载优先级(从高到低):
1. 系统依赖– 容易自动将加载的模块依赖,包括Java EE API
2. 用户依赖– 在jboss-deployment-structure.xml(ear的META-INF内,war的META-INF或WEB-INF内)或Dependencies:项内配置的依赖。
3. 本地资源– 发布目录下的类文件,如war包下的WEB-INF/classes或WEB-INF/lib
4. 部署间依赖– 在ear内的其他部署依赖。包括ear lib目录内的类,或其他ejb内的了;类。
War被认为一个单独的模块,WEB-INF/lib或WEB-INF/classes内的类是相同的,都由同一类加载器加载
2. 下面使用具体的例子展示一下类加载器的优先级
环境:Eclipse+Maven+Jboss 6.2 EAP
1. 创建Maven项目分别是:itoo-pangfan-web itoo-pangfan-core itoo-pangfan-ear
注意在创建maven项目过程中packaging分别是war jar ear
2. 配置pom.xml文件如下
itoo-pangfan-core的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tgb</groupId> <artifactId>itoo-pangfan-core</artifactId> <version>0.0.1-SNAPSHOT</version></project>
itoo-pangfan-ear的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.tgb</groupId><artifactId>itoo-pangfan-ear</artifactId><version>0.0.1-SNAPSHOT</version><packaging>ear</packaging><dependencies><dependency><groupId>com.tgb</groupId> <artifactId>itoo-pangfan-core</artifactId> <version>0.0.1-SNAPSHOT</version> <type>ejb</type></dependency><dependency><groupId>com.tgb</groupId> <artifactId>itoo-pangfan-web</artifactId> <version>0.0.1-SNAPSHOT</version> <type>war</type></dependency></dependencies></project>
itoo-pangfan-web的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.tgb</groupId><artifactId>itoo-pangfan-web</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.0.8.RELEASE</version></dependency></dependencies></project>
3. 配置spring-mvc.xml文件
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><bean name="myController" class="com.tgb.itoo.basic.controller.MyController"></bean><bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /><mvc:annotation-driven /><mvc:resources location="/demo/" mapping="/demo/**"></mvc:resources><mvc:resources location="/themes/" mapping="/themes/**"></mvc:resources><mvc:resources location="/locale/" mapping="/locale/**"></mvc:resources><mvc:resources location="/" mapping="/**"></mvc:resources></beans>
4. 创建MyController
MyController
package com.tgb.itoo.basic.controller;import java.util.HashSet;import java.util.Set;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import com.google.gson.Gson;@Controllerpublic class MyController {@RequestMapping("/index")public String index() {Gson gson = new Gson();User user1 = new User(); //创建User对象(User类的代码省略,自己创建)user1.setId(1);user1.setName("xxx");User user2 = new User();user2.setId(2);user2.setName("xxx");Set<User> users = new HashSet<User>();users.add(user1);users.add(user2); <span style="white-space:pre"></span>// 带泛型的list转化为json <span style="white-space:pre"></span>String s = gson.toJson(users); <span style="white-space:pre"></span>System.out.println(s); //打印转换之后的json串return "index";}}
使用gson转换Json串,所以在web的pom.xml文件中引入此jar
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.3.1</version></dependency>
5. 部署测试
测试一:部署执行
部署成功后访问:http://localhost:8080/itoo-pangfan-web/index
分析:
1. 系统依赖 - 这是一个Jave EE项目,在Jboss部署过程中会自动加载Java EEAPI的相关依赖
2. 用户依赖– 无
3. 本地资源– war包中的WEB-INF/classes和WEB-INF/lib(maven依赖的jar)
4. 部署间依赖– itoo-pangfan-core(jar)和itoo-pangfan-web(war)
部署成功说明gson的jar是从本地资源中读取
测试二:在gson的依赖中加入<scope>provided</scope>
provided:打包时不用此依赖。也就是说在打包完成之后google不会出现在WEB-INF/lib中。
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.3.1</version><scope>provided</scope></dependency>
再部署运行报错,提示gson找不到
JBWEB000236: Servlet.service() for servlet action threw exception: java.lang.ClassNotFoundException: com.google.gson.Gson from [Module "deployment.itoo-pangfan-ear.ear.itoo-pangfan-web-0.0.1-SNAPSHOT.war:main" from Service Module Loader]
依据我们上面分析的情况,gson只存在在本地资源中,因为本地资源找不到所以报错。
那么如果解决呢?对,放到用户依赖中。
1. 创建jboss-deployment-structure.xml
将jboss-deployment-structure.xml在ear的META-INF内,war的META-INF或WEB-INF任意一个位置。在这里我放到ear中,文件的内容如下
<?xml version="1.0" encoding="UTF-8"?><jboss-deployment-structure><sub-deployment name="itoo-pangfan-web-0.0.1-SNAPSHOT.war"><dependencies><module name="org.jboss.xnio" /><module name="com.google.code.gson"><imports><include path="META-INF**" /><include path="org**" /></imports></module></dependencies></sub-deployment></jboss-deployment-structure>
2. 配置Jboss Module
jboss根目录下面原来的modules里面com文件夹,内部包括gson.jar和main文件。com文件的目录结构如下:
module.xml
<module xmlns="urn:jboss:module:1.0" name="com.google.code.gson"> <resources> <resource-root path="gson-2.3.1.jar"/> </resources></module>
3. 部署测试
现在就将gson放到了用户依赖这一级,重新部署运行(注意Jboss也要重新启动)
6. 总结
对于我们来讲操作比较多的是用户依赖,本地资源以及部署间依赖。上面的例子主要是讲解了用户依赖和本地资源之间的级别。如果用户依赖和本地资源同时拥有gson,jar,也是会读取用户资源中的jar。
从上面可以看出如果不使用用户依赖,我们的程序部署也是没有问题的,那么为什么还要用户用户依赖呢?
1. jar重复利用
2. 减少单个项目的体积,提高性能
如果gson作为本地资源存在,那么我们就必须要将它打包到war中;如果gson存在在jboss modules中,war就不用存在gson了,那么一个ear的体积就能够减少。除此之外,gson也能够被其他部署在服务器中的ear使用。这里也是体现一个分层的思想,在开发中将公共的jar包,使用频率比较高的jar同一个放到jboss中,那么当我们使用的时候只要配置一下就可以了,不用再添加打包到每一个ear中,是我们提升性能一个比较重要的方面。
- Jboss7类加载器
- jboss7.1.1类加载分析
- jboss7静态变量由于不同的类加载器在两个模块中不相同
- Jboss7.1加载Module中的taglib
- JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件
- Jboss7中ejb3使用@Schedule调度器总是每分钟执行
- jboss7笔记
- jboss7 ClassNotFoundException
- jboss7 ClassNotFoundException
- JBoss7 手册
- 加载、类加载、类加载器
- JBoss7配置指南(一)
- JBoss7配置指南(二)
- JBoss7配置指南(一)
- JBoss7配置指南(二)
- JBoss7配置指南(三)
- JBoss7配置指南四)
- JBoss7配置指南(一)
- komodo edit
- 日经社説 20150627 納得しがたい新競技場の工費
- Linux Shell 常用技巧
- 日经社説 20150627 企業は株主総会を市場との対話の起点に
- 判断是否移动客户端
- Jboss7类加载器
- 社説 20150627 自民若手勉強会 看過できない「報道規制」発言
- LeetCode Remove Duplicates from Sorted Array
- ListView中按钮监听器 设置 及 优化
- 社説 20150627 安保法案審議 戦略的な曖昧性は確保したい
- 计数排序
- Yii 分页器Pagesize的设置方法
- ListView与ListView里的Button焦点冲突
- 移动APP产品原型设计工具