Pregunta

¿Alguien sabe cómo obtener programáticamente la ruta absoluta en el sistema de archivos para un EAR implementado en JBoss, desde el código Java dentro de ese mismo EAR?

Necesito esto porque quiero copiar algunos archivos que están dentro del EAR a otra parte del sistema de archivos, en tiempo de implementación.

¡Gracias a todos!

¿Fue útil?

Solución

Lo hago de esta manera.
EAR tiene un servicio MyService, donde trabajo con los contenidos de 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");
    }
}

Otros consejos

puede hacer usted " System.getProperty () " aquí está el enlace para otras propiedades que puede usar

ex:

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

resultado

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

Después de que solo necesite agregar "/deployments/YOUR_PROJECT_EAR/..."

Para obtener el ServletContext de Seam, puede hacer:

ServletLifecycle.getCurrentServletContext()

que está disponible en cuanto Seam ha creado el applicationContext . Y luego getRealPath (" / ") funciona bien para la carpeta de implementación del contexto raíz. Se puede acceder a cualquier estructura de carpetas dentro de la raíz de contexto.

Esto es bastante complicado, pero puede hacerlo consultando el MBean MainDeployer de JBoss. El MBean se encuentra en jboss.system: service = MainDeployer , y tiene una operación JMX listDeployments . Esto devuelve una colección de objetos DeploymentInfo , uno de los cuales será su implementación EAR. Ese DeploymentInfo tiene una propiedad url que es un file: // URL que describe su directorio de implementación.

Bien, ¿eh? Puede usar la API JMX sin procesar para hacer esto, pero Spring proporciona un mecanismo mucho mejor, usando un MBeanProxyFactoryBean para exponer una instancia de MainDeployerMBean .

Me gustaría encontrar una forma más simple, pero eso es lo mejor que he encontrado hasta ahora.

¿Estos recursos están asignados o disponibles bajo una ruta web (dentro de un WAR)?

Si es así, podría intentar usar ServletContext.getRealPath () para traducir la ruta virtual a la ruta real / del sistema de archivos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top