路地裏牧場

技術系ブログだったけどごった煮になった謎ブログ

Javatter Advent Calendar 2013/12/03

プラグインを作ってみよう! - 開発編

JavatterAdvent3日目、プラグインを作ってみようシリーズその2です。
前回はEclipseIntelliJ IDEAで環境を構築しました。
今日は実際にプラグインを作ってみます。




今回作るプラグインは、UserStream(Twitterのデータのストリーム送受信)で受け取った新着ツイートをテキストファイルに書き出すプラグインです。

※おことわり

この記事は各IDEまたJavaにある程度慣れている人向けです。
極力わかりやすい説明を心がけますが、分からない点があれば調べて、それでも分からなかったらコメントで質問してください。

基本

まず、src以下に"com.tweetlog.src"を作ります。パッケージ名はわかりやすければなんでもいいです。
次にそのパッケージ下にTweetLog.javaを作成します。クラス名も特に制限はありません。
作成したらcom.orekyuu.javatter.plugin.JavatterPluginをインポートして継承します。
IDEの指示に従うと以下のソースコードが生成されるかと思います、できなかったらこの通りに書いてください。

package com.tweetlog.src;

import com.orekyuu.javatter.plugin.JavatterPlugin;

/**
 * ここにはクラスの説明を書きます.
 * @author <あなたの名前>
 */
public class TweetLog extends JavatterPlugin {
    @Override
    public void init() {
        // ここにプラグインの処理を書きます
    }

    @Override
    public String getPluginName() {
        return "TweetLog";
    }

    @Override
    public String getVersion() {
        return "1.0";
    }
}

各メソッドの説明は次回するとして、基本的にこの構成になります。プラグイン名も適当に合わせたものにしましょう。
ただし、プラグインの設定ファイルはこのプラグイン名をもとに生成されます。
名前を変えてしまうと違う名前で設定ファイルが作りなおされてしまうので注意しましょう。

まだ肝心のログ書き出しなどの機能は実装できていませんが、とりあえず起動してみましょう。
JavaVMオプションに以下を記述します。

-DloadPlugins="com.tweetlog.src.TweetLog"

これで開発環境でプラグインがロードできます。
実際に起動してみましょう。メインクラスはcom.orekyuu.javatter.main.Mainです。
プラグイン管理タブにプラグイン名が確認できたら、おめでとうございます。あなたの作ったプラグインが読み込まれました。
うまくいかない人は手順を見なおしてみてください。記事下部にFAQも書いておきます。

機能の実装

確認できたところで、ツイートを受信して書き出す処理を実装していきましょう。
UserStreamを受信するにはUserStreamControllerを継承したクラスを作成し、addUserStreamListenerで渡します。

this.addUserStreamListener(new TweetListener());
public class TweetListener extends UserStreamController {
    public void onStatus(Status status) {
        // 新着ツイートをここで受け取り処理する
    }
}

ツイートを受け取ってテキストファイルに書き出す処理をメインクラスに書きます。

public static void writeLog(Status status) {
    stringBuilder.setLength(0); // StringBuilderの中身を空にする

    stringBuilder.append(format.format(status.getCreatedAt()));
    stringBuilder.append(" @");
    stringBuilder.append(status.getUser().getScreenName());
    stringBuilder.append(" ");
    stringBuilder.append(status.getUser().getName());
    stringBuilder.append(" \"");
    stringBuilder.append(status.getText());
    stringBuilder.append("\"\n");
    stringBuilder.append("================================\n");
    try {
        fileWriter.write(stringBuilder.toString()); // 書き込み
        fileWriter.flush(); // 反映させる
    } catch (IOException e) {
        e.printStackTrace();
    }
}

このメソッドを先ほどのTweetListenerから呼び出してStatusを渡せばOKです。


最終的なソースコードはこちらになります。
TweetLog.java
TweetListener.java

公開しよう

開発環境では先程のようにJVMオプションを渡せば読み込まれましたが、実際はpluginsフォルダに入れて読み込ませる形になります。
そこで、jar形式で出力して読み込ませることになります。
jar出力の手順はEclipseとIDEAではちょっと違うので別々に解説します。

Eclipse

1.ファイル→エクスポート→Java→JARファイル(≠実行可能)を選択
2.com/tweetlog/srcのソースコードだけを選択
3.エクスポート先とファイル名を設定
4.完了を押す
5.出力したjarを解凍ソフトで開く(表示はエクスプローラ形式が望ましい)
6.META-INF/MANIFEST.MFを開き、以下のように書き換える

Manifest-Version: 1.0(ここはそのままでよい)
Plugin-Main: com.tweetlog.src.TweetLog(パッケージ名とJavatterPluginを継承したクラス)
(空行空けましょう)

ファイル名を適当な名前に変更する(TweetLog.jarなど)

IntelliJ IDEA

1.File→Project Structure→Artifactsを選択
2.+ボタン→Jar→From modules with dependencies→Javatter_for_PCを選択しMain ClassでMain.javaを選択しOK
3.TweetLogと名前をつけ(これもなんでもいい)、右側左の欄からライブラリを除去してOK
4.Build→Build Artifacts→<先ほどつけた名前>→Buildを選択
5.お茶を飲みながら出力を待つ
6.Javatter_for_PC/out/artifacts/先ほどつけた名前/Javatter_for_PC.jarを解凍ソフトで開く(表示はエクスプローラ形式が望ましい)
7.com/tweetlog/src/<コンパイルされたクラス群>一式(フォルダ含む)とMETA-INFフォルダ以外を削除
8.META-INF/MANIFEST.MFを開き、以下のように書き換える

Manifest-Version: 1.0(ここはそのままでよい)
Plugin-Main: com.tweetlog.src.TweetLog(パッケージ名とJavatterPluginを継承したクラス)
(空行空けましょう)

9.ファイル名を適当な名前に変更する(TweetLog.jarなど)

動作テスト

できたら実環境で試してみましょう。
pluginsにいつものように入れてJavatterを起動し、エラーも出ずにファイルにツイートが書き込まれていれば成功です。

FAQ

Q.開発環境でのデバッグ時にクラスがありませんって言われます
A.JVMオプションを見なおしてください。
・拡張子まで書いていませんか?
・パッケージ名とクラス名は本当に合っていますか?
・-Dと書いていますか?
・loadPluginsのスペルは間違っていませんか?
・ダブルクォーテーションで囲っていますか?

Q.思っていた動作と違う
A.ソースコードを確認してください。
わからない場合は私がGistにUPしたソースコードをそのまま写し、少しずつ改変しながら様子を見てください。

Q.質問が思いつきません
A.私もです

最後に

おめでとうございます、完成です。
だいぶ長くなってしまいました、非常に見づらくなったと思います。反省。
とりあえずコピペして覚えていけばOKです。何事も慣れです。

基本的なことはこれで終わりです。
あとは自分で作りたいと思った機能を試行錯誤して実装していきましょう。
プラグイン開発でよくわからないところがあったらコメントやフォーラムに書き込んだり、TwitterでGetajiに質問したりしてください。

ともかくおわり! お疲れ様でした!

執筆者:Getaji