2 つの設定が必要な Web アプリがあります。
- JDBC データソース
- 文字列トークン
1 つの .war をさまざまなコンテナー (jetty、tomcat、gf3 最小) にデプロイし、コンテナー内のアプリケーション レベルでこれらの設定を構成できるようにしたいと切望しています。
私のコードはこれを行います:
InitialContext ctx = new InitialContext();
Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
token = (String)envCtx.lookup("token");
ds = (DataSource)envCtx.lookup("jdbc/datasource")
グラスフィッシュ管理インターフェースを使用して 2 つの jdbc リソースを作成したと仮定しましょう: jdbc/test-datasource と jdbc/live-datasource は、同じスキーマの異なるコピー、異なるサーバー、異なる資格情報などに接続します。これをグラスフィッシュに渡し、テストデータソースを指すようにすると、sun-web.xml にこれが含まれている可能性があります。
...
<resource-ref>
<res-ref-name>jdbc/datasource</res-ref-name>
<jndi-name>jdbc/test-datasource</jndi-name>
</resource-ref>
...
しかし
- sun-web.xml は私の戦争の中に入りますよね?
- 確かに、管理インターフェイスを介してこれを行う方法が必要です
私は正しいことをしようとしていますか?他のコンテナはこれを簡単にしますか? 開発に使用しているため、jetty 7 がこれをどのように処理するかに特に興味があります。
編集Tomcatにはこれを行うための合理的な方法があります:
作成$TOMCAT_HOME/conf/Catalina/localhost/webapp.xml
する:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true">
<!-- String resource -->
<Environment name="token" value="value of token" type="java.lang.String" override="false" />
<!-- Linking to a global resource -->
<ResourceLink name="jdbc/datasource1" global="jdbc/test" type="javax.sql.DataSource" />
<!-- Derby -->
<Resource name="jdbc/datasource2"
type="javax.sql.DataSource"
auth="Container"
driverClassName="org.apache.derby.jdbc.EmbeddedDataSource"
url="jdbc:derby:test;create=true"
/>
<!-- H2 -->
<Resource name="jdbc/datasource3"
type="javax.sql.DataSource"
auth="Container"
driverClassName="org.h2.jdbcx.JdbcDataSource"
url="jdbc:h2:~/test"
username="sa"
password=""
/>
</Context>
override="false"
は逆の意味であることに注意してください。これは、この設定を でオーバーライドできないことを意味しますweb.xml
。
ファイルは戦争ではなくコンテナ構成の一部ですが、グローバル構成の一部ではないため、このアプローチが気に入っています。それはwebapp固有です。
完全なWeb管理インターフェースを備えているはずなので、glassfishにはもう少し期待していると思いますが、上記と同等のもので十分満足です.