将 Qute TypeSafe 模板与 Kotlin 一起使用时出现 java.lang.UnsatisfiedLinkError

Posted

技术标签:

【中文标题】将 Qute TypeSafe 模板与 Kotlin 一起使用时出现 java.lang.UnsatisfiedLinkError【英文标题】:java.lang.UnsatisfiedLinkError when using Qute TypeSafe Templates with Kotlin 【发布时间】:2021-07-26 14:36:30 【问题描述】:

当尝试将Quarkus Qute Typesafe Templates 与 Kotlin 一起使用时(按照下面的代码将静态类转换为对象),我在运行时遇到了 UnsatisfiedLinkError。

有问题的代码:

@Path("/subscriber")
@Produces(MediaType.TEXT_html)
@Consumes(MediaType.TEXT_HTML)
class SubscriberResource 

    @CheckedTemplate
    object Templates 
        external fun new(): TemplateInstance
    

    @GET
    fun get(): TemplateInstance 
        return Templates.new()
    

模板在resources/templates/SubscriberResource/new.html 中可用。

项目构建良好,但当我尝试打开视图时,出现以下异常。

我也尝试将对象设为companion 对象,但没有帮助。

知道缺少什么吗?

java.lang.UnsatisfiedLinkError: 'io.quarkus.qute.TemplateInstance com.app.subscriber.SubscriberResource$Templates.new()' 在 com.app.subscriber.SubscriberResource$Templates.new(本机方法) 在 com.app.subscriber.SubscriberResource.get(SubscriberResource.kt:23) 在 com.app.subscriber.SubscriberResource_Subclass.get$$superaccessor1(SubscriberResource_Subclass.zig:189) 在 com.app.subscriber.SubscriberResource_Subclass$$function$$6.apply(SubscriberResource_Subclass$$function$$6.zig:29) 在 io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54) 在 io.quarkus.arc.runtime.devconsole.InvocationInterceptor.proceed(InvocationInterceptor.java:63) 在 io.quarkus.arc.runtime.devconsole.InvocationInterceptor.monitor(InvocationInterceptor.java:49) 在 io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.intercept(InvocationInterceptor_Bean.zig:521) 在 io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41) 在 io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41) 在 io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32) 在 com.app.subscriber.SubscriberResource_Subclass.get(SubscriberResource_Subclass.zig:147) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:170) 在 org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130) 在 org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:643) 在 org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:507) 在 org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:457) 在 org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364) 在 org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:459) 在 org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:419) 在 org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:393) 在 org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:68) 在 org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:492) 在 org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261) 在 org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161) 在 org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364) 在 org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164) 在 org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247) 在 io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73) 在 io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:138) 在 io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.access$000(VertxRequestHandler.java:41) 在 io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:93) 在 io.quarkus.runtime.CleanableExecutor$CleaningRunnable.run(CleanableExecutor.java:231) 在 java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) 在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) 在 org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415) 在 org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452) 在 org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29) 在 org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29) 在 java.base/java.lang.Thread.run(Thread.java:834) 在 org.jboss.threads.JBossThread.run(JBossThread.java:501) 导致:org.jboss.resteasy.spi.UnhandledException: java.lang.UnsatisfiedLinkError: 'io.quarkus.qute.TemplateInstance com.app.subscriber.SubscriberResource$Templates.new()' 在 org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:106) 在 org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:372) 在 org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:218) 在 org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:519) ... 18 更多

【问题讨论】:

【参考方案1】:

终于想出了解决办法,在外部对象函数中加上@JvmStatic就解决了:

    @CheckedTemplate
    object Templates 
        @JvmStatic
        external fun new(): TemplateInstance
    

【讨论】:

以上是关于将 Qute TypeSafe 模板与 Kotlin 一起使用时出现 java.lang.UnsatisfiedLinkError的主要内容,如果未能解决你的问题,请参考以下文章

python qute_setup.py

未解决的依赖关系:com.typesafe.play#play-slick_2.10;0.6.0.1:未找到

typesafe 使用 reactjs 和 typescript 选择 onChange 事件

android RecyclerView pinch zoom,ScaleGestureDetector&GridLayoutManager,with BigImageViewer,kotli

如何强制 Typesafe Activator 监听 0.0.0.0:8888

如何在 Scala 中使用 Typesafe 的 Config 和加密密码