2009-08-05 9 views

Antwort

3

Ich mache diesen Weg.
EAR einen Dienst MyService hat, wo ich mit EAR Inhalt arbeiten:

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

Ich könnte einen einfacheren Weg verwenden, da die Klasse, wo ich diesen Pfad brauche, ich innerhalb der EAR bin, die die WAR enthält, die die Dateien enthält, die ich kopieren möchte. Also, ich brauchte nur 1 Zeile Code: String path = this.getClass(). GetClassLoader(). GetResource ("my_war_filename.war"). GetPath(); Danke! – ptdev

2

Dies ist ziemlich fummelig, aber Sie können dies tun, indem Sie die MBean JBoss MainDeployer abfragen. Die MBean wird unter jboss.system:service=MainDeployer gefunden und hat eine JMX-Operation listDeployments. Dies gibt eine Sammlung von DeploymentInfo Objekten zurück, von denen eines Ihre EAR-Bereitstellung sein wird. Diese DeploymentInfo verfügt über eine url-Eigenschaft, bei der es sich um eine file://-URL handelt, die Ihr Bereitstellungsverzeichnis beschreibt.

Schön, oder? Sie können dazu die rohe JMX-API verwenden, aber Spring bietet einen viel besseren Mechanismus, indem Sie eine MBeanProxyFactoryBean verwenden, um eine Instanz von MainDeployerMBean freizugeben.

Ich möchte einen einfacheren Weg finden, aber das ist das Beste, was ich bisher gefunden habe.

+0

Vielen Dank für Ihre Hilfe! Es funktionierte in meinem Fall jedoch nicht: Ich benutze SeamFramework zusammen mit JBoss, und ich brauche diesen Code, um von einer Methode zu starten, die als @Observer ("org.jboss.seam.postInitialization") bezeichnet wird, die aufgerufen wird wenn eine Seam-Anwendung gestartet wird. An diesem Punkt würde ich einen MainDeployerMBean bekommen, der berichtete: 0 deployed EARs, 0 unvollständig und 0 warten auf die Bereitstellung ... – ptdev

1

Sind diese Ressourcen unter einem Webpfad (innerhalb einer WAR) zugeordnet oder verfügbar?

Wenn ja, könnten Sie versuchen, ServletContext.getRealPath() zu verwenden, um den virtuellen Pfad in den Real/Dateisystempfad zu übersetzen.

+0

Danke für Ihre Hilfe! In meinem Fall funktionierte es jedoch nicht: Wie ich in einem anderen Kommentar gesagt habe, benutze ich dies beim Seam-Startup. Ich konnte zu diesem Zeitpunkt keinen Weg finden, um einen ServletContext zu erhalten (er würde als Null zurückkehren). – ptdev

3

Um die ServletContext von Naht zu erhalten, können Sie tun:

ServletLifecycle.getCurrentServletContext() 

, die so schnell zur Verfügung steht als Seam die erstellt wurde applicationContext. Und dann funktioniert getRealPath("/") für den Bereitstellungsordner des Stammkontexts. Jede Ordnerstruktur innerhalb des Kontextstamms kann erreicht werden.

3

können Sie tun, Sie "System.getProperty()" ist hier die link für andere Eigenschaften können Sie

ex verwendet:

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

Ergebnis

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

Nachdem Sie nur muss hinzugefügt werden "/deployments/YOUR_PROJECT_EAR/..."

Verwandte Themen