A Micro Toolbox

ソフトウェアのニッチな問題の対処記録です

ServletからJMagick: Can't load MagickLoader

JMagickをWindowsTomcatで動かそうとしてはまったのでメモ。

環境は次のとおり。

Netforest Developer's Note - Jmagickで画像の縮小 ~Windows編~

http://www.db.is.kyushu-u.ac.jp/rinkou/java/jmagick.html
の丁寧な解説を参考に、Java Application単体の動作はすんなりクリア。

ところが、ServletのdoGet()内で

MagickImage sourceImage = new MagickImage(new ImageInfo(sourceFile));

のように書くとnew MagickImage()でランタイムエラーになってしまう。
dllが読み込めていない模様。

java.lang.RuntimeException: Can't load MagickLoader (class not found)
at magick.Magick.(Magick.java:25)


結論から言うと、jmagick.dllをシステムパスに入れておく必要があることがわかった。

ImageMagickをインストールしたときに、Path環境変数にconvertコマンドやImageMagickのdllファイルのあるディレクトリが追加される。
ここにJMagickを展開してできたjmagick.dllをコピーしてマシン再起動

2010/06/27 再起動不要と判明。


後は、
WEB-INF/lib$JAVA_HOME/jre/lib/extにjmagick.jarをコピー。

2010/07/17 WEB-INF/libだと
jmagick.dll already loaded in another classloader
が発生することがあると判明。


MagickImageを最初に呼び出す前(Servletのinit()あたり)で

System.setProperty("jmagick.systemclassloader","false");

と書いたら無事servlet内でもJMagickの処理ができるようになった。

原因については下記参照。
http://osdir.com/ml/java.jmagick/2005-12/msg00024.html
Servoy Forum • View topic - Problems accessing another jar file from my plugin