Java EE 6: How to get module name and app name

Java EE 6では標準仕様として、アプリケーションからモジュール名やアプリケーション名をランタイムに取得する ことができるようになっています[1] 。これらの値は標準名としてJNDIから取得することができ、モジュール名が"java:module/ModuleName"、アプリケー ション名が"java:app/AppName"となっています。

InitialContext ctx = new InitialContext();
String moduleName = ctx.lookup("java:module/ModuleName");  // モジュール名
String appName = ctx.lookup("java:app/AppName");           // アプリケーション名

また、@Resourceによるリソースインジェクションを使用すれば、以下のようにして取得することもできます。

@Resource(lookup="java:module/ModuleName")
String moduleName;                          // モジュール名がインジェクションされる
@Resource(lookup="java:app/AppName")
String appName;                             // アプリケーション名がインジェクションされる

なお、EAR形式ではなく、Webモジュール単体やEJBモジュール単体としてデプロイした時のAppNameの値は、スペック上の記述では明確 ではないのですが、GlassFish V3 (3.1.2.2)、WebLogic 12c (12.1.1)、JBoss AS 7 (7.1.1)で確認した限りでは、 どのアプリケーションサーバでも、AppNameの値はModuleNameと同じ値が取得できるようです。

また、これらの値はWeb Profileのサーバでも同様に取得できるようです(GlassFishとJBossそれぞれのWeb Profile 実装で確認)。しかし、Apache TomEE (1.5.0)の現状の実装ではModuleNameの値が"localhost/<Webモジュール名 >"となってしまい、他のコンテナと異なる結果になってしまう点に注意してください。

Java EE 6以前の環境では、ランタイムにモジュール名やアプリケーション名を取得するには、事前に静的なプロパ ティファイルをアプリに仕込んでおいたり、モジュールのクラスパスから推測するなど、スマートではない手段を 取るしかなかったのですが、上記の仕様により非常に簡単に、かつポータビリティのある方法で実現することが可能 になっています。

なお、Apache Tomcat 7.0はServlet 3.0仕様として実装されているようですが、上記の方法でモジュール名・アプリ ケーション名をJNDIから取得することはできないことを確認しています。

結論:「Tomcatではなく、標準のJava EEコンテナを使うべき理由がまた一つ増えました」


[1] Java EE 6スペック(JSR 316)上の記述を以下に抜粋します (pp.122-123):

EE.5.15 Application Name and Module Name References

A component may access the name of the current application using the pre-defined JNDI name java:app/AppName. A component may access the name of the current module using the pre-defined JNDI name java:module/ModuleName. Both of these names are represented by String objects.

投稿されたコメント:

コメント
  • HTML文法 不許可
About

Takashi Nishigaya
Principal Consultant
Technology Solution Consulting
Oracle Consulting Services

Search

Categories
Archives
« 4月 2014
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今日