Jboss低版本项目热部署到Jboss7

2023-05-16

                                Jboss低版本项目热部署到Jboss7

 

 

1.        Jboss7新特性

1.1 构建在Modular Service Container上,充分地利用了多核处理器的能力,并发、按需启动服务,启动速度更快、占用内存更小。

1.2 全面兼容Java EE6

1.3 支持JDK6/7

1.4 统一的配置和管理

1.5 兼容OSGI 4.2,支持OSGIJava EE组件模型集成。

1.6容易测试:利用Arquillian测试平台一种集成测试组件模型,更易于测试,改变-编译-测试的周期更短。

1.7 两种模式

Standalone模式(使用standalone.bat启动)相当于以前的3456版本。配置文件、发布内容等放在standalone目录下。

Domain模式(使用domain.bat启动)是Jboss7的一个新特征,可以在一个控制点管理多个服务器。

1.8 类加载

类加载基于Jboss Module,取代了层次类加载环境,避免了当类存在多个版本时,导致类加载错误。由于类加载是基于模块的,必须显示的定义模块依赖。部署也是模块化的,如果没有显示的定义类依赖则不能访问应用服务器jar中的类。

2.        迁移步骤

在Jboss7部署项目与在jboss5上有很大区别,最主要原因是由于类的加载模式改变了。Jboss5部署相对简单,只需将相应的包部署到libdeploy目录即可,类加载器会按层次自动加载,不用配置依赖关系。而jboss7完全不一样,jboss7是按模块化加载,不同模块由不同类加载器加载,其他模块的jar包,对其是不可见的,这时需要手动配置包之间依赖关系,否则会报ClassNotFoundException等错误。另外对于数据源和JNDI的配置也发生了变化,所以把项目从Jboss5Jboss7迁移时可以大概分为下述3个步骤:

2.1    依赖关系的配置

Jboss7中,模块之间的依赖关系分为隐式依赖和显式依赖。

2.1.1隐式依赖

尽管Jboss7中模块默认是隔离的,在部署过程中,一些由应用服务器定义的模块依赖会自动装配。例如,如部署一个Java EE应用,将自动添加Java EE API依赖,这也称为隐式模块依赖。

2.1.2显式依赖

对于显式依赖,必须在MANIFEST.MF文件的Dependencies:Class-Path:项或在Jboss7特有的部署文件jboss-deployment-structure.xml中显式定义。对于已有的项目,手动去查找各个模块之间的依赖关系是费时又费力的,可以通过Tattletale工具来分析,在分析报告的OUTPUT_DIRECTORY/index.html文件中点击"JBoss A7"则可以得到部分依赖关系,另外的依赖关系可以在“Depends On”中得到。

在Jboss7中类的加载优先级(从高到低):

(1)系统依赖-服务器自动加载的模块依赖,包括Java EE api

(2)用户依赖-jboss-deployment-structure.xml(在earMETA-INF内,warMETA-INFWEB-INF内)或Dependencies:项内配置的依赖。

(3)本地资源-发布目录下的类文件,如war包下的WEB-INF/classesWEB-INF/lib

(4)部署间依赖-ear内的其他部署依赖。包括ear lib目录内的类,或其他ejb包内的类。

在部署时,War包被认为是一个单独的模块,WEB-INF/libWEB-INF/classes内的类是相同的,都由同一类加载器加载。Ear包是多模块的部署。这意味着不是ear内的所有类都能访问ear内所有其他类,除非指定明确的依赖。默认情况下,EAR/lib目录是一个单独的模块,每个WAREJB jar是一个单独的模块。子部署(warejb-jar)总是依赖父模块,可以访问EAR/lib内的类,然而它们彼此间不总是有自动依赖。可以通过修改如下配置控制这个行为:

<subsystem xmlns="urn:jboss:domain:ee:1.0" >

<ear-subdeployments-isolated>false</ear-subdeployments-isolated>

</subsystem>

ear-subdeployments-isolated默认值为false,允许子部署访问其他子部署的类。在一个Ear包中,war可以访问jar包里的类,jar包之间也可以相互访问,但是jar包不能访问war包中的类,不管ear-subdeployments-isolated的值为true还是false。

2.1.3全局模块

可以把一些模块设置为全局模块,则所有的部署都可以访问该模块,在做项目迁移时,可以使用这种方法来解决模块依赖问题。格式如下:

<subsystem xmlns="urn:jboss:domain:ee:1.0"/>

       <global-modules>

              <module name="org.apache.log4j"/>

       </global-modules>

2.2    数据源配置

Jboss5中,数据源的配置文件为*-ds.xml文件,该文件放在服务器的deploy目录下,其相应的JDBC驱动则放在服务器的lib目录或应用程序的WEB-INF/lib目录下。而在Jboss7中这些都不需要,配置文件为Jboss7_home/standalone/configuration/standalone.xml或者是Jboss7_home/domain/configuration/domaion.xml。可以使用IronJacamar工具把原来的*-ds.xml文件转变为Jboss7中所需要的格式。

2.2.1          安装JDBC驱动

安装JDBC驱动分为两种方式:(1)作为一个部署(推荐的做法)(2)作为一个模块

2.2.1.1    作为一个部署

直接把JDBC驱动作为一个普通的jar包放在deployment目录下,该JDBC驱动应该是一个兼容JDBC4(Jdbc 4兼容的driver在jar包内含有META-INF/services/java.sql.Driver文件,其中指定了驱动类名称。)的驱动。若JDBC驱动包含不止一个jar包,则应作为一个模块来部署。

2.2.1.2    作为一个模块

需要在modules目录下创建一个目录结构,其内包含驱动jar包和module.xml文件。下面以安装mysql驱动为例,首先在modules目录下建立com/mysql/main文件夹,且把mysql驱动和module.xml文件放在main文件夹中。module.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="com.mysql">

<resources>

<resource-root path="mysql-connector-java-5.1.15.jar"/>

</resources>

<dependencies>

<module name="javax.api"/>

</dependencies>

</module>

需要注意的是name应与建立的文件夹同名且module.xml文件的开头不能有空格,否则会产生“New missing/unsatisfied dependencies”错误。

2.2.2          注册JDBC驱动

2.2.2.1    作为模块的JDBC驱动注册

<datasource jndi-name="java:/YourDatasourceName" pool-name="YourDatasourceName">

<connection-url>jdbc:mysql://localhost:3306/YourApplicationURL</connection-url>

<driver> mysql-connector-java-5.1.15.jar </driver>

<transaction-isolation> TRANSACTION_READ_COMMITTED </transaction-isolation>

<pool>

<min-pool-size>100</min-pool-size>

<max-pool-size>200</max-pool-size>

</pool>

<security>

<user-name> USERID </user-name>

<password> PASSWORD</password>

</security>

<statement>

<prepared-statement-cache-size>100</prepared-statement-cache-size>

<share-prepared-statements/>

</statement>

</datasource>

2.2.2.2    作为部署的JDBC驱动注册

<datasource jndi-name="java:/MySqlDS" pool-name="MySqlDS" enabled="true" use-java-context="true">

<connection-url>jdbc:mysql://localhost:3306/gg</connection-url>

<driver>mysql</driver>

<pool>

   <min-pool-size>20</min-pool-size>

   <max-pool-size>20</max-pool-size>

   <prefill>true</prefill>

 </pool>

<security>

    <user-name>root</user-name>

     <password>111</password>

</security>

<driver name="mysql" module="com.mysql">

  <driver-class>com.mysql.jdbc.Driver</driver-class>

</driver>

</datasources>

2.3    JNDI

2.3.1 JNDI命名规则

jboss7使用了更为严格的JNDI命名规则,其基本规则如下:

(1)相对命名如“ExampleDS”或“jdbc/ExampleDS”应该修改为相对于具体环境,如“java:comp/env”,“java:jboss/env”,“java:module/env”等。

(2)绝对命名如“/jdbc/ExampleDS”应该修改为相对命名如“java:jboss/root”。

(3)如“java:/jdbc/ExampleDS”的绝对命名也应如(2)修改。

(4)“java:jboss”命名在整个jboss服务器中时共享的。

(5)任何以“java:”开头的命名必须结合“comp”,“module”,“app”,“global”,“jboss”中的一个,否则会报错。

2.3.2 Local JNDI

name

scope

properties

java:comp

current component

 

standard namespaces

java:module

current module

java:app

current application

java:global

application server

java:jboss

global

 

jboss7 提供的全局命名

java:/

global

java:jboss/exported

global

如在HelloWorldEar包中有HelloWorldEJB,在HelloWorldEJB中有HelloWorld bean实现了HelloWorldRemote接口,则部署时HelloWorld绑定的JNDI为以下几个:

java:global/HelloWorldEar/HelloWorldEJB/HelloWorld!com.ejb.HelloWorldRemote

java:app/HelloWorldEJB/HelloWorld!com.ejb.HelloWorldRemote

java:module/HelloWorld!com.ejb.HelloWorldRemote

java:jboss/exported/HelloWorldEar/HelloWorldEJB/HelloWorld!com.ejb.HelloWorldRemote

java:global/HelloWorldEar/HelloWorldEJB/HelloWorld

java:app/HelloWorldEJB/HelloWorld

java:module/HelloWorld

2.3.3 remote JNDI

在jboss5中默认ejb的JNDI名称为:

       本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local

       远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote

如果ejb只是在单独的jar包中,则不需要EAR-FILE-BASE-NAME。而在jboss7中remote ejb的JNDI命名规则如下:

       ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>,如果是有状态bean,则还需加上?stateful。

其中app-name指的是ear包的名称

       module-name指的是其所在的jar包的名称

       distinct-name指的是起的别名

       bean-name指的是该bean的名字

       fully-qualified-classname-of-the-remote-interface指的是其实现的接口的名字,要加上完整的包名。

2.3.4 绑定全局JNDI

直接修改standalone.xml或者domain.xml文件,格式如下所示:

<subsystem xmlns="urn:jboss:domain:naming:1.1"/>

<bindings>

           <lookup name="AdminEjb/local" lookup="ejb:/admin_ejb/AdminEjb!com.mipt.admin.ifc.AdminIfc"/>

</bindings>

3.        可能会遇到的问题

3.1ejb JNDI

由于jboss7与jboss5JNDI命名方式的差别很大,若在原有项目中大量使用了JNDI,则在迁移时要进行更改或绑定,将是一项庞大的工程。

3.2 配置文件无法解析

在添加数据源或其他需要修改standalone.xml或domain.xml配置文件后,重新启动服务器会报无法解析配置文件的错误,可以通过jboss-home/bin/jboss-cli.bat来修该配置文件。以下为添加一个数据源的格式:

[standalone@localhost:9999 /] /subsystem=datasources:installed-drivers-list

{

"outcome" => "success",

"result" => [{

"driver-name" => "h2",

"deployment-name" => undefined,

"driver-module-name" => "com.h2database.h2",

"module-slot" => "main",

"driver-xa-datasource-class-name" => "org.h2.jdbcx.JdbcDataSource",

"driver-class-name" => "org.h2.Driver",

"driver-major-version" => 1,

"driver-minor-version" => 2,

"jdbc-compliant" => true

}]

3.3 ClassNotFoundException  ClassCastException

出现上述问题则是模块之间缺少依赖关系,导致找不到相应的类。

总结

在把项目从jboss5迁移到jboss7上时,上述3个步骤能解决大部分的问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jboss低版本项目热部署到Jboss7 的相关文章

随机推荐

  • stomp 连接错误: Whoops! Lost connection to http://localhost:8080/spring13/stomp 的解决方法

    0 README 1 xff09 本文旨在给出 stomp 连接错误 xff1a Whoops Lost connection to http localhost 8080 spring13 stomp 的解决方法 xff1b you ca
  • IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法

    1 README 毕业前写了一篇 英文paper xff0c 接受后 xff0c 需要提交到 IEEE PDF Express 做格式检测 xff1b xff1b latex源码中引用了 Visio生成的算法流程图 xff0c PDF文件
  • centos磁盘安装与磁盘分区方案详解

    转自 xff1a https yq aliyun com ziliao 56538 前几天自己研究了下几个linux系统 xff0c 还是觉着centos要好一些 相对稳定点 xff0c 起码桌面系统还是比 ubuntu 强 安装cento
  • 学习Oracle 最好的5本书

    转自 xff1a http www goodu info gc node 88 经过精心搜集和统计 xff0c 这里列出了学习Oracle最好的5本书 xff0c 从入门到精通从简单理解到高级技巧 xff0c 涵盖了历年来最佳学习实践经验
  • java-HttpURLConnection 发送POST请求 传递参数或JSON数据

    java HttpURLConnection 发送POST请求 传递参数或JSON数据 需求 三方接口 restful请求 POST方式 参数JSON 接收数据JSON HttpURLConnection发送POST请求 span clas
  • 一次DPDK-L3FWD-ACL的问题排查

    其实说起来不是什么大问题 xff0c 所有的配置按照下面这个来的 包括写入arp和配置默认路由 xff0c 不过我用的单文件那个l3fwd acl https blog csdn net sinat 20184565 article det
  • Centos7关机和重启前执行自定义脚本

    0 前言 如果你在linux系统上启动了很多自己的服务 xff0c 如果直接执行系统的reboot或者shutdown命令 xff0c 可能会发生一些异常的现象 xff0c 所以我们在重启和关机前 xff0c 应该按照我们的意愿去自定义清理
  • Ubuntu20.04系统WineHQ7.0安装微信

    提供3种Ubuntu系统安装微信的方法 xff0c 在Ubuntu20 04上验证都ok 1 WineHQ7 0安装微信 xff1a ubuntu20 04安装最新版微信 可以支持微信最新版 xff0c 但是适配的不是特别好 xff1b 比
  • 0402 0603 0805 1206焊盘封装尺寸

  • Ubuntu 上使用hexo+github打造个人blog

    最近一段时间想要搭建个人的blog xff0c 然后好好写博客 在网上大致看了下 xff0c 一致的推荐hexo来搭建个人blog xff0c 而且可以通过github挂载在公网上去 xff0c 由于个人使用的Ubuntu 16 04 xf
  • 简单使用Python爬虫爬取淘宝网页商品信息

    最近在学习爬虫 xff0c 本人还是入门级的小白 xff0c 自己跟着老师写了一些代码 xff0c 算是自己的总结 xff0c 还有一些心得 xff0c 跟大家分享一下 xff0c 如果不当 xff0c 还请各位前辈斧正 这是代码 xff1
  • 非常详细的范式讲解(1NF/2NF/3NF/BCNF)

    范式 范式在计算机方面运用广泛 xff0c 在计算机二级三级均有涉及到 xff0c 今天就来讲讲范式 要是能够认真的看完 xff0c 相信一定能够理解的 在讲范式之前 xff0c 我们先来了解有关范式的基本概念 xff0c 听懂了有利于后面
  • ubuntu18.04无法安装libesd0-dev完美解决办法

    ubuntu18 04无法安装libesd0 dev 解决办法 解决办法 span class token comment 在行尾添加如下一行的内容 span span class token function sudo span vim
  • SystemUI学习记录

    OS android 7 1 由于项目需要需要对SystemUI进行定制化 xff0c 需求比较紧急 xff0c 没有很深入的去了解其整体代码 xff0c 仅仅记录下我的用到修改记录如下 xff1a 目录中有 或者 由于在不同的系统环境拷贝
  • informer

    list watch机制 list watch有两部分组成 xff0c 分别是list和watch list非常好理解 xff0c 就是调用资源的list API罗列资源 xff0c 基于HTTP短链接实现 xff1b watch则是调用资
  • kubelet - container manager

    containerManager 负责 node 节点上运行的容器的配置信息 xff0c 如 cgroup cpu device xff1b pod的创建流程参考 xff1a http www tianfeiyu com p 61 2825
  • 理解TCP/IP网络通信原理

    为什么会有TCP IP协议 在世界上各地 xff0c 各种各样的电脑运行着各自不同的操作系统为大家服务 xff0c 这些电脑在表达同一种信息的时候所使用的方法是千差万别 就好像圣经中上帝打乱了各地人的口音 xff0c 让他们无法合作一样 计
  • python 正则表达式点号与'\n'符号的问题

    匹配除了制表符和换行符之外的所有字符 前面的元字符出现任意次 xff0c 含0 43 前面的元字符出现一次或多次 xff1f 非贪婪模式 re S可以匹配多行 S s 匹配所有字符 所以 可以使用 s S 取代 在Python中可以使用方法
  • virsh的使用与实例步骤安装虚拟机

    Libvirt 有两种控制方式 xff0c 命令行和图形界面 图形界面 xff1a 通过执行名 virt manager xff0c 启动 libvirt 的图形界面 xff0c 在图形界面下可以一步一步的创建虚拟机 xff0c 管理虚拟机
  • Jboss低版本项目热部署到Jboss7

    Jboss低版本项目热部署到Jboss7 1 Jboss7 新特性 1 1 构建在 Modular Service Container上 xff0c 充分地利用了多核处理器的能力 xff0c 并发 按需启动服务 xff0c 启动速度更快 占