SMART Deploy
S2Container 2.4.x以降に導入されたSMART Deploy機能を利用したS2Directoryの設定方法を紹介します。なお、SMART Deployの詳細な説明については、S2Containerのドキュメントを読んでください。
S2Directoryに関連するルートパッケージ直下のSMART Deployのための要素
S2Directoryに関連するルートパッケージ直下の要素は次のとおりです。
| 個別パッケージ | クラスの命名規約 | 説明 |
|---|---|---|
| directorydao | 任意の名前 + DirectoryDao | ディレクトリにアクセスするためのインタフェースです。インタフェースにメソッドを書いておくだけで、データアクセスのロジックは、アスペクトが自動生成します。実装部分を作る必要はありません。 |
S2Container 2.4.14 - 2.4.17と一緒にS2Directoryを利用する場合、個別パッケージ名をdirectoryDaoとしないと正常に動作しません。
この問題は2.4.13以前、および、2.4.18以降では発生しません。
例
- org.example.directorydao.PosixAccountDirectoryDao
- org.example.directorydao.PosixGroupDirectoryDao
S2Strutsを使ったWEBアプリケーションでのに組み合わせたSMART Deploy設定例
下図はS2Strutsを使ったWEBアプリケーションにS2Directoryを組み合わせたSMART Deploy時のパッケージ構成例です。WEB-INF/src/main/java と WEB-INF/src/main/resources は、WEB-INF/classes 以下にコンパイルされたクラスファイルと設定ファイルとして出力されます。
既に構成されたアプリケーションに対して、S2Directoryのために新たに設定する必要があるdiconファイルは次の4つです。
S2Strutsを使ったSMART Deploy時のWEBアプリケーションでのパッケージ構成例
上図で登場するdiconファイルについて説明します。S2Directoryのために新たに設定する必要がある箇所はボールド体になっています。
app.dicon
アプリケーションを構成するルートとなるdiconファイルです。S2Directoryの基本機能を提供するためのシステム設定(DI設定、AOP定義)を有効にするためにdirectorydao.diconファイルをincludeします。
- See Also: [S2Container] DIContainer - app.diconの役割
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<include path="convention.dicon"/>
<include path="aop.dicon"/>
<include path="directorydao.dicon"/>
<include condition="#ENV != 'ut'" path="s2struts.dicon"/>
<include condition="#ENV == 'ut'" path="s2struts-hotdeploy.dicon"/>
</components>
application_ja.properties, application.properties
S2Strutsで使用するリソース定義ファイルです。主にエラーメッセージなどを記載しておきます。詳細については、S2Sturtsのドキュメントを読んでください。
- See Also: [S2Struts] S2Strutsリファレンス - 基本的な使い方
convention.dicon
アプリケーションのネーミング規約を定義するdiconファイルです。SMART deployを利用する場合に必要となります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<component class="org.seasar.framework.convention.impl.NamingConventionImpl">
<initMethod name="addRootPackageName">
<arg>"org.seasar.server.members"</arg>
</initMethod>
</component>
</components>
creator.dicon
ネーミング規約に基づいてコンポーネント定義を作成するCreatorを定義するdiconファイルです。SMART deployを利用する場合に必要となります。S2DirectoryのためのDirectoryDaoインタフェースをネーミング規約に従いコンポーネント定義するために org.seasar.directory.dao.creator.DirectoryDaoCreator を追加します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<include path="convention.dicon"/>
<include path="customizer.dicon"/>
<component class="org.seasar.framework.container.creator.ActionCreator"/>
<component class="org.seasar.directory.dao.creator.DirectoryDaoCreator"/>
<component class="org.seasar.framework.container.creator.DtoCreator">
<property name="instanceDef">
@org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
</property>
</component>
<component class="org.seasar.framework.container.creator.LogicCreator"/>
<component class="org.seasar.framework.container.creator.ServiceCreator"/>
<component class="org.seasar.framework.container.creator.InterceptorCreator"/>
<!--
<component class="org.seasar.framework.container.creator.DaoCreator"/>
<component class="org.seasar.framework.container.creator.DxoCreator"/>
<component class="org.seasar.framework.container.creator.HelperCreator"/>
<component class="org.seasar.framework.container.creator.PageCreator"/>
<component class="org.seasar.framework.container.creator.ValidatorCreator"/>
<component class="org.seasar.framework.container.creator.ConverterCreator"/>
-->
</components>
customizer.dicon
Creatorが作成したコンポーネント定義をカスタマイズするCustomizerを定義するdiconファイルです。SMART deployを利用する場合に必要となります。S2DirectoryのためのDirectoryDaoインタフェースにS2Directoryのインタセプターを適用するのにdirectoryDaoAspectCustomizerに関する設定を追加します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<include path="default-customizer.dicon"/>
<!-- AspectCustomizer -->
<component name="directoryDaoAspectCustomizer"
class="org.seasar.framework.container.customizer.AspectCustomizer">
<property name="interceptorName">"directorydao.interceptor"</property>
</component>
<!-- CustomizerChain -->
<component name="txAspectCustomizer"
class="org.seasar.framework.container.customizer.AspectCustomizer">
<property name="interceptorName">"j2ee.requiredTx"</property>
</component>
<component name="actionCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>traceCustomizer</arg>
</initMethod>
</component>
<--
<component name="daoCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>traceCustomizer</arg>
</initMethod>
<initMethod name="addCustomizer">
<arg>s2DaoCustomizer</arg>
</initMethod>
</component>
-->
<component name="directoryDaoCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>traceCustomizer</arg>
</initMethod>
<initMethod name="addCustomizer">
<arg>directoryDaoAspectCustomizer</arg>
</initMethod>
</component>
<!--
<component name="dxoAspectCustomizer"
class="org.seasar.framework.container.customizer.AspectCustomizer">
<property name="interceptorName">"dxo.interceptor"</property>
</component>
<component name="dxoCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>traceCustomizer</arg>
</initMethod>
<initMethod name="addCustomizer">
<arg>dxoAspectCustomizer</arg>
</initMethod>
</component>
-->
<component name="logicCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>traceCustomizer</arg>
</initMethod>
<initMethod name="addCustomizer">
<arg>txAspectCustomizer</arg>
</initMethod>
</component>
<component name="serviceCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>traceCustomizer</arg>
</initMethod>
<initMethod name="addCustomizer">
<arg>txAspectCustomizer</arg>
</initMethod>
</component>
</components>
directory.dicon
ディレクトリサーバに接続するための各種設定情報を定義するdiconファイルです。詳細については、Configurationのdirectory.diconについての説明を読んでください。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components namespace="directory"> <!-- # Directory Configuration --> <component name="directoryControlProperty" class="org.seasar.directory.impl.DirectoryControlPropertyImpl" instance="prototype"> <property name="initialContextFactory"> "com.sun.jndi.ldap.LdapCtxFactory" </property> <!-- # PermissiveSSLSocketFactory is not strictly secure. # But, it can connect to the server having the SSL certificate signed by own CA. # default value: <property name="sslSocketFactory"> "javax.net.ssl.SSLSocketFactory" </property> --> <property name="sslSocketFactory"> "org.seasar.directory.impl.PermissiveSSLSocketFactory" </property> <property name="enableTLS">false</property> <property name="url"> "ldap://localhost:389" </property> <property name="baseDn">"dc=seasar,dc=org"</property> <property name="bindDn">"cn=Manager,dc=seasar,dc=org"</property> <property name="password">"secret"</property> <property name="passwordAlgorithm">"SHA"</property> <!-- # Other options and each default value. <property name="authentication">"simple"</property> <property name="user"></property> <property name="passwordAlgorithm">"SSHA"</property> <property name="passwordSaltLength">"4"</property> <property name="userSuffix">"ou=Users"</property> <property name="userAttributeName">"uid"</property> <property name="groupSuffix">"ou=Groups"</property> <property name="groupAttributeName">"memberUid"</property> <property name="multipleValueDelimiter">"DEFAULT_MULTIPLE_VALUE_DELIMITER"</property> --> </component> </components>
env.txt
SMART deployの種類を定義するテキストファイルです。開発中はHOT deployで動かすためutと記述し、リリース時はCOOL deployで動かすためにproductと記述します。
ut
log4j.properties
log4Jのための設定ファイルです。デバッグ情報が必要な場合は、log4j.category.org.seasarの値をDEBUG, Cに、不要な場合は、INFO, Cに設定します。
- See Also: [log4j] log4j documentation
log4j.category.org.seasar=DEBUG, C #log4j.category.org.seasar=INFO, C log4j.additivity.org.seasar=false log4j.appender.C=org.apache.log4j.ConsoleAppender log4j.appender.C.Target=System.out log4j.appender.C.ImmediateFlush=true log4j.appender.C.layout=org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern=%-5p %d [%t] %m%n log4j.rootLogger=INFO, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
s2container.dicon
S2コンテナをカスタマイズするための設定を定義するdiconファイルです。SMART deployを利用する場合に必要となります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<include condition="#ENV == 'ut'" path="hotdeploy.dicon"/>
<include condition="#ENV == 'ct' || #ENV == 'it'" path="warmdeploy.dicon"/>
<include condition="#ENV == 'product'" path="cooldeploy.dicon"/>
</components>
設定後の開発
SMART Deploy用の設定は一度設定してしまえば、開発中変更する必要はありません。設定後は通常と同じ使い方でS2Directoryを使うことができます。
