来自 JBoss 6.2 上的 Web 应用程序的 .ear 文件中 Java 存档的类路径

Classpath for Java archive within .ear file from a web application on JBoss 6.2

背景

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

ReportService.ear 文件包含:

/ReportService-ejb.jar
/lib/*.jar

ReportService-ejb.jar 包含:

/META-INF/reports/Report.jasper
/META-INF/reports/Subreport.jasper

环境

问题

以下路径必须在 CLASSPATH 上,以便当 Web 应用程序 运行s 时,报表服务可以找到 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)对 Report Service 进行单元测试时,报告 运行 成功。这可能是因为 NetBeans 使报告模板文件(即 /META-INF/reports/*.jasper 文件)的本地副本可用。

其他详细信息

关于 Web 应用程序:

WebApp.war 文件也可以在 WebApp.ear 中捆绑和部署。

问题

必须使用 CLASSPATH 更新什么文件,以便 Web 应用程序可以使用报表服务成功找到 ReportService.jar/META-INF/ 目录中的文件,该目录嵌套在 [=17] 中=]?

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

想法

资源

变化:

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

至:

getClass().getResource(filename)