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.javaはjxta.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(テックスコア)
Log4J は Jakarta プロジェクトで開発が進められている 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単体で起動させることができます.