jUploadrが「jUpload is taking too long …」というエラーで起動しない件

jUploadrが「jUpload is taking too long to load. Something must be wrong.」というエラーで起動しない件について。
開発者向けの記事なので、解決策だけ知りたい方は飛ばして結論から読んでください。

事の始まりは、Twitterでの@shimashimanekoさんのこのツイートから。

jUploadrが起動しなくなった。いよいよZとの決別だろうか。less than a minute ago via Janetter Favorite Retweet Reply

僕自身はjUploadrを使っていないのですけど、FlickrやZooomrなどの写真共有サービスにバッチ的にアップロードするソフトだって事は知ってました。

どうせJavaプログラムなんだし、スタックトレースみれば分かるんじゃないかなーと思って調べてみることにしました。

解析

まずjUploadrのサイトはあちこちリンク切れになってて、紛らわしいことに、似たような「JUploader」と言うツール(jUploadrと違う)もあって混乱。jUploadr本体を入手するのもちょっと迷いました。

ダウンロードして解凍してみると、jUploadr.exeというWindows用の実行ファイルがあります。

起動してみると、スプラッシュスクリーンが長い間表示されるのですが、反応がないまま「jUpload is taking too long to load. Something must be wrong.」というエラーメッセージとともに終了してしまいます。

 
 
Javaでできたソフトウェアなんですが、Windowsユーザ向けにexeから起動する形式になっています。実際にはjavaVMで動くのでおんなじです。でもEXEファイルがどうやってJavaを実行しているのか分からず、解析しにくくなりました。

「たぶんJARファイル全部をクラスパスに入れて、メインクラス起動すればいいんでしょ?」
と考えてlib/juploadr.jarを展開して、マニフェストファイルを見ると、

Main-Class: org.scohen.juploadr.app.JUploadr

とあるのでここから起動すれば良いんだと分かります。クラスパス属性もあったのですが、全部通して起動してみます。


> java -cp lib\BrowserLauncher2-10rc4.jar;lib\commons-beanutils.jar;
lib\commons-codec-1.3.jar;lib\commons-httpclient-3.0-rc3.jar;lib\commons-logging.jar;
lib\jai_codec.jar;lib\jai_core.jar;lib\jim-io.jar;lib\juploadr-mac-libs.jar;
lib\juploadr.jar;lib\Piccolo.jar;lib\swt.jar org.scohen.juploadr.app.JUploadr

Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3232 in java.library.path
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at org.eclipse.swt.internal.Library.loadLibrary(Library.java:123)
        ...

libフォルダの中を見たときに気づいたのですが、UIにswtというeclipseなどで使われているGUIライブラリを使用しています。これはOSネイティブなUIをJavaから使えるというやつでして、JNIをつかっているためDLLを参照できるようにしなければなりません。

-Djava.library.pathで、DLLのおいてあるlibフォルダを追加。


> java -Djava.library.path=lib -cp lib\BrowserLauncher2-10rc4.jar;lib\commons-beanutils.jar;
lib\commons-codec-1.3.jar;lib\commons-httpclient-3.0-rc3.jar;lib\commons-logging.jar;
lib\jai_codec.jar;lib\jai_core.jar;lib\jim-io.jar;lib\juploadr-mac-libs.jar;
lib\juploadr.jar;lib\Piccolo.jar;lib\swt.jar org.scohen.juploadr.app.JUploadr

Exception in thread "main" java.lang.NumberFormatException: For input string: "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1"
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at org.scohen.juploadr.prefs.Version.parse(Version.java:43)
        at org.scohen.juploadr.prefs.Version.<init>(Version.java:28)
        at org.scohen.juploadr.prefs.Configuration.shouldUpgradeTo(Configuration.java:245)
        at org.scohen.juploadr.uploadapi.ImageUploadApi.versionCheck(ImageUploadApi.java:237)
        ...


Javaのスタックトレースって親切ですねぇ。。
なんでこんな文字を数値化しようとして、NumberFormatExceptionが出てるか意味不明だったので、スタックトレースにでてるクラス名からCVSに置いてあるソースコードを追いかけてみると、ImageUploadApiというクラスのversionCheckメソッドでやっている処理がアヤシイ。
http://juploadr.cvs.sourceforge.net/viewvc/juploadr/juploadr/src/
java/org/scohen/juploadr/uploadapi/ImageUploadApi.java?view=markup

インターネットから、http://juploadr.sourceforge.net/version.txt をダウンロードして、そこから取得した文字列をparseIntしている感じです。「じゃあversion.txtの配信がおかしいのかな?」と思ったところで、jUploadrの本体を入手するときにリンク切れだらけだったのを思い出しました。juploadr.sourceforge.netというドメインが失くなって、version.txtを取得できていないのです
 
 
取得できないだけならまだ正常に起動するのですが、上記URLに取得しようとしても、リダイレクトされて404 Not foundとか返されないまま200番でエラーページ風なものが表示されちゃう。これをjUploadrは正常に取得できたとみなしちゃってエラーになって落ちちゃってるようです。
 
 
2007年から更新されてないみたいなんで、とりあえずこのバージョンチェックで落ちないようにすれば解決しそうです。HTTPのステータスコードがエラーになれば、それでバージョンチェックもスキップされるので、hostsファイルにjuploadr.sourceforge.netの設定を適当に書いてみると、ちゃんと起動できました!
 
 
この回避策はちょっと良くないので、ImageUploadApiクラスのversionCheckメソッドを実行しないようにして、それを配布すれば良いかなと考えました。
ImageUploadApi.javaは、CVSから取ってきても良かったのですが、一応現在利用しているものから取り出すことにして、jadという逆コンパイラでクラスファイルから逆コンパイル。コメントアウトして再コンパイル。ImageUploadApi.classと匿名インナークラスのImageUploadApi$1.classが出力されました。これをJARファイルにしました。

jUploadr.exeが起動するときに、おそらくlibフォルダにあるJARファイルを全部クラスパスに通すのだろうと予想して、libフォルダにJARファイルを入れることに。オリジナルのImageUploadApiクラスよりも先にクラスパスから見つからなければならないため、JARファイル名を辞書的に先頭に来るようにa_fix.jarとしました。

これで起動してみると見事に起動!試しにファイル名をz_fix.jarとしてみると、予想通りオリジナルのImageUploadApiクラスが先にロードされるようでエラーになります。

まとめ(回避策)

 

  • a_fix.jarをdownloadする
  • lib フォルダにa_fix.jarをcopyする

追記
まだうまく動いていない人もいるようです。
とりあえずMac版も用意してみました。まだこれでも動かない人もいるようです。
– a_fix.jar ( http://db.tt/TkbNtw8 ) と Info.plist. ( http://db.tt/YjUeE08 )をダウンロード
– FinderでjUploadr.appのパッケージを表示する
– a_fix.jarを “jUploadr.app/Contents/Resources/Java/ “にコピー
– Info.plistを jUploadr.app/Contents/Info.plist のファイルと上書きする

もう少し完璧な方法を調査したいと思います。

2011/07/05追記:最終的にjuploadrの作者さんがドメインの問題に対処してくれる事になって、上記のパッチは無くても起動できるようになりました。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)