QA@IT

Mac OS X上で動くJavaライブラリがAmazon Linux上で動作しない

3327 PV

現在、Amazon EC2上でAmazon LinuxをOSとするインスタンスを動作させ、Apache2とTomcat 7を走らせています。

その中でTeX表記からTeXアイコンを生成するライブラリJLaTeXMathを用いたJavaアプリケーションを動作させたいのですが、
ライブラリの.jar内にあるttfファイルを読み込むことができずにエラーが投げられてしまいます。
エラー文は以下のとおりです。

org.scilab.forge.jlatexmath.XMLResourceParseException: DefaultTeXFont.xml: error reading font 'fonts/base/jlm_cmmi10.ttf'. Error message: Problem reading font data.

ただ、以前には同環境でこのライブラリを用いたプログラムが問題なく動作していた(現在はそちらもエラーが出る)こと、
手元のMac OS X(10.7.5)でTomcat7を動作させて同じプログラムを走らせた場合にはエラーが発生しないことから、
ライブラリ自体の問題であることは考えづらく、また同ライブラリの過去のバージョンを用いてもエラーは無くなりませんでした。

特定のライブラリに関する問題であるために明確な問題点を指摘することは難しいかと思いますが、
現在はこれ以上どんな手を試してみればいいか分からずに止まってしまっている状態ですので、
なにか少しのヒントでもいただければ幸いです。

よろしくお願いいたします。

追記
スタックトレースの全文です

java.io.IOException: Problem reading font data.
        at java.awt.Font.createFont(Font.java:967)
        at org.scilab.forge.jlatexmath.DefaultTeXFontParser.createFont(DefaultTeXFontParser.java:353)
        at org.scilab.forge.jlatexmath.DefaultTeXFontParser.createFont(DefaultTeXFontParser.java:348)
        at org.scilab.forge.jlatexmath.FontInfo.getFont(FontInfo.java:292)
        at org.scilab.forge.jlatexmath.DefaultTeXFont.getChar(DefaultTeXFont.java:313)
        at org.scilab.forge.jlatexmath.DefaultTeXFont.getChar(DefaultTeXFont.java:273)
        at org.scilab.forge.jlatexmath.DefaultTeXFont.getChar(DefaultTeXFont.java:281)
        at org.scilab.forge.jlatexmath.DefaultTeXFont.getDefaultChar(DefaultTeXFont.java:332)
        at org.scilab.forge.jlatexmath.CharAtom.getChar(CharAtom.java:89)
        at org.scilab.forge.jlatexmath.CharAtom.createBox(CharAtom.java:64)
        at org.scilab.forge.jlatexmath.TeXFormula.createBox(TeXFormula.java:567)
        at org.scilab.forge.jlatexmath.TeXFormula.createTeXIcon(TeXFormula.java:606)
        at hello.TeXIconCreator.createTeXIcon(TeXIconCreator.java:24)
        at hello.HelloWorld.doGet(HelloWorld.java:10)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)
  • メッセージを読む限り、フォントの読み込みで何らかの問題が起きているようです。スタックトレースは出ていませんか?

    JLaTexMathはソースが公開されているようなので、スタックトレースからエラーの起きている箇所のソースを読んであたりをつけるのが良いかと思われます。
    -

回答

(すみません、最初間違えてコメントの方に書いてしまいました)
メッセージを読む限り、フォントの読み込みで何らかの問題が起きているようです。スタックトレースは出ていませんか?

JLaTexMathはソースが公開されているようなので、スタックトレースからエラーの起きている箇所のソースを読んであたりをつけるのが良いかと思われます。

編集 履歴 (0)
  • ご回答ありがとうございます。
    スタックトレースによるとawt.Font.createFont内でIOExceptionが起こっているのですが、フォントをjava.lang.Class.getResourceAsStreamで読み込んでいる場所ではエラーは起こっておらず、読み込み先のパスは正しいようです。なぜIOExceptionが起こっているのか、考えられる要因は他に思い当たりますでしょうか。
    -
  • この情報だけだと何とも言えないので、とりあえずスタックトレースの全文を貼ってもらえませんか? -
  • お手数おかけしてしまってすみません。スタックトレースの全文を質問文に追加いたしました。 要因として思い当たる点等、ございますでしょうか。改めまして、よろしくお願いいたします。 -
  • スタックトレース確認しました。
    例外が発生している java.awt.Font.createFont() の部分のソースを見てみたのですが、元々発生した例外を握りつぶして IOException を投げていますね。うーむ、JDK自体がこんな困った実装になっているとは...。
    -
  • 恐らく実行しているOSの環境に依存した問題が起きているものと予想されます。EC2ではなく、ローカル環境に同じLinuxのディストリビューションを使って再現環境を用意した方がいいと思います。
    そうすればJDKのリモートデバッガでアタッチして調査することが可能になるので。
    -
  • ありがとうございます。同じディストリビューションとなると、Amazon Linuxですので、ローカルに用意するのはなかなか難しいですよね...。諦めて他のライブラリを使用するにしても、java.awt.Font.createFont()を使用していれば、同じ例外が発生する可能性が高いのでしょうか。 -
  • > 諦めて他のライブラリを使用するにしても、java.awt.Font.createFont()を使用していれば、同じ例外が発生する可能性が高いのでしょうか。

    恐らくそうでしょうね。手元の環境で問題が発生しないOSを調べて、それをEC2環境のOSに使った方が良いかもしれません。
    -
  • ご返答、ありがとうございます。それでは、手元で試してから問題の起こらないOSでインスタンスを立ち上げ直そうとおもいます。長期に渡るやり取り、誠にありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。