TomcatのJNDIは外部からアクセスできなくて困った時
Tomcatに設定されているデータソースをJavaアプリケーション(具体的にはJUnit)から参照したかったのですが、デフォルトではできないという事で、JNDIUnitTestHelperというのを発見しました。
http://www.junit.org/news/extension/index.htm#JNDI
JNDIUnitTestHelper付属のjndi_unit_test_helper.propertiesをコピーして(WEB-INF/にコピーした)内容を変更します。(私の場合Oracle)
com.javaranch.unittest.helper.sql.pool.JNDIName=java:comp/env/jdbc/test com.javaranch.unittest.helper.sql.pool.dbDriver=oracle.jdbc.driver.OracleDriver com.javaranch.unittest.helper.sql.pool.dbServer=jdbc:oracle:thin:@serverName:1521:SERVICE_NAME com.javaranch.unittest.helper.sql.pool.dbLogin=dbUserName com.javaranch.unittest.helper.sql.pool.dbPassword=dbPassword
そしてJUnitのsetUp()メソッドで初期化処理
protected void setUp() throws Exception { if(JNDIUnitTestHelper.notInitialized()){ JNDIUnitTestHelper.init("WEB-INF/jndi_unit_test_helper.properties"); } }
後はアプリケーション側で以下のように記述してあればデータソースが取得できます。
DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/test");
実際のJNDINameと合わせておけば、WEBアプリケーションとして動作させる時と、JUnit(or 単体)で動作させる時とで同じソースで実行できるのでとても助かりました。