難しい手順ではないのだけれど、ちょっとはまったことがあったので未来の自分のためにメモを残しておきます。
手順
$ play new
で Play framework のアプリを作成する./conf/dependencies.yml
に Twitter4J を利用する旨を記述する$ play dependencies
で依存ライブラリを ./lib に配置する$ play eclipsify
で Eclipse 上で開発可能な状態にする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 コメント:
コメントを投稿