2010/03/19

書籍まとめ買い

やっぱり書籍から学ぶことは多いよなと思うところがあったので、久し振りにまとめ買いしてみました。

買ったのは以下の書籍たち。
  • Java 並行処理プログラミング ―その「基盤」と「最新API」を究める―
  • Effective Java 第2版 (The Java Series)
  • ソースコードリーディングから学ぶ Javaの設計と実装
  • アート・オブ・プロジェクトマネジメント ―マイクロソフトで培われた実践手法
  • 小さなチーム、大きな仕事―37シグナルズ成功の法則 (ハヤカワ新書juice)

まだ読んだことなかったの!?と言われてしまいそうなラインナップですね…orz
今までなんとなくの理解で来てしまっているので、一度きちんと名著と言われるものでしっかり勉強しなおそうと思った次第です。

一通り読み終えたら感想などを記していきたいと思います。

2010/03/18

EclipseでApache Felix

OSGi実装であるApache Felixを触る機会があったので、Eclipse上で動作させる方法をメモしておきます。

1. Apache Felixのダウンロード
公式サイトから downloads->Felix Framework Distributionをダウンロードします。
現時点での最新版は2.0.4。 Windows環境なので、zip版をダウンロードして、任意の場所に展開します。

2. Projectの作成
続いてEclipseでJavaプロジェクトを作成します。
File -> New -> Java Project
Project name: felix-tutorial
として[Next]をクリック。
次のパネルでは
Default output folder: felix-tutorial/target/classes
として[Finish]をクリック。
次にプロジェクトのプロパティでソースフォルダをsrc/main/javaとsrc/main/resourcesに変更します。
ここら辺は後々Mavenプロジェクト化するときのことを考えてのことなので、
Mavenを使わない場合ではデフォルトのままで問題ないです。

3. Felixのコピー

1.でダウンロードしたzipファイルを展開するとfelix-framework-2.0.4というディレクトリが作成されますが、
この配下のbin、bundle、confを2.で作成したプロジェクトの直下にコピーします。
コピーしたら、 bin/felix.jarをビルドパスに追加してください。

4. Felix Shellの起動
次に Eclipse上でFelix Shellを起動します。
Run -> Run ConfigurationsでJava Applicationに起動構成を追加します。
Name: felix-tutorial - run
Project: felix-tutorial
Main class: org.apache.felix.main.Main
※Include system libraries when searching for a main classにチェック
Classpathタブを開いて、User Entriesにfelix.jarが追加されていることを確認してください。
追加されていない場合は[Add JARs]をクリックして追加してください。

ここまでが完了したら、[Apply]をクリック、[Run]をクリックしてください。
Console に「Welcome Felix」とメッセージが表示されれば成功です。
このとき、プロジェクト直下にfelix-cacheというディレクトリが作成されますが、これはFelixが利用するディレクトリです。

5. バンドルの作成
Felixのチュートリアルそのまま。
  1. package net.masa.felix.tutorial1;  
  2.   
  3. import org.osgi.framework.BundleActivator;  
  4. import org.osgi.framework.BundleContext;  
  5. import org.osgi.framework.ServiceEvent;  
  6. import org.osgi.framework.ServiceListener;  
  7.   
  8. /** 
  9.  * @author namiki 
  10.  * 
  11.  */  
  12. public class Activator implements BundleActivator, ServiceListener {  
  13.   
  14.     @Override  
  15.     public void start(BundleContext context) throws Exception {  
  16.         System.out.println("Starting to listen for service events.");  
  17.         context.addServiceListener(this);  
  18.     }  
  19.   
  20.     @Override  
  21.     public void stop(BundleContext context) throws Exception {  
  22.         context.removeServiceListener(this);  
  23.         System.out.println("Stopped listennig for service events.");  
  24.   
  25.     }  
  26.   
  27.     @Override  
  28.     public void serviceChanged(ServiceEvent event) {  
  29.         String[] obj = (String[]) event.getServiceReference().getProperty(  
  30.                 "objectClass");  
  31.         if (ServiceEvent.REGISTERED == event.getType()) {  
  32.             System.out.println("Service of type " + obj[0] + " registered.");  
  33.         } else if (ServiceEvent.UNREGISTERING == event.getType()) {  
  34.             System.out.println("Service of type " + obj[0] + " unregistered.");  
  35.         } else if (ServiceEvent.MODIFIED == event.getType()) {  
  36.             System.out.println("Service of type " + obj[0] + " modified.");  
  37.         }  
  38.     }  
  39.   
  40. }  

次にMANIFEST.MFを作成します。
src/main /resources/META-INF/tutorial1の配下にMANIFEST.MFを作成します。内容は以下の通りです。

Manifest-Version: 1.0
Bundle-Name: Service listener example
Bundle-Description: A bundle that displays messages at startup and when service events occur
Bundle-Vendor: Apache Felix
Bundle-Version: 1.0.0
Bundle-Activator: net.masa.felix.tutorial1.Activator
Import-Package: org.osgi.framework

バンドルの実体はjarなので、jarファイルを作成するためにここではantを利用します。
プロジェクト直下にbuildディレクトリを作成し、build.xmlを作成します。内容は以下の通りです。
  1. <project name="felix-tutorial" default="jar" basedir="..">  
  2.     <property name="src.dir" value="src/main/java">  
  3.     <property name="resources.dir" value="src/main/resources">  
  4.     <property name="manifest.file" value="${resources.dir}/META-INF/tutorial1/MANIFEST.MF">  
  5.     <property name="classes.dir" value="target/classes">  
  6.     <property name="dist.dir" value="target/jar">  
  7.     <property name="jar.name" value="tutorial1.jar">  
  8.   
  9.     <target name="jar" depends="prepare">  
  10.         <jar jarfile="${dist.dir}/${jar.name}" basedir="${classes.dir}" manifest="${manifest.file}" update="false">  
  11.     </jar></target>  
  12.   
  13.     <target name="prepare">  
  14.         <mkdir dir="${dist.dir}">  
  15.         <delete>  
  16.             <fileset dir="${dist.dir}">  
  17.                 <include name="${jar.name}">  
  18.             </include></fileset>  
  19.         </delete>  
  20.     </mkdir></target>  
  21. </property></property></property></property></property></property></project>  

もうちょっと考えなければいけませんが今は簡単のためにこれで。

6. バンドルのインストール
Felix Shellで以下のコマンドを実行します。
start file:/c:/%workspacepath%/felix-tutorial/target/jar/tutorial1.jar
%workspacepath% には自分のworkspaceのパスを入れてください。
実行してコンソールに「Starting to listen for service events.」というメッセージが表示されれば成功です。
停止・アンインストールについては、Felix Shellでpsコマンドを実行してIDを確認し、
stop %ID%
uninstall %ID%
で行うことができます。 Felix Shellを停止する場合hはshutdownコマンドを実行します。

追記:
build.xmlの表示がおかしいですね。
「Blogger SyntaxHighlighter」が悪さをしてそうなんですが、
回避方法が不明なのでそのままにしておきます。
本来は、property要素は1行で記述していますし、target要素も適宜終了させています。