2

これが私のプロジェクトのMaven構造です

アプリ
  >共通モジュール
  >webapp-モジュール
  >バッチモジュール
 pom.xml

はクラスcommon-moduleを公開しVersionます。このクラスは、webappモジュールとバッチモジュールの両方で使用されます。

このVersionクラスには、と呼ばれる1つの固有の静的メソッドがありgetます。プロジェクトのグローバルバージョンを返します。

グローバルバージョンはプロパティファイルに保存されます。がgetバッチモジュール(スタンドアロンJavaアプリケーション)から呼び出されると、プロパティファイルが正常にロードされます。

Webアプリでは、状況が異なります。VersionBeanすべてのJSFページがメソッドを呼び出すことを許可するマネージドBeanを作成しましたget。次のいずれかを使用するときはいつでも

FacesContext.getCurrentInstance().getExternalContext()

FacesContext.getCurrentInstance().getExternalContext().getContext()

Thread.currentThread().getClassLoader()

私はproperties.fileを見つけることができません。

管理対象Beanからjarファイルにあるプロパティファイル(getResourceAsStream)をロードするにはどうすればよいですか?

編集
@BalusCと@eljuniorからのアドバイスに基づいて私が思いついた解決策は次のとおりです

VersionBean.java

@ManagedBean(eager=true)
@ApplicationScoped
public class VersionBean {
    private String version;
    @PostConstruct
    public void init(){
        version = Version.get();
    }
}

Version.java

public class Version {
    public static String get() {
        InputStream is = Version.class.getResourceAsStream("/version.properties");

        // Read InputStream and return version string ...
    }
}
4

2 に答える 2

11

MavenがどのようにWARを構築し、プロパティファイルが実際にどこにあるかはわかりませんが、少なくともどのようExternalContext#getResourceAsStream()に 動作するかはわかります。Thread#getContextClassLoader()Class#getClassLoader()

  1. ExternalContext#getResourceAsStream() Webコンテンツフォルダー(WARとフォルダーも存在する)およびWebアプリケーションにデプロイされたJARファイルのフォルダー内
    ExternalContext#getResourceAsStream()Webアプリケーションリソースをスキャンします。指定されたパスは常にそれらのルートフォルダからの相対パスであり、。で始まる必要があります。/WEB-INF/META-INF/META-INF/resources/WEB-INF/lib/

    InputStream input = externalContext
        .getResourceAsStream("/WEB-INF/version.properties");
    
  2. Thread#getContextClassLoader()
    は、クラスパス のThread#getContextClassLoader()「ルート」で動作します。これは、webapp、appserver、およびJVMのクラスパスでカバーされるすべてのフォルダーをカバーします。指定されたパスは常にクラスパスルートを基準にしており、で始めることはできません/。プロパティファイルがパッケージに含まれている場合は、パッケージ構造を/区切り文字としてのファイルシステムパスとして扱う必要があることに注意してください。以下の例では、パッケージに含まれていることを前提としていますcom.example.version

    InputStream input = Thread.currentThread().getContextClassLoader()
        .getResourceAsStream("com/example/version/version.properties");
    
  3. Class#getClassLoader()は、クラス自体の場所に関連して動作します
    Class#getClassLoader()指定されたパスは、相対パスまたは絶対パスのいずれかです。相対的な場合は、クラス自体の場所に相対的です。絶対的な場合は、クラスパスルートに対して絶対的です。これは、クラスパスでカバーされている他のすべてのフォルダに必ずしもアクセスできるわけではないことに注意してください。VersionBean次の例では、プロパティファイルがクラスと同じパッケージに含まれていることを前提としています。

    InputStream input = VersionBean.class
        .getResourceAsStream("version.properties");
    

    または、別のパッケージに含まれている場合、たとえばcom.example.other(先頭に注意してください/):

    InputStream input = VersionBean.class
        .getResourceAsStream("/com/example/other/version.properties");
    
于 2012-06-03T23:35:06.033 に答える
0

プロパティファイルのロードをクラスの同じクラスローダーに委任します。Versionメソッドgetで、を使用しますVersion.class.getResourceAsStream("yourFile.properties");

これは、Versionクラスをロードできる場所であればどこでも機能するはずなので、Webアプリでも機能します(もちろん、プロパティファイルが実際にcommon- modulejarファイル内にある場合:)。

次に、VersionBeanは、アプリケーションの初期化時にプロパティをロードしたばかりのアプリケーションスコープのBeanである可能性があります。たとえば、次のようになります。

@ManagedBean(eager=true)
@ApplicationScoped
public class VersionBean {
    private String version;
    @PostConstruct
    public void init(){
        version = Version.get();
    }
}

2.0より前のバージョンのJSFを使用している場合は、アノテーションとfaces-config.xmlを使用する代わりに、で管理対象Beanを構成する必要があることに注意してください。@ManagedBean@ApplicationScoped

于 2012-06-03T21:56:30.420 に答える