JBoss 6.2上web应用程序.ear文件中Java存档的类路径 背景

JBoss 6.2上web应用程序.ear文件中Java存档的类路径 背景,java,jakarta-ee,netbeans,jboss,classpath,Java,Jakarta Ee,Netbeans,Jboss,Classpath,在JBoss上运行J2EE应用程序。内容存储库包含: /ReportService-ejb.jar /lib/*.jar /META-INF/reports/Report.jasper /META-INF/reports/Subreport.jasper WebApp.war ReportService.ear 其他.jar文件 ReportService.ear文件包含: /ReportService-ejb.jar /lib/*.jar /META-INF/reports/Repo

在JBoss上运行J2EE应用程序。内容存储库包含:

/ReportService-ejb.jar
/lib/*.jar
/META-INF/reports/Report.jasper
/META-INF/reports/Subreport.jasper
  • WebApp.war
  • ReportService.ear
  • 其他.jar文件
ReportService.ear
文件包含:

/ReportService-ejb.jar
/lib/*.jar
/META-INF/reports/Report.jasper
/META-INF/reports/Subreport.jasper
ReportService ejb.jar
包含:

/ReportService-ejb.jar
/lib/*.jar
/META-INF/reports/Report.jasper
/META-INF/reports/Subreport.jasper
环境
  • Java 1.7
  • NetBeans 8.0.2
  • JBoss 6.2.0 GA
问题 以下路径必须位于类路径上,以便在Web应用程序运行时,报表服务可以找到
META-INF
目录的根目录:

ReportService.ear >> ReportService-ejb.jar >> /META-INF/.
也就是说,在以下情况下,
Thread.currentThread().getContextClassLoader().getResource(文件名)
必须能够读取文件
/META-INF/reports/Report.jasper

filename = "/META-INF/reports/Report.jasper"
问题在于,当reporting service尝试读取文件时,会出现以下错误,这是一条自定义错误消息,仅当
getResource
未能找到该文件时才会发生:

java.io.IOException: Missing resource path: '/META-INF/reports/Report.jasper'.
在针对部署(通过RMI)运行报表服务单元测试时,报表会成功运行。这可能是因为NetBeans正在提供报告模板文件的本地副本(即
/META-INF/reports/*.jasper
文件)

其他细节 关于Web应用程序:

  • MANIFEST.MF
    由NetBeans使用
    project.properties
    自动生成,当前不包含
    类路径
    条目
  • jboss app.xml
    文件只包含
  • jboss web.xml
    文件包含上下文根、安全域和其他配置项
  • application.xml
    不存在
WebApp.war
文件也可以捆绑并部署在
WebApp.ear

问题: 必须使用类路径更新哪个文件,以便Web应用程序可以使用报表服务在嵌套在
ReportService.ear
中的
/META-INF/
ReportService.jar目录中成功查找文件

注意:每次构建
WebApp.war
时,构建过程(通过build.xml和build impl.xml)都会覆盖
MANIFEST.MF

思想
  • 更新生成脚本。更改Build-impl.xml以更新WebApp.war的清单,以设置引用ReportServices.jar的
    类路径。如果.jar文件在ReportService.ear文件中,它将如何找到它

  • 更新Web应用程序EAR清单。更改
    MANIFEST.MF
    内部
    WebApp.ear
    以包含
    类路径:
    条目

资源
更改:

Thread.currentThread().getContextClassLoader().getResource(filename)
致: