【问题标题】:Is there any way for a class within a war to access the META-INF from it's ear?战争中的班级有什么办法可以从它的耳朵中访问 META-INF?
【发布时间】:2012-04-11 10:31:41
【问题描述】:

这种需求可能听起来有点令人费解,如果是这样,那么我愿意接受有关实施最佳实践的建议。我的问题如下。我有一个 WAR webapp,它包含在 EAR 中。一切都是mavenized。在我的 webapp 中,我试图显示 ear 和 war 的工件 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 上。但是,理想情况下,我想要一个不依赖于服务器的解决方案。

谢谢!

埃里克

【问题讨论】:

    标签: java maven war ear pom.xml


    【解决方案1】:

    我不认为这是可能的,因为 EAR、EJB 和 WAR 具有不同的类加载器,根据通用、可预测和 Java EE 范围的方案,它们没有必要相互链接。

    最近我遇到了类似的问题,我找到的唯一可接受的解决方案是在application.xml 中指定env-entry 并通过@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;
    
      //
      //
    }
    

    【讨论】:

    • 感谢您的提示。这会很好地工作,但是,我似乎无法让注射正常工作。我在 JBoss 7.0.2 上运行耳朵,但 env-entry 似乎没有被添加到 jndi 树中。你在哪台服务器上成功运行了这段代码?
    • 忽略我最后的评论;配置文件有问题。现在一切正常。谢谢!
    • 我刚刚遇到的唯一问题是这是jee6。 jee5 中不存在 env-entry。不幸的是,在仅符合 JEE5 的旧版本 WebSphere 上运行它。还有其他建议吗?
    • @Eric,很难说.. 我想到了一些疯狂的解决方案,但最简单的一个呢 - 在构建/打包时在耳朵和战争工件中放置相同的东西并返回你原来的方法?
    【解决方案2】:

    您是否尝试过使用相关工件的ContextClassLoader?在 Web 应用程序中,ContextClassLoader 是从已部署应用程序的类路径中检索文件的首选方式。

    Thread.currentThread().getContextClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties");
    

    如果您将此代码打包到 WAR 文件和 EAR 中的 JAR 文件中,这可能会根据类加载器返回正确的信息。

    免责声明:这可能不适用于所有应用程序服务器,因为某些应用程序服务器使用统一的类加载器用于 Web 应用程序。

    【讨论】:

    • 感谢您的提示。我没有尝试使用基于线程的类加载器,因为我正在寻找更服务器通用的东西。 @Osw 有一个更通用的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多