这种需求可能听起来有点复杂,如果是这样,那么我愿意接受关于实施最佳实践的建议。我的问题如下。我有一个WAR webapp,它包含在EAR中。一切都是青春的。在我的webapp中,我试图显示耳朵和战争的神器ID和版本号。
战争是一个相当容易处理的案件。我可以使用简单的maven过滤在构建战争时将必要的artifactId / versionId注入到战争中。然而,耳朵更复杂。
我知道有一个META-INF / maven /// pom.properties,我可以在耳边看到包含该信息,但我看不到它。
我已经尝试过(从jsp页面内)以下内容但没有成功(所有有和没有领导/);所有调用都返回null:
getClass().getClassLoader().getResource( "/META-INF/maven/<group>/<artifact>/pom.properties");
getClass().getClassLoader().getResourceAsStream( "/META-INF/maven/<group>/<artifact>/pom.properties");
使用类加载器是否可行?或者是类加载器配置依赖吗?有没有更好的方法来获取这些信息?
我目前正在JBoss上运行测试,但最终的部署将在WebSphere上进行。但是,理想情况下,我想要一个不依赖于服务器的解决方案。
谢谢!
埃里克
答案 0 :(得分:5)
我不相信这是可能的,因为EAR,EJB和WAR具有不同的类加载器,根据通用,可预测和Java EE范围的方案,这些类加载器没有必要相互链接。
最近我遇到了类似的问题,我找到的唯一可接受的解决方案是在env-entry
中指定application.xml
并通过@Resource注入来读取它:
<application xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd"
version="6">
<!-- usual stuff goes here -->
<env-entry>
<description>application-wide property</description>
<env-entry-name>java:app/env/AppWideProperty</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>stackoverflow.com</env-entry-value>
</env-entry>
</application>
以及后来的任何课程:
public class CalcResultCachePool {
@Resource(lookup="java:app/env/AppWideProperty")
String appWideProperty;
//
//
}
答案 1 :(得分:1)
您是否尝试过使用相关工件的ContextClassLoader
?在Web应用程序中,ContextClassLoader
是从已部署应用程序的类路径中检索文件的首选方法。
Thread.currentThread().getContextClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties");
如果将此代码打包在WAR文件和EAR中的JAR文件中,则可能会根据类加载器返回正确的信息。
免责声明:这可能不适用于所有应用程序服务器,因为某些应用程序服务器使用统一的类加载器来处理Web应用程序。