是否有人知道如何通過編程方式獲得在同一EAR中的Java代碼中部署在JBoss中的EAR的文件系統中的絕對路徑?如何以編程方式使用JBoss獲取當前EAR位置
我需要這個,因爲我想在部署時將EAR內部的一些文件複製到文件系統的另一部分。
謝謝大家!
是否有人知道如何通過編程方式獲得在同一EAR中的Java代碼中部署在JBoss中的EAR的文件系統中的絕對路徑?如何以編程方式使用JBoss獲取當前EAR位置
我需要這個,因爲我想在部署時將EAR內部的一些文件複製到文件系統的另一部分。
謝謝大家!
我這樣做。
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");
}
}
這很煩瑣,但你可以通過查詢JBoss MainDeployer
MBean來做到這一點。該MBean位於jboss.system:service=MainDeployer
,並具有JMX操作listDeployments
。這將返回一個DeploymentInfo
對象的集合,其中一個對象將是您的EAR部署。 DeploymentInfo具有url
屬性,該屬性是描述您的部署目錄的file://
URL。
不錯,呃?您可以使用原始JMX API執行此操作,但Spring提供了更好的機制,使用MBeanProxyFactoryBean
來公開MainDeployerMBean
的實例。
我想找到一個更簡單的方法,但這是迄今爲止我找到的最好的。
感謝您的幫助!然而,在我的情況下,它並不起作用:我將SeamFramework與JBoss一起使用,並且我需要此代碼從註釋爲@Observer(「org.jboss.seam.postInitialization」)的方法運行,該方法被稱爲當一個Seam應用程序啓動時。在這一點上,我會得到一個MainDeployerMBean報告:0部署EARs,0不完整和0等待部署... – ptdev 2009-08-06 14:14:41
這些資源是在Web路徑下(在WAR中)映射還是可用?
如果是這樣,您可以嘗試使用ServletContext.getRealPath()
將虛擬路徑轉換爲真實/文件系統路徑。
感謝您的幫助!然而,在我的情況下它並沒有工作:正如我在另一個評論中指出的那樣,我在Seam的啓動中使用了它。我無法找到一種方法來獲取ServletContext(它將返回爲null)。 – ptdev 2009-08-06 14:16:46
要想從縫中ServletContext
,你可以這樣做:
ServletLifecycle.getCurrentServletContext()
其儘快縫創造了可applicationContext
。然後getRealPath("/")
適用於根上下文的部署文件夾。可以到達上下文根中的任何文件夾結構。
你可以做你 「System.getProperty()」 這裏是link其他的屬性,你可以使用
例如:
String jBossPath = System.getProperty("jboss.server.base.dir")
結果
"/Users/ALL_THE_PATH/JBoss_7-1/standelone"
你經過短短需要添加"/deployments/YOUR_PROJECT_EAR/..."
我可以使用更簡單的方法,因爲我需要該路徑的類,我在EAR中保存包含我想要複製的文件的WAR。所以,我只需要1行代碼: String path = this.getClass()。getClassLoader()。getResource(「my_war_filename.war」)。getPath(); 謝謝! – ptdev 2009-08-06 14:12:30