背景
在JBoss上运行J2EE应用程序。内容库包含:
- WebApp.war
- ReportService.ear
- 其他.jar文件
ReportService.ear
文件包含:
/ReportService-ejb.jar
/lib/*.jar
ReportService-ejb.jar
包含:
/META-INF/reports/Report.jasper
/META-INF/reports/Subreport.jasper
环境
- Java 1.7
- NetBeans 8.0.2
- JBoss 6.2.0 GA
问题
以下路径必须位于CLASSPATH上,以便在Web应用程序运行时,报表服务可以找到META-INF
目录的根目录:
ReportService.ear >> ReportService-ejb.jar >> /META-INF/.
也就是说,Thread.currentThread().getContextClassLoader().getResource(filename)
必须能够在以下情况下读取文件/META-INF/reports/Report.jasper
:
filename = "/META-INF/reports/Report.jasper"
问题是,当报告服务尝试读取文件时,会出现以下错误,这是一条自定义错误消息,只有在getResource
找不到文件时才会发生:
java.io.IOException: Missing resource path: '/META-INF/reports/Report.jasper'.
当针对部署(通过RMI(运行报表服务单元测试时,报表会成功运行。这可能是因为NetBeans正在使报告模板文件(即/META-INF/reports/*.jasper
文件(的本地副本可用。
其他详细信息
关于Web应用程序:
MANIFEST.MF
由NetBeans使用project.properties
自动生成,并且当前不包含Class-Path
条目jboss-app.xml
文件仅包含<jboss-app/>
jboss-web.xml
文件包含上下文根、安全域和其他配置项application.xml
不存在
WebApp.war
文件也可以被绑定并部署在WebApp.ear
中。
问题
必须使用CLASSPATH更新哪个文件,以便Web应用程序可以使用报表服务在嵌套在ReportService.ear
中的ReportService.jar
的/META-INF/
目录中成功查找文件?
注意:每次构建WebApp.war
时,构建过程(通过build.xml和build-inpl.xml(都会覆盖MANIFEST.MF
。
想法
更新生成脚本更改build-impl.xml以更新WebApp.war的清单,从而设置引用ReportServices.jar的
Class-Path
条目。如果.jar文件在ReportService.ear文件中,它将如何找到该.jar文件?更新Web应用程序EAR清单。将
WebApp.ear
中的MANIFEST.MF
更改为包含Class-Path:
条目。
资源
- JBoss服务配置指南
- 向NetBeans生成的清单添加类路径
- EJB 2和J2EE封装
- CodeRanch线程
- 打包EJB 3应用程序
- AS7中的EAR类加载
更改:
Thread.currentThread().getContextClassLoader().getResource(filename)
至:
getClass().getResource(filename)