• 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


    分析:

    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

  • 相关阅读:
    Linux——端口命令
    Linux——iptables 禁止 IP和端口
    CE第9关共用
    获得程序窗体标题-FindWindowW需要的参数
    mysql ODBC win10 设置
    Work
    Pet
    Is It A Tree?
    Ice_cream's world I
    小希的迷宫
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6794851.html
Copyright © 2020-2023  润新知