Jboss7类载入器
1. 类载入器理论知识介绍
类载入器基于Jboss Module,代替了层次类载入环境,避免了当类存在多个版本号时,导致类载入错误。
类载入是基于模块的。必须显示的定义模块依赖。部署也是模块化的,假设没有显示的定义类依赖则不能訪问应用serverjar中的类。在部署过程中,一些由应用server定义的模块依赖会自己主动装配。比如,假设部署一个Java EE 应用,将自己主动加入Java EE API依赖,这也成为隐式模块依赖。对于其它的类,必须在MANIFEST.MF文件的”Dependencies:”或”Class-Path:”项,或在jboss-deployment-structure.xml文件里定义显示的模块依赖。
类载入优先级(从高到低):
1. 系统依赖– easy自己主动将载入的模块依赖。包含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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://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; @Controller
public 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
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveV9sb3ZlX2Y=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
分析:
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
Jboss7类载入器的更多相关文章
- 黑马程序猿——Java中的类载入器
------- android培训.java培训.期待与您交流! -------- 类载入器 Java虚拟机中能够安装多个类载入器,系统默认三个主要类载入器,每一个类负责载入特定位置的类: BootS ...
- Java类载入器 ClassLoader的解析
//參考 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类载入器基本概念 类载入器是 Java 语言的一个创新,也是 Ja ...
- Java类载入器(一)——类载入器层次与模型
类载入器 虚拟机设计团队把类载入阶段中的"通过一个类的全限定名来获取描写叙述此类的二进制字节流"这个动作放到Java虚拟机外部去实现.以便让应用程序自己决定怎样去获取所须要的类 ...
- Java类载入器原理分析
一:Java虚拟机中能够安装多个类载入器,系统默认是三个基本的类载入器: Bootstrap ExtClassLoader AppClassLoader 类载入器也是Java类.由于其它Java类 ...
- Java类载入器(二)——自己定义类载入器
用户定制自己的ClassLoader能够实现以下的一些应用: 自己定义路径下查找自己定义的class类文件,或许我们须要的class文件并不总是在已经设置好的Classpath以下,那么我们必须想 ...
- java类载入器——ClassLoader
Java的设计初衷是主要面向嵌入式领域,对于自己定义的一些类,考虑使用依需求载入原则.即在程序使用到时才载入类,节省内存消耗,这时就可以通过类载入器来动态载入. 假设你平时仅仅是做web开发,那应该非 ...
- Tomcat类载入器机制(Tomcat源代码解析六)
要说Tomcat的Classloader机制,我们还得从Bootstrap開始.在BootStrap初始化的时候.调用了org.apache.catalina.startup.Bootstrap#in ...
- Java类载入器
1. 系统载入器简单介绍 Java虚拟机中能够安装多个类载入器,系统默认三个主要类载入器(BootStrap.ExtClassLoader.AppClassLoader).每一个类载入器负责载入特 ...
- finalkeyword对JVM类载入器的影响
众所周知,当訪问一个类的变量或方法的时候.假设没有初始化该类.就会先去初始化一个类 可是,当这个类的变量为final的时候,就不一定了 请看以下的样例 package com.lala.shop; i ...
随机推荐
- [python][django学习篇][11]后台admin用户登录博客,添加文章---这一章和博客首页设计没有关系
1 如果没有创建超级管理员账号,先要创建python manage.py createsuperuser 2 在admin后台注册模型(如果没有这一步,登录http://127.0.0.1:8000/ ...
- BZOJ4516 [Sdoi2016]生成魔咒 【后缀自动机】
题目 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1,2, ...
- 使用caffe测试自己的图片
第一种方法是测试批量图片,使用caffe.bin即可,首先要做的是把你的jpg图片转换为LMDB的格式,如何转换呢?用/build/tools/convert_image --resize_width ...
- [USACO Section 5.3]量取牛奶 Milk Measuring (动态规划,背包$dp$)
题目链接 Solution 完全背包 \(dp\) , 同时再加一个数组 \(v[i][j]\) 记录当总和为\(j\) 时第 \(i\) 种物品是否被选. 为保证从小到大和字典序,先将瓶子按大小排序 ...
- HAOI2008题解
又来写题解辣-然而并不太清楚题目排列情况...不管辣先写起来- T1:[bzoj1041] 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1 ...
- 1180: [CROATIAN2009]OTOCI
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1032 Solved: 638[Submit][ ...
- 冬训 day2
模拟枚举... A - New Year and Buggy Bot(http://codeforces.com/problemset/problem/908/B) 暴力枚举即可,但是直接手动暴力会非 ...
- BZOJ 2146 Construct
Construct [问题描述] 随着改革开放的深入推进…… 小T家要拆迁了…… 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户. 由于小T的家位于 ...
- jQuery重要插件!
原文发布时间为:2009-08-05 -- 来源于本人的百度文章 [由搬家工具导入] 强烈推荐:240多个jQuery插件 概述 jQuery 是继 prototype 之后又一个优秀的 Javasc ...
- SpringTest(一)
SpringMvcTest总结: 最近要做单元测试,所以选择的是SpringTest这个测试框架. 1.准备工作.(导入jar包) 因为使用Maven管理jar包,所以在要做单元测试的模块中的p ...