javassist.NotFoundException 因为 Java 9
javassist.NotFoundException since Java 9
JavaFX不允许WebView透明,所以我发现this patch使用javassist修改Java的com.sun.webkit.WebPage
.
这在 Java 8 之前工作正常,但在 Java 9 时停止工作:
> Patching com/sun/webkit/WebPage ...
javassist.CannotCompileException: [source error] no such class: com.sun.webkit.graphics.WCRectangle
at javassist.CtBehavior.setBody(CtBehavior.java:446)
at javassist.CtBehavior.setBody(CtBehavior.java:412)
at com.github.micheljung.transparentwebview.TransparentWebViewPatch.transform(TransparentWebViewPatch.java:64)
at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:550)
at java.base/java.lang.ClassLoader.defineClass2(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1099)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:206)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at javafx.web/javafx.scene.web.WebEngine.<clinit>(WebEngine.java:338)
at javafx.web/javafx.scene.web.WebView.<init>(WebView.java:260)
at com.github.micheljung.transparentwebview.Demo.start(Demo.java:21)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:919)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:449)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:418)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:417)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(WinApplication.java:175)
at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: compile error: no such class: com.sun.webkit.graphics.WCRectangle
at javassist.compiler.MemberResolver.searchImports(MemberResolver.java:468)
at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:412)
at javassist.compiler.MemberResolver.lookupClassByName(MemberResolver.java:315)
at javassist.compiler.TypeChecker.atNewExpr(TypeChecker.java:146)
at javassist.compiler.ast.NewExpr.accept(NewExpr.java:73)
at javassist.compiler.JvstTypeChecker.atMethodArgs(JvstTypeChecker.java:221)
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:735)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:695)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:46)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:330)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:292)
at javassist.compiler.Javac.compileBody(Javac.java:223)
at javassist.CtBehavior.setBody(CtBehavior.java:438)
... 25 more
/!\ com/sun/webkit/WebPage patching failed :(
javassist.NotFoundException: com.sun.webkit.graphics.WCRectangle
at javassist.ClassPool.get(ClassPool.java:452)
at com.github.micheljung.transparentwebview.TransparentWebViewPatch.transform(TransparentWebViewPatch.java:84)
at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:550)
at java.base/java.lang.ClassLoader.defineClass2(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1099)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:206)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at javafx.web/javafx.scene.web.WebEngine.<clinit>(WebEngine.java:342)
at javafx.web/javafx.scene.web.WebView.<init>(WebView.java:260)
at com.github.micheljung.transparentwebview.Demo.start(Demo.java:21)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:919)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:449)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:418)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:417)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(WinApplication.java:175)
at java.base/java.lang.Thread.run(Thread.java:844)
> Patching com/sun/javafx/webkit/prism/WCGraphicsPrismContext ...
/!\ com/sun/javafx/webkit/prism/WCGraphicsPrismContext patching failed :(
因为我不明白 javassist 是如何寻找 classes 的,所以我在这里迷路了。我认为它与 Java 9 个模块有关。有人知道吗?
class 仍然存在,包名相同。
您在两个演示中使用的是 javassist 的过时版本:3.20.0-GA。
dependencies {
compile 'org.javassist:javassist:3.20.0-GA'
}
这适用于 Java 8 但不适用于 Java 9。如果您查看他们的 releases page on GitHub it wasn't until version 3.22.0-GA that the library became compatible with Java 9. That version is also outdated, however, as their latest version (as of writing this answer) is 3.23.1-GA.
更改您的依赖声明以使用最新版本,您的问题应该得到解决。
dependencies {
compile 'org.javassist:javassist:3.23.1-GA'
}
与您的问题无关:我不知道您使用的 Gradle 是哪个版本,但在更高版本中 compile
配置已被弃用;它已被 implementation
取代。有关详细信息,请参阅 here。
JavaFX不允许WebView透明,所以我发现this patch使用javassist修改Java的com.sun.webkit.WebPage
.
这在 Java 8 之前工作正常,但在 Java 9 时停止工作:
> Patching com/sun/webkit/WebPage ...
javassist.CannotCompileException: [source error] no such class: com.sun.webkit.graphics.WCRectangle
at javassist.CtBehavior.setBody(CtBehavior.java:446)
at javassist.CtBehavior.setBody(CtBehavior.java:412)
at com.github.micheljung.transparentwebview.TransparentWebViewPatch.transform(TransparentWebViewPatch.java:64)
at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:550)
at java.base/java.lang.ClassLoader.defineClass2(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1099)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:206)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at javafx.web/javafx.scene.web.WebEngine.<clinit>(WebEngine.java:338)
at javafx.web/javafx.scene.web.WebView.<init>(WebView.java:260)
at com.github.micheljung.transparentwebview.Demo.start(Demo.java:21)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:919)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:449)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:418)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:417)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(WinApplication.java:175)
at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: compile error: no such class: com.sun.webkit.graphics.WCRectangle
at javassist.compiler.MemberResolver.searchImports(MemberResolver.java:468)
at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:412)
at javassist.compiler.MemberResolver.lookupClassByName(MemberResolver.java:315)
at javassist.compiler.TypeChecker.atNewExpr(TypeChecker.java:146)
at javassist.compiler.ast.NewExpr.accept(NewExpr.java:73)
at javassist.compiler.JvstTypeChecker.atMethodArgs(JvstTypeChecker.java:221)
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:735)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:695)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:46)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:330)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:292)
at javassist.compiler.Javac.compileBody(Javac.java:223)
at javassist.CtBehavior.setBody(CtBehavior.java:438)
... 25 more
/!\ com/sun/webkit/WebPage patching failed :(
javassist.NotFoundException: com.sun.webkit.graphics.WCRectangle
at javassist.ClassPool.get(ClassPool.java:452)
at com.github.micheljung.transparentwebview.TransparentWebViewPatch.transform(TransparentWebViewPatch.java:84)
at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:550)
at java.base/java.lang.ClassLoader.defineClass2(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1099)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:206)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at javafx.web/javafx.scene.web.WebEngine.<clinit>(WebEngine.java:342)
at javafx.web/javafx.scene.web.WebView.<init>(WebView.java:260)
at com.github.micheljung.transparentwebview.Demo.start(Demo.java:21)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:919)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:449)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:418)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:417)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(WinApplication.java:175)
at java.base/java.lang.Thread.run(Thread.java:844)
> Patching com/sun/javafx/webkit/prism/WCGraphicsPrismContext ...
/!\ com/sun/javafx/webkit/prism/WCGraphicsPrismContext patching failed :(
因为我不明白 javassist 是如何寻找 classes 的,所以我在这里迷路了。我认为它与 Java 9 个模块有关。有人知道吗? class 仍然存在,包名相同。
您在两个演示中使用的是 javassist 的过时版本:3.20.0-GA。
dependencies {
compile 'org.javassist:javassist:3.20.0-GA'
}
这适用于 Java 8 但不适用于 Java 9。如果您查看他们的 releases page on GitHub it wasn't until version 3.22.0-GA that the library became compatible with Java 9. That version is also outdated, however, as their latest version (as of writing this answer) is 3.23.1-GA.
更改您的依赖声明以使用最新版本,您的问题应该得到解决。
dependencies {
compile 'org.javassist:javassist:3.23.1-GA'
}
与您的问题无关:我不知道您使用的 Gradle 是哪个版本,但在更高版本中 compile
配置已被弃用;它已被 implementation
取代。有关详细信息,请参阅 here。