2009-08-05 17 views
7

誰かが、同じEAR内のJavaコードから、JBossにデプロイされたEARのファイルシステムにおける絶対パスをプログラムで取得する方法を知っていますか?JBossで現在のEARの場所を取得する方法

デプロイ時に、EAR内部のファイルをファイルシステムの別の部分にコピーしたいので、これが必要です。

ありがとう皆さん!

答えて

3

このようにします。
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"); 
    } 
} 
+0

私はそのパスが必要なクラスのため、私はコピーしたいファイルが入っているWARを保持しているEARの中にいるので、もっと簡単な方法を使うことができます。 これで1行のコードが必要になりました。 String path = this.getClass()。getClassLoader()。getResource( "my_war_filename.war")。getPath(); ありがとう! – ptdev

2

これはかなり面倒ですが、JBoss MainDeployer MBeanを照会することでこれを行うことができます。 MBeanはjboss.system:service=MainDeployerにあり、JMX操作listDeploymentsがあります。これにより、DeploymentInfoオブジェクトのコレクションが返されます。そのうちの1つがEARデプロイメントになります。 DeploymentInfoにはurlプロパティがあり、展開ディレクトリを説明するfile://というURLがあります。

ニース、ええ?生のJMX APIを使用してこれを行うことができますが、SpringはMBeanProxyFactoryBeanを使用してMainDeployerMBeanのインスタンスを公開するという非常に優れたメカニズムを提供します。

私はもっと簡単な方法を探していますが、それは今まで私が見つけた最高のものです。

+0

ありがとうございました!私の場合は動作しませんでした。私はSeamFrameworkをJBossと一緒に使用しています。このコードは@Observer( "org.jboss.seam.postInitialization")というアノテーションが付けられたメソッドから実行する必要があります。 Seamアプリケーションの起動時に発生します。この時点で私はMainDeployerMBeanを取得して報告しています:0デプロイ済みEAR、0不完全、0デプロイを待っています... – ptdev

1

これらのリソースは、Webパス(WAR内)でマップされているか、または使用可能になっていますか?

もしそうなら、ServletContext.getRealPath()を使用して、仮想パスを実際の/ファイルシステムパスに変換することができます。

+0

ありがとうございました!しかし私の場合はうまくいきませんでした:別のコメントで述べたように、私はこれをSeamの起動時に使用しています。私はこの時点でServletContextを取得する方法を見つけることができませんでした(これはnullとして返されます)。 – ptdev

3

縫い目からServletContextを取得するには、行うことができます:

とすぐに、Seamが作成したように提供されています
ServletLifecycle.getCurrentServletContext() 

applicationContext。そして、getRealPath("/")は、ルートコンテキストの展開フォルダでうまく動作します。コンテキストルート内の任意のフォルダ構造に到達できます。ちょうどあなたの後

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

結果

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

あなたが行うことができます
3

"はSystem.getProperty()は、" ここにあなたが

EXを使用することができ、他のプロパティのlinkです追加する必要があります"/deployments/YOUR_PROJECT_EAR/..."

関連する問題