簡體   English   中英

playframework 2.3.x(java)升級javassist

[英]playframework 2.3.x (java) upgrade javassist

我在編譯結束時遇到了這個奇怪的異常

java.lang.ClassCastException: javassist.bytecode.InterfaceMethodrefInfo cannot be cast to javassist.bytecode.MethodrefInfo
    at javassist.bytecode.ConstPool.getMethodrefNameAndType(ConstPool.java:417)
    at javassist.expr.MethodCall.getNameAndType(MethodCall.java:43)
    at javassist.expr.MethodCall.getMethodName(MethodCall.java:107)
    at javassist.expr.ExprEditor.loopBody(ExprEditor.java:217)
    at javassist.expr.ExprEditor.doit(ExprEditor.java:91)
    at javassist.CtBehavior.instrument(CtBehavior.java:712)
    at play.core.enhancers.PropertiesEnhancer.rewriteAccess(PropertiesEnhancer.java:156)
    at play.PlayCommands$$anonfun$PostCompile$1$$anonfun$9.apply(PlayCommands.scala:99)
    at play.PlayCommands$$anonfun$PostCompile$1$$anonfun$9.apply(PlayCommands.scala:99)
    at scala.collection.TraversableLike$$anonfun$filter$1.apply(TraversableLike.scala:264)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
    at scala.collection.TraversableLike$class.filter(TraversableLike.scala:263)
    at scala.collection.AbstractTraversable.filter(Traversable.scala:105)
    at play.PlayCommands$$anonfun$PostCompile$1.apply(PlayCommands.scala:99)
    at play.PlayCommands$$anonfun$PostCompile$1.apply(PlayCommands.scala:76)
    at scala.Function8$$anonfun$tupled$1.apply(Function8.scala:35)
    at scala.Function8$$anonfun$tupled$1.apply(Function8.scala:34)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Googling建議通過升級play使用的javassist可以解決此問題。 誰能闡明在play 2.3.x中如何升級javassist? 或者如何解決問題?

謝謝。

擴展了Blacklight的答案,這是由使用Javaassist版本3.18.0-GA的sbt-play-enhancer(版本1.1.0)插件引起的,該插件具有上述接口中Java 8默認方法實現的錯誤

sbt-play-enhancer已更新為使用3.20.0-GA,如此處所示但是尚未正式發布。

我發現的解決方案是將Javaassist的版本替換為此 pull請求中看到的更高版本。

在plugins.sbt中包含以下行,以覆蓋sbt-play-enhancer指定的Javaassist版本

libraryDependencies += "org.javassist" % "javassist" % "3.20.0-GA"

我也偶然發現了這個問題,至少我可以告訴你是什么原因造成了我(播放2.3.4)。

我在接口中使用Java 8默認方法。 當我嘗試調用提供了我的超級接口的默認方法實現而不是使用新的SomeInterface.super.defaultMethod() syntax自己的實現時,會引發完全相同的異常。 如果我沒有任何SomeInterface.super -syntax一切都很好並恢復正常。

接口:

public interface SomeInterface {
    default boolean someDefaultMethod() {
        return false;
    }
}

實施班級:

public class SomeInterfaceImpl implements SomeInterface {
    @Override
    public boolean someDefaultMethod() {
        // this is the problem
        return SomeInterface.super.someDefaultMethod();
    }
}

所以,是的,就像你說它是由Javassist引起的,但實際上已經在那里修復了 我剛剛提交了一份錯誤報告,因為除了Google網上論壇之外我沒有找到任何內容。

我的解決方法:暫時不要在接口中使用Java 8默認實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM