来自 JBoss 6.2 上的 Web 应用程序的 .ear 文件中 Java 存档的类路径
Classpath for Java archive within .ear file from a web application on JBoss 6.2
背景
运行 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
环境
- Java1.7
- NetBeans 8.0.2
- JBoss 6.2.0 GA
问题
以下路径必须在 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 应用程序:
MANIFEST.MF
由 NetBeans 使用 project.properties
自动生成,目前不包含 Class-Path
条目。
jboss-app.xml
文件仅包含 <jboss-app/>
.
jboss-web.xml
文件包含上下文根、安全域和其他配置项。
application.xml
不存在。
WebApp.war
文件也可以在 WebApp.ear
中捆绑和部署。
问题
必须使用 CLASSPATH 更新什么文件,以便 Web 应用程序可以使用报表服务成功找到 ReportService.jar
的 /META-INF/
目录中的文件,该目录嵌套在 [=17] 中=]?
注意:每次构建 WebApp.war
时,构建过程(通过 build.xml 和构建-impl.xml)都会覆盖 MANIFEST.MF
。
想法
更新构建脚本。 更改构建-impl.xml 以更新 WebApp.war 的清单以设置 Class-Path
引用 ReportServices.jar 的条目。如果 .jar 文件在 ReportService.ear 文件中,它将如何找到它?
更新 Web 应用程序 EAR 清单。更改 WebApp.ear
内的 MANIFEST.MF
以包含 Class-Path:
条目。
资源
变化:
Thread.currentThread().getContextClassLoader().getResource(filename)
至:
getClass().getResource(filename)
背景
运行 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
环境
- Java1.7
- NetBeans 8.0.2
- JBoss 6.2.0 GA
问题
以下路径必须在 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 应用程序:
MANIFEST.MF
由 NetBeans 使用project.properties
自动生成,目前不包含Class-Path
条目。jboss-app.xml
文件仅包含<jboss-app/>
.jboss-web.xml
文件包含上下文根、安全域和其他配置项。application.xml
不存在。
WebApp.war
文件也可以在 WebApp.ear
中捆绑和部署。
问题
必须使用 CLASSPATH 更新什么文件,以便 Web 应用程序可以使用报表服务成功找到 ReportService.jar
的 /META-INF/
目录中的文件,该目录嵌套在 [=17] 中=]?
注意:每次构建 WebApp.war
时,构建过程(通过 build.xml 和构建-impl.xml)都会覆盖 MANIFEST.MF
。
想法
更新构建脚本。 更改构建-impl.xml 以更新 WebApp.war 的清单以设置
Class-Path
引用 ReportServices.jar 的条目。如果 .jar 文件在 ReportService.ear 文件中,它将如何找到它?更新 Web 应用程序 EAR 清单。更改
WebApp.ear
内的MANIFEST.MF
以包含Class-Path:
条目。
资源
变化:
Thread.currentThread().getContextClassLoader().getResource(filename)
至:
getClass().getResource(filename)