2009-08-05 10 views
7

Qualcuno sa come ottenere a livello di programmazione il percorso assoluto nel filesystem per un EAR distribuito in JBoss, dal codice Java all'interno dello stesso EAR?Come ottenere automaticamente la posizione EAR corrente con JBoss

Ho bisogno di questo perché voglio copiare alcuni file che si trovano all'interno dell'orecchio in un'altra parte del filesystem, il deploy-tempo.

Grazie a tutti!

risposta

3

Faccio così.
EAR ha un MyService di servizio, dove lavoro con contenuti all'orecchio:

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

Potrei usare un modo più semplice, dal momento che la classe in cui ho bisogno di quel percorso, io sono dentro l'EAR che contiene il WAR che contiene i file che voglio copiare. Quindi, avevo solo bisogno di 1 riga di codice: String path = this.getClass(). GetClassLoader(). GetResource ("my_war_filename.war"). GetPath(); Grazie! – ptdev

2

Si tratta di un'operazione abbastanza complessa, ma è possibile farlo interrogando l'MBean JBoss MainDeployer. L'MBean si trova a jboss.system:service=MainDeployer e ha un'operazione JMX listDeployments. Ciò restituisce una raccolta di oggetti DeploymentInfo, uno dei quali sarà la distribuzione EAR. Quella DeploymentInfo ha una proprietà url che è un URL file:// che descrive la directory di implementazione.

Bello, eh? È possibile utilizzare l'API JMX non elaborata per eseguire questa operazione, ma Spring offre un meccanismo molto più efficace, utilizzando uno MBeanProxyFactoryBean per esporre un'istanza di MainDeployerMBean.

Mi piacerebbe trovare un modo più semplice, ma questo è il migliore che ho trovato finora.

+0

Grazie per il vostro aiuto! Tuttavia, non ha funzionato nel mio caso: sto utilizzando SeamFramework insieme a JBoss e ho bisogno che questo codice venga eseguito da un metodo annotato come @Observer ("org.jboss.seam.postInitialization"), che viene chiamato quando inizia l'applicazione Seam. A questo punto otterrei un MainDeployerMBean che riporta: 0 EAR distribuiti, 0 incompleti e 0 in attesa di distribuzione ... – ptdev

1

Queste risorse sono mappate o rese disponibili in un percorso web (all'interno di una GUERRA)?

In tal caso, è possibile provare a utilizzare ServletContext.getRealPath() per convertire il percorso virtuale nel percorso reale/del file system.

+0

Grazie per il tuo aiuto! Tuttavia, non ha funzionato nel mio caso: come ho affermato in un altro commento, sto usando questo nell'avvio di Seam. Non sono riuscito a trovare un modo per ottenere un ServletContext a questo punto (ritornerebbe come null). – ptdev

3

Per ottenere risultati ServletContext da Seam, si può fare:

ServletLifecycle.getCurrentServletContext() 

che è disponibile non appena Seam ha creato il applicationContext. E quindi getRealPath("/") funziona bene per la cartella di distribuzione del contesto radice. È possibile raggiungere qualsiasi struttura di cartelle all'interno della root di contesto.

3

si può fare voi "System.getProperty()" Ecco la link per altri le proprietà che è possibile utilizzare

es:

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

risultato

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

Dopo aver appena è necessario aggiungere "/deployments/YOUR_PROJECT_EAR/..."

Problemi correlati