SCA の簡単なサンプルを作成
Tuscany 0.9 でスタンドアロン実行可能な簡単なサンプルを作成する。
手順は以下の通り。
- サービスの作成
- アセンブリモデルの構成ファイル作成
- クライアントの作成
- コンパイルと実行
サービスの作成
サービスインターフェースとその実装クラスを Java で記述。
package simple; //サービスインターフェース public interface SimpleService { String getMessage(String msg); }
サービスの実装クラスには通常 @Service アノテーションを使うようだが、Tuscany のスタンドアロン実行で使うにはアノテーションは不要だった。(SCA 1.0 の仕様を確認していないので、仕様上正しいかどうかは不明)
アセンブリモデルの構成ファイル作成
コンポジットの定義ファイルを作成する。
Simple.composite ファイル
<?xml version="1.0" encoding="UTF-8"?> <composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="Simple"> <component name="SimpleServiceComponent"> <implementation.java class="simple.SimpleServiceImpl"/> </component> </composite>
クライアントの作成
package simple; import org.apache.tuscany.sca.host.embedded.SCADomain; public class SimpleClient { public static void main(String[] args) { SCADomain scad = SCADomain.newInstance("Simple.composite"); SimpleService service = scad.getService(SimpleService.class, "SimpleServiceComponent"); System.out.println(service.getMessage("a1")); System.out.println(service.getMessage("a2")); scad.close(); } }
コンパイルと実行
コンパイルと実行時には、Tuscany のインストール先の lib ディレクトリ内の tuscany-sca-manifest.jar ファイルをクラスパスに設定する。
Ant 用のビルドファイル build.xml は以下のように記述した
<?xml version="1.0" encoding="Shift_JIS" ?> <project name="" default="compile" basedir="."> <property environment="env" /> <property name="src.dir" value="src" /> <property name="resources.dir" value="resources" /> <property name="dest.dir" value="dest" /> <property name="classes.dir" value="${dest.dir}/classes" /> <property name="dest.file" value="${dest.dir}/simple.jar" /> <property name="main.class" value="simple.SimpleClient" /> <path id="project.classpath"> <fileset dir="${env.TUSCANY_HOME}"> <include name="**/tuscany-sca-manifest.jar" /> </fileset> </path> <target name="compile"> <mkdir dir="${classes.dir}" /> <javac srcdir="${src.dir}" destdir="${classes.dir}"> <classpath refid="project.classpath" /> <include name="**/*.java" /> </javac> </target> <target name="package" depends="compile"> <jar destfile="${dest.file}"> <fileset dir="${classes.dir}" /> <fileset dir="${resources.dir}" /> <manifest> <attribute name="Main-Class" value="${main.class}" /> </manifest> </jar> </target> <target name="run" depends="package"> <java classname="${main.class}" fork="yes"> <classpath> <path location="${dest.file}" /> <path refid="project.classpath" /> </classpath> </java> </target> <target name="clean"> <delete dir="${dest.dir}" /> </target> </project>
ビルドで生成したファイルの構成は以下の通り
simple.jar ファイル
- simple ディレクトリ
- SimpleClient.class
- SimpleService.class
- SimpleServiceImpl.class
- Simple.composite
実行結果
>ant run Buildfile: build.xml compile: package: run: [java] a1:simple.SimpleServiceImpl@bc8e1e [java] a2:simple.SimpleServiceImpl@11671b2 BUILD SUCCESSFUL Total time: 8 seconds
なお、実行は J2SE 5.0 の環境を使う必要があるようで、JavaSE 6.0 では下のようなエラーが発生した。
run: [java] Exception in thread "main" javax.xml.stream.FactoryConfigurationErro r: Provider javax.xml.stream.XMLInputFactory could not be instantiated: java.lan g.InstantiationException [java] at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory. java:158) [java] at org.apache.tuscany.sca.contribution.service.impl.Contribution RepositoryImpl.<init>(ContributionRepositoryImpl.java:88) [java] at org.apache.tuscany.sca.host.embedded.impl.ReallySmallRuntimeB uilder.createContributionService(ReallySmallRuntimeBuilder.java:184) [java] at org.apache.tuscany.sca.host.embedded.impl.ReallySmallRuntime. start(ReallySmallRuntime.java:93) [java] at org.apache.tuscany.sca.host.embedded.impl.DefaultSCADomain.<i nit>(DefaultSCADomain.java:86) [java] at org.apache.tuscany.sca.host.embedded.SCADomain.createNewInsta nce(SCADomain.java:229) [java] at org.apache.tuscany.sca.host.embedded.SCADomain.newInstance(SC ADomain.java:68) [java] at simple.SimpleClient.main(Unknown Source) [java] Java Result: 1 BUILD SUCCESSFUL Total time: 6 seconds