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实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序
去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...
- Leetcode 630.课程表III
课程表III 这里有 n 门不同的在线课程,他们按从 1 到 n 编号.每一门课程有一定的持续上课时间(课程时间)t 以及关闭时间第 d 天.一门课要持续学习 t 天直到第 d天时要完成,你将会从第 ...
- Leetcode 583.两个字符串的删除操作
两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例 1: 输入: "se ...
- 爬虫:Scrapy4 - Spiders
Spider 类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item).Spider就是定义爬取的动作以及分析某个网页(或者有些网 ...
- 201621123034 《Java程序设计》第4周学习总结
Week04-面向对象设计与继承 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:对象.重载.继承.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需 ...
- Mysql升级ORACLE 记录
自增主键问题 php和mysql不写主键mysql可以自动生成主键; 想用pdo批量向mysql插入数据只能每条一个pdostarment->execute 看tp5.1的源码提供的方案是 IN ...
- 谷歌插件请求ci 解决CI框架的Disallowed Key Characters错误提示
用CI框架时,有时候会遇到这么一个问题,打开网页,只显示 Disallowed Key Characters 错误提示.有人说 url 里有非法字符.但是确定 url 是纯英文的,问题还是出来了.但清 ...
- Log4j官方文档翻译(七、日志格式化)
apache log4j提供各种layout对象,然后根据自己指定的layouts对象转化日志信息.通常来说都是应用量身定制layout对象转换信息格式. 所有的layout对象从Appender对象 ...
- ZOJ 2112 Dynamic Rankings(带修改的区间第K大,分块+二分搜索+二分答案)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- EPPlus(SQL导成Excel)
使用Epplus方法把sql数据库中表的数据导出到excel中去: 需要使用EPPlus.dll引用. using System.IO; using OfficeOpenXml; public sta ...