是否有人知道如何通过编程方式获得在同一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