JBossを使用してプログラムで現在のEARロケーションを取得する方法
質問
JBossにデプロイされたEARのファイルシステムで、同じEAR内のJavaコードから絶対パスをプログラムで取得する方法を知っている人はいますか?
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");
}
}
他のヒント
できます" System.getProperty()"使用できる他のプロパティのリンクがあります
ex:
String jBossPath = System.getProperty("jboss.server.base.dir")
結果
"/Users/ALL_THE_PATH/JBoss_7-1/standelone"
" / deployments / YOUR_PROJECT_EAR /..."
Seamから ServletContext
を取得するには、次のようにします。
ServletLifecycle.getCurrentServletContext()
Seamが applicationContext
を作成するとすぐに利用可能です。そして、 getRealPath(" /")
は、ルートコンテキストの展開フォルダーに対して正常に機能します。コンテキストルート内の任意のフォルダー構造に到達できます。
これは非常に面倒ですが、JBoss MainDeployer
MBeanを照会することでこれを行うことができます。 MBeanは jboss.system:service = MainDeployer
にあり、JMX操作 listDeployments
があります。これにより、 DeploymentInfo
オブジェクトのコレクションが返され、そのうちの1つがEARデプロイメントになります。そのDeploymentInfoには、展開ディレクトリを記述する file://
URLである url
プロパティがあります。
いいですか?生のJMX APIを使用してこれを行うことができますが、Springは MBeanProxyFactoryBean
を使用して MainDeployerMBean
のインスタンスを公開する、より優れたメカニズムを提供します。
もっと簡単な方法を見つけたいのですが、これが今まで見つけた中で最高です。
これらのリソースは、Webパスの下(WAR内)でマップまたは利用可能になっていますか?
その場合、 ServletContext.getRealPath()
を使用して、仮想パスを実/ファイルシステムパスに変換します。