2012-03-27 69 views
4

这种需求可能听起来有些复杂,如果是这样,那么我愿意提供有关实施的最佳实践的建议。我的问题是以下。我有一个WAR webapp,它包含在EAR中。一切都变得有些麻烦。从我的Web应用程序中,我试图显示耳朵的ID和耳朵的版本号以及战争。战争中的一个阶级有没有办法从它的耳朵中访问META-INF?

这场战争是一个相当容易处理的案例。我可以使用简单的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上进行。不过,理想情况下,我想要一个不依赖于服务器的解决方案。

谢谢!

埃里克

回答

5

我不相信这是可能的,因为一个事实,即耳朵,EJB和战争是有不同的类加载器,这是没有必要根据普遍的,可预见的和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; 

    // 
    // 
} 
+0

感谢您的提示。这可以很好地工作,但是,我似乎无法使注射器正常工作。我正在JBoss 7.0.2上运行,但env-entry似乎并没有被添加到jndi树中。你成功运行过哪些服务器? – 2012-03-28 15:47:46

+0

忽略我最后的评论;在配置文件中遇到问题。现在一切正常。谢谢! – 2012-03-28 16:09:44

+0

不客气,很乐意帮助 – Osw 2012-03-28 17:36:26

1

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

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

如果打包在两个WAR文件,并在你的EAR的JAR文件的代码,这可能会返回您取决于类加载器的正确信息。

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

+0

感谢您的提示。我没有尝试使用基于线程的类加载器,因为我正在寻找更通用的服务器。 @Osw有一个更通用的解决方案。 – 2012-03-28 16:10:45

相关问题