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:///!,如果是有状态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文件,格式如下所示:
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个步骤能解决大部分的问题