Как программно получить текущее местоположение EAR с помощью JBoss

Кто-нибудь знает, как программно получить абсолютный путь в файловой системе для EAR, развернутого в JBoss, из кода Java в том же EAR?

Мне это нужно, потому что я хочу скопировать некоторые файлы, находящиеся внутри EAR, в другую часть файловой системы во время развертывания.

Всем спасибо!


person ptdev    schedule 05.08.2009    source источник


Ответы (5)


Я делаю так.
У 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");
    }
}
person avro    schedule 06.08.2009
comment
Я мог бы использовать более простой способ, поскольку класс, в котором мне нужен этот путь, находится в EAR, содержащем WAR, содержащий файлы, которые я хочу скопировать. Итак, мне просто понадобилась 1 строка кода: String path = this.getClass().getClassLoader().getResource(my_war_filename.war).getPath(); Спасибо! - person ptdev; 06.08.2009

вы можете сделать "System.getProperty()", вот ссылка для других свойств, которые вы можете использовал

ex:

String jBossPath = System.getProperty("jboss.server.base.dir")

результат

"/Users/ALL_THE_PATH/JBoss_7-1/standelone"

После нужно просто добавить "/deployments/YOUR_PROJECT_EAR/..."

person douarbou    schedule 26.03.2013
comment
Простое и чистое решение, очень полезное! - person theGabyRod; 21.06.2018

Чтобы получить ServletContext из Seam, вы можете сделать:

ServletLifecycle.getCurrentServletContext()

который доступен, как только Seam создаст файл applicationContext. И тогда getRealPath("/") отлично работает для папки развертывания корневого контекста. Доступна любая структура папок в корне контекста.

person sylvain    schedule 06.02.2012

Это довольно сложно, но вы можете сделать это, запросив JBoss MainDeployer MBean. MBean находится по адресу jboss.system:service=MainDeployer и имеет операцию JMX listDeployments. Это возвращает набор DeploymentInfo объектов, один из которых будет развертыванием EAR. Эта DeploymentInfo имеет свойство url, которое представляет собой URL-адрес file://, описывающий ваш каталог развертывания.

Красиво, а? Для этого вы можете использовать необработанный JMX API, но Spring предоставляет гораздо более удобный механизм, используя MBeanProxyFactoryBean для предоставления экземпляра MainDeployerMBean.

Я хотел бы найти более простой способ, но это лучшее, что я нашел до сих пор.

person skaffman    schedule 05.08.2009
comment
Спасибо за вашу помощь! Однако в моем случае это не сработало: я использую SeamFramework вместе с JBoss, и мне нужно, чтобы этот код запускался из метода, аннотированного как @Observer(org.jboss.seam.postInitialization), который вызывается, когда Запускается приложение для шва. В этот момент я получу MainDeployerMBean, который сообщает: 0 развернутых EAR, 0 незавершенных и 0 ожидающих развертывания... - person ptdev; 06.08.2009

Сопоставлены ли эти ресурсы или доступны по веб-пути (внутри WAR)?

Если это так, вы можете попытаться использовать ServletContext.getRealPath() для преобразования виртуального пути в реальный путь/путь файловой системы.

person matt b    schedule 05.08.2009
comment
Спасибо за вашу помощь! Однако в моем случае это не сработало: как я уже говорил в другом комментарии, я использую это при запуске Seam. На данный момент я не смог найти способ получить ServletContext (он вернет значение null). - person ptdev; 06.08.2009