2009-08-05 13 views
7

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

Lo necesito porque quiero copiar algunos archivos que están dentro del EAR a otra parte del sistema de archivos, en tiempo de despliegue.

¡Gracias a todos!

Respuesta

3

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

Podría usar una forma más simple, ya que la clase donde necesito esa ruta, estoy dentro del EAR que contiene la GUERRA que contiene los archivos que quiero copiar. Por lo tanto, solo necesitaba 1 línea de código: Ruta de cadena = this.getClass(). GetClassLoader(). GetResource ("my_war_filename.war"). GetPath(); Gracias! – ptdev

2

Esto es bastante complicado, pero puede hacer esto consultando el MBean de JBoss MainDeployer. 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 de EAR. Que DeploymentInfo tiene una propiedad url que es una URL file:// que describe su directorio de implementación.

Agradable, ¿eh? Puede usar la API JMX sin procesar para hacer esto, pero Spring proporciona un mecanismo mucho más agradable, utilizando un MBeanProxyFactoryBean para exponer una instancia de MainDeployerMBean.

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

+0

Gracias por su ayuda! Sin embargo, no funcionó en mi caso: estoy usando SeamFramework junto con JBoss, y necesito este código para ejecutarlo desde un método anotado como @Observer ("org.jboss.seam.postInitialization"), que se llama cuando se inicia una aplicación Seam. En este punto, obtendría un MainDeployerMBean que informaba: 0 EAR desplegados, 0 incompletos y 0 en espera de implementación ... – ptdev

1

¿Están estos recursos mapeados o disponibles en una ruta web (dentro de un WAR)?

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

+0

¡Gracias por su ayuda! Sin embargo, no funcionó en mi caso: como dije en otro comentario, estoy usando esto en el inicio de Seam. No pude encontrar una forma de obtener un ServletContext en este punto (volvería como nulo). – ptdev

3

Para obtener el ServletContext de costura, que puede hacer:

ServletLifecycle.getCurrentServletContext() 

cuales está disponible tan pronto como la costura 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 del contexto.

3

que puede hacer que "System.getProperty()" Aquí está el link para otros las propiedades que puede usado

ejemplo:

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

resultado

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

Inmediatamente después de necesita agregar "/deployments/YOUR_PROJECT_EAR/..."

Cuestiones relacionadas