Есть ли какой-нибудь способ для класса в войне получить доступ к META-INF из своего уха? - PullRequest
4 голосов
/ 28 марта 2012

Эта потребность может показаться немного запутанной, и если так, то я открыт для предложений относительно лучших практик для реализации. Моя проблема заключается в следующем. У меня есть веб-приложение WAR, которое содержится в EAR. Все мавенизировано. В своем веб-приложении я пытаюсь показать идентификаторы артефактов и номера версий уха и войны.

Война - дело довольно простое. Я могу использовать простую фильтрацию maven, чтобы внедрить необходимый artifactId / versionId в войну во время ее создания. Однако ухо сложнее.

Я знаю, что есть META-INF / maven /// pom.properties, на которые я могу посмотреть в ухе, которое содержит эту информацию, но я не вижу, чтобы получить к ней доступ.

Я пробовал (изнутри страницы jsp) следующее безуспешно (все с ведением и без) /; все вызовы возвращают ноль:

getClass().getClassLoader().getResource( "/META-INF/maven/<group>/<artifact>/pom.properties");
getClass().getClassLoader().getResourceAsStream( "/META-INF/maven/<group>/<artifact>/pom.properties");

Возможно ли это даже с помощью загрузчика классов? Или это зависит от конфигурации загрузчика классов? Есть ли лучший способ получить эту информацию?

В настоящее время я запускаю тесты на JBoss, но окончательное развертывание будет на WebSphere. Однако в идеале я хотел бы, чтобы решение не зависело от сервера.

Спасибо!

Эрик

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

Я не верю, что это возможно из-за того факта, что 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 голос
/ 28 марта 2012

Вы пытались использовать ContextClassLoader соответствующих артефактов?В веб-приложениях ContextClassLoader является предпочтительным способом получения файлов из пути к классу развернутого приложения.

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

Если вы упакуете этот код как в файл WAR, так и в файл JAR в вашем EAR, этоможет вернуть вам правильную информацию в зависимости от загрузчика классов.

Отказ от ответственности: это может работать не на всех серверах приложений одинаково, поскольку некоторые серверы приложений используют унифицированный загрузчик классов для веб-приложений.

...