战争中的一个班级有没有办法从它的耳边接入META-INF?

时间:2012-03-27 20:31:42

标签: java maven war ear pom.xml

这种需求可能听起来有点复杂,如果是这样,那么我愿意接受关于实施最佳实践的建议。我的问题如下。我有一个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上进行。但是,理想情况下,我想要一个不依赖于服务器的解决方案。

谢谢!

埃里克

2 个答案:

答案 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应用程序。