Как программно получить текущее местоположение EAR с помощью JBoss
Вопрос
Кто-нибудь знает, как программно получить абсолютный путь в файловой системе для EAR, развернутого в JBoss, из кода Java внутри того же EAR?
Мне это нужно, потому что я хочу скопировать некоторые файлы, находящиеся внутри EAR, в другую часть файловой системы во время развертывания.
Всем спасибо!
Решение
Я делаю так.
EAR имеет сервис MyService, где я работаю с содержимым EAR:
import org.jboss.system.ServiceControllerMBean;
import org.jboss.system.ServiceMBeanSupport;
public class MyService extends ServiceMBeanSupport {
public void workWithEar()
{
ServiceControllerMBean serviceController = (ServiceControllerMBean) MBeanProxy.get(
ServiceControllerMBean.class,
ServiceControllerMBean.OBJECT_NAME, server);
// server is ServiceMBeanSupport member
ClassLoader cl = serviceController.getClass().getClassLoader();
String path = cl.getResource("META-INF/jboss-service.xml").getPath()
InputStream file = cl.getResourceAsStream("META-INF/jboss-service.xml");
}
}
Другие советы
вы можете сделать "System.getProperty()" вот связь для других свойств, которые вы можете использовать
бывший:
String jBossPath = System.getProperty("jboss.server.base.dir")
результат
"/Users/ALL_THE_PATH/JBoss_7-1/standelone"
После того, как вам просто нужно добавить "/deployments/YOUR_PROJECT_EAR/..."
Чтобы получить ServletContext
из Seam, вы можете сделать следующее:
ServletLifecycle.getCurrentServletContext()
, который станет доступен, как только Seam создаст applicationContext
. И тогда getRealPath (" / ")
отлично работает для папки развертывания корневого контекста. Доступна любая структура папок внутри корневого контекста.
Это довольно сложно, но вы можете сделать это, обратившись к JBoss MainDeployer
MBean. MBean находится по адресу jboss.system: service = MainDeployer
и имеет операцию JMX listDeployments
. Это возвращает коллекцию объектов DeploymentInfo
, одним из которых будет ваше развертывание EAR. Это DeploymentInfo имеет свойство url
, которое представляет собой file: //
URL, описывающий ваш каталог развертывания.
Хорошо, а? Для этого можно использовать сырой API JMX, но Spring предоставляет гораздо более приятный механизм, использующий MBeanProxyFactoryBean
для предоставления экземпляра MainDeployerMBean
.
Я хотел бы найти более простой способ, но это лучшее, что я нашел до сих пор.
Сопоставлены ли эти ресурсы или сделаны доступными по веб-пути (в пределах WAR)?
Если это так, вы можете попытаться использовать ServletContext.getRealPath ()
для преобразования виртуального пути в путь к реальной / файловой системе.