2016-07-14 12 views
1

プロジェクトをPlay 2.5に移行する際にもう1つ問題が発生しました。プロジェクトの1つは、EbeanとJPAの両方を使用しています。ここにbuild.sbtがあります:Play 2.5 EbeanとJPA:NoSuchMethodError

name := "Project" 

version := "1.0-SNAPSHOT" 

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean) 

scalaVersion := "2.11.8" 

routesGenerator := StaticRoutesGenerator 

libraryDependencies ++= Seq(
    javaJdbc, 
    javaJpa, 
    "org.hibernate" % "hibernate-entitymanager" % "4.2.8.Final", 
    cache, 
    javaWs 
) 

Play 2.2.1ではすべてが正常でした。 、JPAはorg.hibernate.javax.persistenceにもたらしながら

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[ProvisionException: Unable to provision, see the following errors: 

    1) Error injecting constructor, java.lang.NoSuchMethodError: javax.persistence.OneToOne.orphanRemoval()Z 
     at play.db.jpa.DefaultJPAApi$JPAApiProvider.<init>(DefaultJPAApi.java:39) 
     at play.db.jpa.DefaultJPAApi$JPAApiProvider.class(DefaultJPAApi.java:34) 
     while locating play.db.jpa.DefaultJPAApi$JPAApiProvider 
     while locating play.db.jpa.JPAApi 
     for parameter 0 at play.db.jpa.TransactionalAction.<init>(TransactionalAction.java:20) 
     while locating play.db.jpa.TransactionalAction 

    1 error]] 
     at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:280) 
     at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206) 
     at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) 
     at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188) 
     at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:98) 
     at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100) 
     at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99) 
     at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:346) 
     at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:345) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
     at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) 
     at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) 
     at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) 
     at scala.concurrent.Promise$class.complete(Promise.scala:55) 
     at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) 
     at scala.concurrent.Promise$class.failure(Promise.scala:104) 
     at scala.concurrent.impl.Promise$DefaultPromise.failure(Promise.scala:153) 
     at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:257) 
     at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:251) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
     at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55) 
     at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:91) 
     at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply(BatchingExecutor.scala:91) 
     at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply(BatchingExecutor.scala:91) 
     at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72) 
     at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:90) 
     at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:39) 
     at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:405) 
     at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
     at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
     at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
     at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 
    Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors: 

私は、根本的な原因は、そのebeanがのjavax.persistenceにもたらしていると考えている。しかし、今、私がアプリケーションを起動しようとすると、次のエラーを取得しています紛争につながる。

javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api") 

あるいはこの:私はこのように、build.sbtするエクスクルードを追加しようとした

javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api").exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.1-api") 

しかし、それは助けにはならなかった:アクチベーターはまだ2.0と2.1の両方をダウンロードし、クラスパスに追加します。ここで何ができるのですか?依存関係を正しく除外する方法はありますか?

答えて

0

orphanRemovalメソッドは、Java Persistence 2.0以来追加されています。

だから、あなたはjavax.persistence % persistence-api % 1.0の依存関係を削除する必要のjavax.persistenceのAPI 1.0の依存関係を削除するにはbuild.sbtに以下の行を追加してみPlayEbean

が付属しています。

def excludeJPAPersistence(module: ModuleID): ModuleID = 
    module.excludeAll(ExclusionRule("javax.persistence","persistence-api")) 

libraryDependencies ~= (_.map(excludeJPAPersistence)) 

はここにあなたの答えをbuild.sbt

name := "Project" 

version := "1.0-SNAPSHOT" 

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean) 

scalaVersion := "2.11.8" 

routesGenerator := StaticRoutesGenerator 

libraryDependencies ++= Seq(
    javaJdbc, 
    javaJpa, 
    "org.hibernate" % "hibernate-entitymanager" % "4.2.8.Final", 
    cache, 
    javaWs 
) 

def excludeJPAPersistence(module: ModuleID): ModuleID = 
    module.excludeAll(ExclusionRule("javax.persistence","persistence-api")) 

libraryDependencies ~= (_.map(excludeJPAPersistence)) 
0

感謝します。私はbuild.sbtとplugins.sbtの両方に次の行を追加することで問題を解決しました:

excludeDependencies += "javax.persistence" % "persistence-api" 
関連する問題