JXTAを使う コマンドプロンプトから起動してみたり,jarにまとめてみたり

目標

eclipseを使えないような環境(低スペックのPCとか制約の多いデバイス)でJXTAを使ったプログラムを使えるようにする.
ついで,JXTAを使ったプログラムを動かすのに最低限必要なライブラリを探し出す.(eclipseを使って開発していると,何でもかんでもとりあえずプロジェクトにぶち込んでしまって,中身の正しい理解とかできてない…)


とりあえず今回は,jxta-lib-2.4.1を使ってjxta-src-2.4.1のtutorialの中にあるNetworkManager.javaコマンドプロンプトから起動させてみた.
また,起動に必要なライブラリとNetworkManagerをnetwork.jarというJARファイルにまとめて,管理・配布を簡単にしてみた.(network.jarだけ配布すればよい…という状態にした)
JAVAの環境:jdk1.6.0_03

コンパイル

C:\tex\jxta\jar\test>ls
NetworkManager.java  jxta.jar

という状態でNetworkManager.javaコンパイルはこんな感じでできる.

C:\tex\jxta\jar\test>javac -classpath ./jxta.jar -d ./ NetworkManager.java

CLASSPATHにはNetworkManager.javaで使うJXTAのライブラリへのパスを指定する.

>>>>NetworkManager.javaの中身一部(import部だけ)
import java.io.File;
import java.io.IOException;
import java.net.URI;

import net.jxta.credential.AuthenticationCredential;
import net.jxta.credential.Credential;
import net.jxta.document.Advertisement;
import net.jxta.exception.PeerGroupException;
import net.jxta.id.IDFactory;
import net.jxta.impl.membership.pse.StringAuthenticator;
import net.jxta.membership.InteractiveAuthenticator;
import net.jxta.membership.MembershipService;
import net.jxta.platform.NetworkConfigurator;
import net.jxta.peergroup.PeerGroup;
import net.jxta.peergroup.NetPeerGroupFactory;
import net.jxta.peergroup.PeerGroupID;
import net.jxta.protocol.ConfigParams;
import net.jxta.rendezvous.RendezvousEvent;
import net.jxta.rendezvous.RendezvousListener;
import net.jxta.rendezvous.RendezVousService;

このソースを見て解るように,NetworkManager.javajxta.jarというライブラリだけ使っているので,CLASSPATHにはjxta.jarだけ指定すればよい.
オプション-dはクラスファイルの出力先ディレクトリを設定している.今回の設定では,現在いるディレクトリを指定した.ので,コンパイル後のこのディレクトリの構成はこんな感じ

C:\tex\jxta\jar\test>ls
NetworkManager.java  jxta.jar  tutorial

この新しくできているtutorialフォルダの下(詳しくは,そのtutorialフォルダの下にあるnetworkフォルダの下)にNetworkManager.classが生成される.これはNeteworkManager.java

package tutorial.network;

という風にパッケージが指定されているからである.

起動

とりあえずこの状態で起動させてみる.

C:\tex\jxta\jar\test>java -classpath ./jxta.jar;. tutorial.network.NetworkManager
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Priority
        at tutorial.network.NetworkManager.start(NetworkManager.java:120)
        at tutorial.network.NetworkManager.main(NetworkManager.java:304)

が,こんなエラーが吐かれる.org/apache/log4j/Priorityが無いと怒られる.
Jxtaはどうも,このlog4j.jar(jxta-lib-2.4.1の中にある)というライブラリも必要らしい.

C:\tex\jxta\jar\test>ls
NetworkManager.java  jxta.jar  log4j.jar  tutorial

log4j.jarもCLASSPATHに加えて起動させてみる.

C:\tex\jxta\jar\test>java -classpath ./jxta.jar;./log4j.jar;. tutorial.network.NetworkManager
Starting NetworkManager ....
Node PeerID :uuid-59616261646162614E50472050325033218B213F5BB04E6CB851E4F83E578A5203
Waiting for Rendezvous Connection
Connected to rendezvous peer :urn:jxta:uuid-59616261646162614A7874615032503363F783E78A954132B524FA6ED245142903
Connected to Rendezvous
Good Bye ....

正常に起動できた.

log4jとは

1. Log4J の基本 | TECHSCORE(テックスコア)
Log4JJakarta プロジェクトで開発が進められている Java プログラム用のログ API です。Log4J を利用することで、様々なロギングが可能になります。またパフォーマンスにも十分に配慮されて設計されているので、ログの記録に用いるコードをプログラムソースに残したまま出荷しても、特に問題は起こらないようになっています。

他にも Log4J の優れた機能があります。ログを出力する部分をグループ化しておくことで、プログラム中の特定部分の動作情報だけを出力したり、出力先にファイル、OutputStream、java.io.Writer、リモート Log4J サーバ、リモート Unix Syslog デーモン、NT イベントログなどを簡単に指定することができます。

というものらしい.JXTAとはまた別のライブラリらしい.JXtAがこのライブラリを何に使ってるのかは…不明w
おそらく…JXTAは発見したアドバタイズメントの情報やネットワークの状態をキャッシュという形で保存しているので,この情報を取得・生成するのに使っているのだろう.

JARにまとめる

まず,jxta.jarやlog4j.jarを展開しなければいけないらしい.(そのままjarにまとめれない)
私はWinRARを使って解凍した.

C:\tex\jxta\jar\test\jxta>ls
META-INF  log4j.properties  net  sun

C:\tex\jxta\jar\test\log4j>ls
META-INF  org

展開した中身はこんな感じ.必要なのは,jxta.jarの中身のnetフォルダとsunフォルダ,log4j.jarのorgフォルダだけなので,それ以外は消しても良い.
これら必要なフォルダをコピーして

C:\tex\jxta\jar\test>ls
NetworkManager.java  net  org  sun  tutorial

と並べる.
蛇足だが,この状態でなら,CLASSPATHを指定しなくてもNetworkManagerを起動させることができる.

C:\tex\jxta\jar\test>java tutorial.network.NetworkManager
Starting NetworkManager ....
log4j:WARN No appenders could be found for logger (net.jxta.util.ClassFactory).
log4j:WARN Please initialize the log4j system properly.
Node PeerID :uuid-59616261646162614E5047205032503340502BAC24CA41189E399524D4D604A303
Waiting for Rendezvous Connection
Connected to rendezvous peer :urn:jxta:uuid-59616261646162614A78746150325033D7BD36C8A3064300B4DEDA0153B43A9203
Connected to Rendezvous
Good Bye ....

閑話休題.これらのフォルダ・ファイルを一つのJARファイルにまとめる.
まず,network.mfファイルを作成する.

Manifest-Version: 1.0
Main-Class: tutorial.network.NetworkManager

これは見ての通り,Manifestのバージョン設定と,作成する予定のjarファイルのmainクラス(一番最初に起動されるクラス)を指定する.
これで準備完了.jarファイルにまとめてみる.

C:\tex\jxta\jar\test>jar cfm network.jar network.mf tutorial net org sun

作成したいjarファイル名,参照するマニュフェストファイル名,まとめたいフォルダ…を指定すればよい.
そうするとこんな感じでnetwork.jarファイルが生成される.

C:\tex\jxta\jar\test>ls
NetworkManager.java  net  network.jar  network.mf  org  sun  tutorial

生成されたjarファイルを起動させてみる

C:\tex\jxta\jar\test>java -jar network.jar
Starting NetworkManager ....
log4j:WARN No appenders could be found for logger (net.jxta.util.ClassFactory).
log4j:WARN Please initialize the log4j system properly.
Node PeerID :uuid-59616261646162614E50472050325033C3C21CAA77C747749997B693802274A803
Waiting for Rendezvous Connection
Connected to rendezvous peer :urn:jxta:uuid-59616261646162614A7874615032503354C1DDB08EE5422AA522990F4AC79F9303
Connected to Rendezvous
Good Bye ....

こんな感じで,どのフォルダに置こうが,network.jar単体で起動させることができます.