Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java war中的类是否有办法从它访问META-INF';谁的耳朵?_Java_Maven_War_Ear_Pom.xml - Fatal编程技术网

Java war中的类是否有办法从它访问META-INF';谁的耳朵?

Java war中的类是否有办法从它访问META-INF';谁的耳朵?,java,maven,war,ear,pom.xml,Java,Maven,War,Ear,Pom.xml,这一需求听起来可能有点复杂,如果是这样,那么我愿意接受关于实施最佳实践的建议。我的问题如下。我有一个WAR网络应用程序,它包含在一个EAR中。一切都是专业化的。在我的webapp中,我试图显示ear和war的工件id和版本号 这场战争很容易处理。我可以使用简单的maven过滤将必要的artifactId/versionId注入正在构建的war中。然而,耳朵更为复杂 我知道有一个META-INF/maven///pom.properties,我可以在ear中查看它,它包含了这些信息,但我无法访问它

这一需求听起来可能有点复杂,如果是这样,那么我愿意接受关于实施最佳实践的建议。我的问题如下。我有一个WAR网络应用程序,它包含在一个EAR中。一切都是专业化的。在我的webapp中,我试图显示ear和war的工件id和版本号

这场战争很容易处理。我可以使用简单的maven过滤将必要的artifactId/versionId注入正在构建的war中。然而,耳朵更为复杂

我知道有一个META-INF/maven///pom.properties,我可以在ear中查看它,它包含了这些信息,但我无法访问它

我(在jsp页面中)尝试了以下内容,但没有成功(无论是否使用前导/);所有调用返回空值:

getClass().getClassLoader().getResource( "/META-INF/maven/<group>/<artifact>/pom.properties");
getClass().getClassLoader().getResourceAsStream( "/META-INF/maven/<group>/<artifact>/pom.properties");
getClass().getClassLoader().getResource(“/META-INF/maven///pom.properties”);
getClass().getClassLoader().getResourceAsStream(“/META-INF/maven///pom.properties”);
使用类加载器是否可行?或者它是否依赖于类加载器配置?有没有更好的方法来获取这些信息

我目前正在JBoss上运行测试,但最终部署将在WebSphere上进行。但是,理想情况下,我想要一个不依赖于服务器的解决方案

谢谢


Eric

我认为这是不可能的,因为EAR、EJB和WAR有不同的类加载器,根据一个通用的、可预测的和JavaEE范围的方案,这些类加载器没有必要相互链接

最近我遇到了类似的问题,我发现唯一可以接受的解决方案是在
application.xml
中指定
env entry
,并通过@Resource injection:

<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>

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

Thread.currentThread().getContextClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties");
Thread.currentThread().getContextClassLoader().getResourceAsStream(“/META-INF/maven///pom.properties”);
如果将此代码同时打包到WAR文件和EAR中的JAR文件中,则可能会根据类加载器返回正确的信息


免责声明:这可能不会在所有应用程序服务器中都同样适用,因为有些应用程序服务器使用统一的类加载器来处理web应用程序。

谢谢您的提示。这将非常好地工作,然而,我似乎不能让注射正常工作。我正在JBoss 7.0.2上运行ear,但是env条目似乎没有添加到jndi树中。您在哪台服务器上成功运行了此代码?忽略我的最后一条评论;配置文件有问题。现在一切都好了。谢谢我刚才遇到的唯一问题是这是jee6。jee5中不存在env条目。不幸的是,在只兼容JEE5的旧版本WebSphere上运行此功能。还有其他建议吗?@Eric,很难说。。在我的脑海中有一些疯狂的解决方案,但是最简单的一个呢?在构建/打包时在ear和war工件中放置相等的东西,然后回到您最初的方法?谢谢提示。我没有尝试使用基于线程的类加载器,因为我正在寻找更通用的服务器@Osw有一个更通用的解决方案。
Thread.currentThread().getContextClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties");