2012-11-29

Play framework (1.2.5) のアプリで Twitter4J を利用する

Posted on 2012-11-29, 14:56 in ,

難しい手順ではないのだけれど、ちょっとはまったことがあったので未来の自分のためにメモを残しておきます。

手順

  1. $ play new で Play framework のアプリを作成する
  2. ./conf/dependencies.yml に Twitter4J を利用する旨を記述する
  3. $ play dependencies で依存ライブラリを ./lib に配置する
  4. $ play eclipsify で Eclipse 上で開発可能な状態にする
  5. javaee-api-5.0-x.jar をビルドパスから取り除く

「2. ./conf/dependencies.yml に Twitter4J を利用する旨を記述する」について

以下のように、Twitter4J に対する依存を記述すれば OK。Twitter4J の jar ファイルをダウンロードして特定ディレクトリに配置… みたいなことをする必要はありません。

# Application dependencies

require:
    - play
    - org.twitter4j -> twitter4j-core [3.0,)

「5. javaee-api-5.0-x.jar をビルドパスから取り除く」について

これをし忘れてちょっとはまりました。

Twitter4J を dependencies.yml に記述して $ play dependencies を実行すると、twitter4j-code-3.0.x.jar とともに javaee-api-5.0-x.jar というファイルも ./lib のディレクトリに配置されることになります。この jar ファイルをビルドパスに含めたまま Play アプリを起動してページアクセスすると、以下のエラーが発生することがあります。

play.exceptions.UnexpectedException: Unexpected Error
 at play.Invoker$Invocation.onException(Invoker.java:244)
 at play.Invoker$Invocation.run(Invoker.java:286)
 at Invocation.HTTP Request(Play!)
Caused by: java.lang.NoSuchMethodError: javax.persistence.EntityManager.setProperty(Ljava/lang/String;Ljava/lang/Object;)V
 at play.db.jpa.JPAPlugin.startTx(JPAPlugin.java:375)
 at play.db.jpa.JPAPlugin.beforeInvocation(JPAPlugin.java:345)
 at play.plugins.PluginCollection.beforeInvocation(PluginCollection.java:473)
 at play.Invoker$Invocation.before(Invoker.java:217)
 at play.Invoker$Invocation.run(Invoker.java:277)
 ... 1 more

どうやら javaee-api-5.0-x.jar に含まれる javax.persistence.EntityManager クラスの定義が Play が参照しているそれとかち合ってしまうようなので、思い切って javaee の方をビルドパスから除去してあげることで解消できます。

0 コメント:

コメントを投稿