誰かが、同じEAR内のJavaコードから、JBossにデプロイされたEARのファイルシステムにおける絶対パスをプログラムで取得する方法を知っていますか?JBossで現在のEARの場所を取得する方法
デプロイ時に、EAR内部のファイルをファイルシステムの別の部分にコピーしたいので、これが必要です。
ありがとう皆さん!
誰かが、同じEAR内のJavaコードから、JBossにデプロイされたEARのファイルシステムにおける絶対パスをプログラムで取得する方法を知っていますか?JBossで現在のEARの場所を取得する方法
デプロイ時に、EAR内部のファイルをファイルシステムの別の部分にコピーしたいので、これが必要です。
ありがとう皆さん!
このようにします。
EAR私はEARの内容で動作するサービスMYSERVICEを、持っている:
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
オブジェクトのコレクションが返されます。そのうちの1つがEARデプロイメントになります。 DeploymentInfoにはurl
プロパティがあり、展開ディレクトリを説明するfile://
というURLがあります。
ニース、ええ?生のJMX APIを使用してこれを行うことができますが、SpringはMBeanProxyFactoryBean
を使用してMainDeployerMBean
のインスタンスを公開するという非常に優れたメカニズムを提供します。
私はもっと簡単な方法を探していますが、それは今まで私が見つけた最高のものです。
ありがとうございました!私の場合は動作しませんでした。私はSeamFrameworkをJBossと一緒に使用しています。このコードは@Observer( "org.jboss.seam.postInitialization")というアノテーションが付けられたメソッドから実行する必要があります。 Seamアプリケーションの起動時に発生します。この時点で私はMainDeployerMBeanを取得して報告しています:0デプロイ済みEAR、0不完全、0デプロイを待っています... – ptdev
これらのリソースは、Webパス(WAR内)でマップされているか、または使用可能になっていますか?
もしそうなら、ServletContext.getRealPath()
を使用して、仮想パスを実際の/ファイルシステムパスに変換することができます。
ありがとうございました!しかし私の場合はうまくいきませんでした:別のコメントで述べたように、私はこれをSeamの起動時に使用しています。私はこの時点でServletContextを取得する方法を見つけることができませんでした(これはnullとして返されます)。 – ptdev
縫い目からServletContext
を取得するには、行うことができます:
ServletLifecycle.getCurrentServletContext()
をapplicationContext
。そして、getRealPath("/")
は、ルートコンテキストの展開フォルダでうまく動作します。コンテキストルート内の任意のフォルダ構造に到達できます。ちょうどあなたの後
String jBossPath = System.getProperty("jboss.server.base.dir")
結果
"/Users/ALL_THE_PATH/JBoss_7-1/standelone"
:
あなたが行うことができます"はSystem.getProperty()は、" ここにあなたが
EXを使用することができ、他のプロパティのlinkです追加する必要があります"/deployments/YOUR_PROJECT_EAR/..."
私はそのパスが必要なクラスのため、私はコピーしたいファイルが入っているWARを保持しているEARの中にいるので、もっと簡単な方法を使うことができます。 これで1行のコードが必要になりました。 String path = this.getClass()。getClassLoader()。getResource( "my_war_filename.war")。getPath(); ありがとう! – ptdev