从事J2EE开发已经有些年了,一直在J2EE轻量级企业架构上奔跑。Struts+Spring+Ibatis/Hibernate 的组合确实有相当强的威力,随着这一组合在实际项目中运用的次数越来越多,不停的对它们进行优化后,发现已经到了需要更进一步的时候,Apache+Tomcat的强大勿用置疑,但毕竟它们的容量都偏“轻量级”。为此我走进了JBoss+EJB,本文将对初识JBoss5.1过程中所碰到的问题及解决的办法做一个记录。
基本的什么下载安装,需要的JDK环境这里不做说明,你懂的!本人下载的是 jboss-5.1.0.GA 。新建一个Web项目(MyEclipse6.5)本人命名为 JsfTest 。习惯 tomcat 下配置虚拟目录的做法,于是找到两种配置方法(以下是来源于万能的baidu):
1. 编辑 jboss-5.1.0.GA\server\default\deploy\jbossweb.sar\server.xml 文件,在</Host>之前增加:
<Context path="/jsft" docBase="D:/projects/JsfTest/web" debug="0" crosscontext="true" reloadable="false"></Context>
相信大家都知道,这样配置后是不用在 Manage Deployments 中进行发布了。启动 Jboss,花掉了启动同等空项目下tomcat所需时间的N倍后(只能说Jboss比tomcat容积大,加载的内容多,我是这样接受的),我碰到了第一个错误如下:
10:25:06,734 ERROR [AbstractKernelController] Error installing to Start: name=WebServer state=Create
org.jboss.xb.binding.JBossXBException: Failed to parse source: Context cannot appear in this position. Expected content of Host is unordered_sequence: Listener* Valve* Alias* Realm? attributes?
at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:203)
at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:183)
at org.jboss.xb.binding.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:133)
at org.jboss.web.tomcat.service.deployers.TomcatService.startService(TomcatService.java:167)
at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:376)
at org.jboss.system.ServiceMBeanSupport.pojoStart(ServiceMBeanSupport.java:216)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.reflect.plugins.introspection.ReflectionUtils.invoke(ReflectionUtils.java:59)
....
按提示内容是说 unordered_sequence 表示配置文件结点 顺序不对,或少了结点,最终这个问题试过很多次没有解决。
2. 如何在JBOSS5.1下建立虚拟路径:1:找到JBOSS的 \jboss-5.1.0.GA\server\default\conf\bootstrap目录下,有个叫profile.xml.在里边找到
<bean name="BootstrapProfileFactory" class="org.jboss.system.server.profileservice.repository.StaticProfileFactory">
<property name="bindingsURI">${jboss.server.home.url}conf/bindingservice.beans</property>
<property name="bootstrapURI">${jboss.server.home.url}conf/jboss-service.xml</property>
<property name="deployersURI">${jboss.server.home.url}deployers</property>
<property name="applicationURIs">
<list elementClass="java.net.URI">
<value>${jboss.server.home.url}deploy</value>
<value>file://D:/GBFILE</value>
</list>
</property>
<property name="attachmentStoreRoot">${jboss.server.data.dir}/attachments</property>
<property name="profileFactory"><inject bean="ProfileFactory" /></property>
</bean>
其中:<value>${jboss.server.home.url}deploy</value>
<value>file://D:/GBFILE</value>
file://D:/GBFILE就是虚拟路径.但是该文件夹下面的文件夹必须以.war命名.
这样在远程访问的时候就可以根据http://ip:port/GBFILE下面的文件夹名称(不包含.war)就可以直接访问了.
第二种方法很显然,不是我想要的,因为本人一般为项目WebRoot更名为web,为了直接指向此目录而要加.war,肯定不会这样做。如果不加会报这样的错(我是这样加的<value>file://D:/projects/JsfTest/web</value>):
10:37:23,250 ERROR [StandardContext] Error starting static Resources
java.lang.IllegalArgumentException: Document base D:\projects\JsfTest\web\WEB-INF\web.xml does not exist or is not a readable directory
at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:148)
at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4021)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4188)
at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
at $Proxy38.start(Unknown Source)
......
显然这个路径是存在的,但是它就是报 does not exist or is not a readable directory。
OK,以上两种方式我都没找到我想要的结果,没办法,打算从基本做法进行发布,于是打开 Manage Deployments 进行发布,将这个空的项目发布到 JBoss 的 deploy 目录。我想这样不会有问题了吧,这可是最基本的做法。启动JBoss:
10:42:01,703 ERROR [[/JsfTest]] Exception sending context initialized event to listener instance of class org.jboss.web.jsf.integration.config.JBossJSFConfigureListener
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! null
at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:213)
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:196)
at org.jboss.web.jsf.integration.config.JBossJSFConfigureListener.contextInitialized(JBossJSFConfigureListener.java:60)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4393)
at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
at $Proxy38.start(Unknown Source)
....
到这里就纳闷了,这也不行,OK,再baidu一下,得到一个关键字 jboss-web.xml ,提到要在项目 WEB-INF 下面加入这样一个文件,在jboss自带发布的项目中也确实都能找到这个配置文件,于是我复制一个过来做了如下配置:
<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">
<jboss-web>
<class-loading java2ClassLoadingCompliance="true">
<loader-repository>
com.asd:archive=JsfTest
<loader-repository-config>java2ParentDelegation=true</loader-repository-config>
</loader-repository>
</class-loading>
</jboss-web>
启动成功: 正常访问 http://localhost:8080/JsfTest 就是那个最基本的页面了 This is my JSP page.
OK,算是第一步走通了,接着这个走,Baidu 一下这个关键字 JBoss 设置 根目录:在上面的 jboss-web.xml 中加一句 <context-root>/</context-root> 即:
<jboss-web>
<class-loading java2ClassLoadingCompliance="true">
<loader-repository>
com.asd:archive=JsfTest
<loader-repository-config>java2ParentDelegation=true</loader-repository-config>
</loader-repository>
</class-loading>
<context-root>/</context-root>
</jboss-web>
再次启动JBoss(注:我的所有启动都是通过MyEclipse插件来完成的) 新的错误来了,步步维坚啊:
10:56:35,734 ERROR [AbstractKernelController] Error installing to Start: name=jboss.web.deployment:war=/ROOT state=Create mode=Manual requiredState=Installed
org.jboss.deployers.spi.DeploymentException: Web mapping already exists for deployment URL file:/E:/MyWebservers/jboss-5.1.0.GA/server/default/deploy/ROOT.war/
at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:187)
at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
at $Proxy38.start(Unknown Source)
...
看得出好像是与 ROOT.war冲突了,异然删除这个文件夹,再次启动, 成功, 这样我就能访问我想要的地址了吧:
http://localhost:8080 OK 再次得到 This is my JSP page.
到这里,应该只能说勉强得到了我想要的结果,实质上还是没有达到我的意愿,对于网上普遍说的解决虚拟目录的配置方法,我想肯定也有依据可寻,只是暂时没找到关键错误点,下回再次分解我想要的配置方法,解决报错。
分享到:
相关推荐
JBOSS5.1安装配置说明,说明Windows下JBoss的配置方法
本资源描述了如何在jboss5.1环境中配置集群操作,并附有一个简单的例子,方便大家对集群操作有个初步的了解。
Jboss5.1 下将多个application配置成windows 服务,我耗时2天,总结出来的绝对可行的方法,无需安装第3方软件,如javaservice/wrapper.
ejb课程测试代码,eclipse+jboss5.1 ant编译等代码 三个测试项目请下载
整理一下jboss drool5.1中文使用说明,doc格式
除了加入jboss-web.xml,删除xerces-2.6.2.jar和xml-apis.jar之外, <!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web ...原因是旧版本的slf4j-api不包含以上方法,附件解压后覆盖jboss5.1GA/common/lib下的同名文件即可
本文是作者精心写作的完整配置搭建Jboss-5.1集群的文档,只要按照步骤来做绝对不会出错,一些重要部分俺还加以标注和详细说明,呕心沥血的一大完整安装文档.
Jboss服务器常用配置
[Packt Publishing] JBoss AS 7 配置部署管理教程 (英文版) [Packt Publishing] JBoss AS 7 Configuration, Deployment and Administration (E-Book) ☆ 出版信息:☆ [作者信息] Francesco Marchioni [出版机构...
JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
jboss-5.1.0.GA, 因为太大了,我分了两部分上传,这是第一部分,我把里面的service目录的内容放到第二部分了,下载的时候 记得我的上传目录找第二部分资源,然后解压到server目录 便可
jboss7以上版本发布ejb时需要的配置文件,jboss-ejb3.xml和ejb-jar.xml,缺少csdn分数所以上传,请见谅。
Jboss + 优化配置 Jboss内存优化 Jboss数据库连接池优化 Jboss部署目录优化 Jboss应用安全加固
windows环境下Jboss as 7配置Https,与Jboss的低版本有所不同
手把手系列-Eclipse+JBossIDE+JBoss开发环境配置
详细的介绍了mysql与jboss的连接设置,mysql的版本为mysql 5.0,jboss的版本为jboss-5.1.0
jboss oracle 默认配置
Eclipse+jboss的配置Eclipse+jboss的配置Eclipse+jboss的配置Eclipse+jboss的配置Eclipse+jboss的配置Eclipse+jboss的配置
jboss-5.1.0.GA.zip.7z1.part
jboss系统的一些文件夹结构说明,主要的配置文件说明文档。负载均衡配置。