2012-03-27 8 views
4

このニーズは少し複雑に聞こえるかもしれませんが、そうであれば、私は実装のベストプラクティスに関する提案を公開しています。私の問題は次のとおりです。私はEAR内に含まれているWAR webappを持っています。すべてがメイズ化されています。私のwebapp内から、耳と戦争のアーティファクトIDとバージョン番号を表示しようとしています。戦争中のクラスが耳からMETA-INFにアクセスする方法はありますか?

戦争はかなり簡単に処理できます。私は単純なmavenフィルタリングを使って、構築中のwarに必要なartifactId/versionIdを注入することができます。しかし、耳はより複雑です。

私は、その情報を含んでいる耳の中で見ることができるMETA-INF/maven /// pom.propertiesがあると知っていますが、アクセスすることはできません。

私は(jspページ内から)成功せずに(すべて/をつけずに)試しました。すべての呼び出しはnullを返します:

getClass().getClassLoader().getResource("/META-INF/maven/<group>/<artifact>/pom.properties"); 
getClass().getClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties"); 

これはクラスローダーを使用しても実行可能ですか?それとも、クラスローダーの設定に依存していますか?この情報を得るためのより良いアプローチはありますか?

私は現在JBossでテストを行っていますが、最終的な展開はWebSphere上にあります。しかし、理想的には、私はサーバーに依存しないソリューションを希望しています。

ありがとうございます!

エリック

私はそれが原因で耳、EJBおよび戦争は普遍的、予測可能とJava EE全体のスキームに従って相互にリンクされている必要はない異なるクラスローダーを、持っているという事実のために可能だとは思わない

答えて

5

は最近、私は同様の問題に出くわした、と私が見つけた唯一の受け入れ可能な解決策は、application.xmlenv-entryを指定し、@Resource注入によって、それを読んでいた。

任意のクラスで
<application xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" 
      version="6"> 

    <!-- usual stuff goes here --> 
    <env-entry> 
    <description>application-wide property</description> 
    <env-entry-name>java:app/env/AppWideProperty</env-entry-name> 
    <env-entry-type>java.lang.String</env-entry-type> 
    <env-entry-value>stackoverflow.com</env-entry-value> 
    </env-entry> 


</application> 

と後で:

public class CalcResultCachePool { 
    @Resource(lookup="java:app/env/AppWideProperty") 
    String appWideProperty; 

    // 
    // 
} 
+0

チップをありがとう。これはかなりうまくいくはずですが、私は注射が適切に機能するようには思えません。私はJBoss 7.0.2で耳を動かしていますが、env-entryはjndiツリーに追加されていないようです。どのサーバーでこのコードを正常に実行しましたか? –

+0

最後のコメントを無視してください。 configファイルに問題がありました。すべて今はうまく動作します。ありがとう! –

+0

ご歓迎ありがとうございました。 – Osw

1

関連するアーティファクトのContextClassLoaderを使用しようとしましたか? Webアプリケーションでは、ContextClassLoaderは、配備されたアプリケーションのクラスパスからファイルを取得するための好ましい方法です。あなたはWARファイルの両方で、あなたEARでJARファイルにこのコードをパッケージ化する場合

Thread.currentThread().getContextClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties"); 

、これはあなたのクラスローダに応じた正しい情報を返すことがあります。

免責事項:一部のアプリケーションサーバーがWebアプリケーション用に統一されたクラスローダーを使用しているため、同じアプリケーションサーバーでは機能しない可能性があります。

+0

チップをありがとう。私はスレッドベースのクラスローダーを試していませんでした。なぜなら、より多くのサーバージェネリックなものを探していたからです。 @Oswはもっと汎用的な解決策を持っていました。 –

関連する問題