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类载入器的更多相关文章

  1. 黑马程序猿——Java中的类载入器

    ------- android培训.java培训.期待与您交流! -------- 类载入器 Java虚拟机中能够安装多个类载入器,系统默认三个主要类载入器,每一个类负责载入特定位置的类: BootS ...

  2. Java类载入器 ClassLoader的解析

    //參考 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类载入器基本概念 类载入器是 Java 语言的一个创新,也是 Ja ...

  3. Java类载入器(一)——类载入器层次与模型

    类载入器   虚拟机设计团队把类载入阶段中的"通过一个类的全限定名来获取描写叙述此类的二进制字节流"这个动作放到Java虚拟机外部去实现.以便让应用程序自己决定怎样去获取所须要的类 ...

  4. Java类载入器原理分析

    一:Java虚拟机中能够安装多个类载入器,系统默认是三个基本的类载入器: Bootstrap  ExtClassLoader  AppClassLoader 类载入器也是Java类.由于其它Java类 ...

  5. Java类载入器(二)——自己定义类载入器

      用户定制自己的ClassLoader能够实现以下的一些应用: 自己定义路径下查找自己定义的class类文件,或许我们须要的class文件并不总是在已经设置好的Classpath以下,那么我们必须想 ...

  6. java类载入器——ClassLoader

    Java的设计初衷是主要面向嵌入式领域,对于自己定义的一些类,考虑使用依需求载入原则.即在程序使用到时才载入类,节省内存消耗,这时就可以通过类载入器来动态载入. 假设你平时仅仅是做web开发,那应该非 ...

  7. Tomcat类载入器机制(Tomcat源代码解析六)

    要说Tomcat的Classloader机制,我们还得从Bootstrap開始.在BootStrap初始化的时候.调用了org.apache.catalina.startup.Bootstrap#in ...

  8. Java类载入器

    1.   系统载入器简单介绍 Java虚拟机中能够安装多个类载入器,系统默认三个主要类载入器(BootStrap.ExtClassLoader.AppClassLoader).每一个类载入器负责载入特 ...

  9. finalkeyword对JVM类载入器的影响

    众所周知,当訪问一个类的变量或方法的时候.假设没有初始化该类.就会先去初始化一个类 可是,当这个类的变量为final的时候,就不一定了 请看以下的样例 package com.lala.shop; i ...

随机推荐

  1. 聊聊、RabbitMQ 第一篇

    (一)windows 下安装配置 开源的消息中间件有很多,各有各的优缺点,适合自己项目的才是最好的.首先下载 rabbitMQ 安装版本,因为 rabbitMQ 底层语言是 erlang,所以首先要先 ...

  2. python 打印9*9乘法表

    # -*- coding: utf8 -*- # Author:wxq 1. for i in range(1,10): for j in range(1,i+1): print "%d*% ...

  3. C#中找不到MouseWheel事件的解决办法

    在.....Designer.cs中加入 this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this. ...

  4. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

  5. BZOJ-3190 [JLOI2013]赛车

    转成二元一次不等式组,然后半平面交. #include <cstdlib> #include <cstdio> #include <cmath> #include ...

  6. BZOJ3144 [Hnoi2013]切糕 【最小割】

    题目 输入格式 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...

  7. http长短连接和长短轮询

    http长连接 http长连接是指http的请求头和响应头的均有connection: keep-alive的请求,也就是客户端和服务端均为keep-alive的请求. 实际上,http是请求/响应式 ...

  8. spring项目启动报错BeanFactory not initialized or already closed

    spring项目启动的时候报如下错误: java.lang.IllegalStateException: BeanFactory not initialized or already closed - ...

  9. git 使用报错记录

    错误一:git fatal: unable to write new index file主要原因就是服务器磁盘空间不够导致的,增加服务器空间就OK了在百度上面搜索没得到什么有效信息,在gooogle ...

  10. THUWC 2018(游记)

    这次是在雅礼洋湖中学举行的,一所2017年才创办的学校,新的学校, 貌似有些危险,积雪过多屋顶上的冰块砸下来,很容易砸到人, 听说最近就有一个人被砸死了. Day1 昨天睡的比较迟,12点吧,今天早上 ...