当前位置: 首页 > 知识库问答 >
问题:

带有AWS lambda的原生Qukus不构建

金珂
2023-03-14

我正在尝试使用Quarkus native构建我的AWS Lambda。

我的设置是:

  • GraalVM 19.3.0

当我跑步时

docker run -v /home/mypc/dev/java/quarkus/alexa_swear/target/<my project>-1.0-SNAPSHOT-native-image-source-jar:/project:z --user 1000:1000 --rm quay.io/quarkus/ubi-quarkus-native-image:19.2.1 -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager --initialize-at-build-time= -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy\$BySpaceAndTime -jar <my project>-1.0-SNAPSHOT-runner.jar -J-Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -H:FallbackThreshold=0 -H:+ReportExceptionStackTraces -H:+AddAllCharsets -H:EnableURLProtocols=http -H:-JNI --no-server -H:-UseServiceLoaderFeature -H:+StackTrace <my project>-1.0-SNAPSHOT-runner

我得到以下错误:

[alexa_swear-1.0-SNAPSHOT-runner:23]   (typeflow):  52,070.99 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]    (objects):  25,961.57 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]   (features):     803.41 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]     analysis:  81,015.48 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]     (clinit):   1,277.52 ms
[alexa_swear-1.0-SNAPSHOT-runner:23]     universe:   4,416.32 ms
Error: Unsupported features in 5 methods
Detailed message:
Call path from entry point to java.lang.Runtime.traceInstructions(boolean): 
    at java.lang.Runtime.traceInstructions(Runtime.java)
    at com.oracle.svm.reflect.Runtime_traceInstructions_91eaacf084b9d7e2af6dcc0028ee87fea9223b51_77.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.net.www.protocol.http.NTLMAuthenticationProxy.isTrustedSite(NTLMAuthenticationProxy.java:102)
    at sun.net.www.protocol.http.HttpURLConnection.getServerAuthentication(HttpURLConnection.java:2481)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1743)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
    at io.quarkus.amazon.lambda.runtime.AmazonLambdaRecorder$2.run(AmazonLambdaRecorder.java:171)
    at java.lang.Thread.run(Thread.java:748)
    at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460)
    at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193)
    at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0) ... 6 more
Error: Image build request failed with exit status 1

上述错误被截断:相同的调用堆栈指向不同的不受支持的方法,例如java.lang.Thread.stop

我的基本理解是,io.quarkus.amazon.lambda.runtime.Amazon LambdaRecorder$2.run(Amazon LambdaRecorder.java正在引用一些不受支持的方法,例如java.lang.Thread.resume()。我也尝试过Quarkus19.2.1,但没有成功。

上面的命令是由mvn干净安装-Pnate-Dnative-image.docker-build=true-e执行的。

共有1个答案

印晋
2023-03-14

我终于找到了问题的原因。

在我的代码的非工作版本中,我使用了com的工厂。亚马逊。问AlexaSkill以某种方式注入入口点,如下所示:

package io.mirko.lambda;

import com.amazon.ask.AlexaSkill;
import com.amazon.ask.Skills;
import com.amazon.ask.dispatcher.request.handler.HandlerInput;
import com.amazon.ask.dispatcher.request.handler.RequestHandler;
import com.amazon.ask.model.RequestEnvelope;
import com.amazon.ask.model.ResponseEnvelope;
import com.amazon.ask.request.interceptor.GenericRequestInterceptor;
import io.mirko.lambda.handlers.*;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.*;
import java.util.stream.StreamSupport;


public class SkillFactory {
    @Inject
    Instance<RequestHandler> handlers;

    @Produces
    @ApplicationScoped
    @Named
    public AlexaSkill<RequestEnvelope, ResponseEnvelope> createSkill() {
        return Skills.standard()
                .addRequestHandlers(handlers.stream().toArray(RequestHandler[]::new))
                .addRequestInterceptor(new GenericRequestInterceptor<HandlerInput>() {
                    @Override
                    public void process(HandlerInput handlerInput) {
                        System.out.format("Processing %s\n", handlerInput.getRequest());
                    }
                })
                // Add your skill id below
                //.withSkillId("")
                .build();
    }
}

...

public class SwearStreamLambda extends SkillStreamHandler {
    @Named("swearStream")
        public SwearStreamLambda() {
            //noinspection unchecked
            super((AlexaSkill<RequestEnvelope, ResponseEnvelope>)
                getBean(new ParameterizedTypeImpl(AlexaSkill.class, RequestEnvelope.class, ResponseEnvelope.class)));

通过删除SkillFactory类并将其逻辑移到SwearStreamLambda类中,编译进行得很顺利。

一些注意事项:

  1. 该问题与CDI无关,因为它在整个项目中大量使用

总而言之,我找不到问题的根本原因,但我认为我的问题已经解决了。

P、 在美国,最初的问题可以通过以下方式消除:

mvn干净的安装native-image.docker

请参见<代码>https://github.com/quarkusio/quarkus/issues/6395#issuecomment-570755587。

这并不能解决所有问题,因为必须配置Quarkus反射,但它解决了具体问题。

 类似资料:
  • 现在我们将探索云原生应用架构的几个主要特征,和这些特征是如何解决我们前面提到的使用云原生应用架构的动机。 12因素应用 12因素应用是一系列云原生应用架构的模式集合,最初由Heroku提出。这些模式可以用来说明什么样的应用才是云原生应用。它们关注速度、安全、通过声明式配置扩展、可横向扩展的无状态/无共享进程以及部署环境的整体松耦合。如Cloud Foundry、Heroku和Amazon Elas

  • 我只是想知道是否有人知道可能导致以下错误的原因? 之前没有任何问题,但是在mate添加了单独的文件夹进行调试并测试到之后,它开始了。 错误:无法处理文件 C:\Users...\node_modules\react-native-android-snackbar\android\build\intermediates\exploded-aar\com.android.support\appcomp

  • 当我尝试使用 离子科尔多瓦构建Android 突然我面临这个错误 未找到已安装的构建工具。安装Android构建工具版本19.1.0或更高版本。0 我确定Android Studio版本(2.1.1 - 22.0.0 - 23.0.0)和最新版本26.0.1的android构建工具 科尔多瓦要求的输出 android的要求检查结果:Java JDK:已安装1.8.0 Android SDK:已安装

  • 我使用Spring AOP在我们的应用程序中触发指标。我已经创建了一个注释,其中有一个与之关联的建议。除了在原型bean上调用方法的情况之外,所有标记为的方法都可以很好地调用该建议。 注释具有 PointCut表达式: 原型bean创建 DummyService有一个方法,叫做Dummymethod(String DummyString) 当是从其他服务调用的,不调用建议。 配置类 单例注册类 对

  • 我正在尝试使用“反应原生”中的功能从产品搜索 API 中获取信息。我已获得正确的访问令牌并将其保存到 State,但似乎无法在 GET 请求的授权标头中传递它。 到目前为止,我有以下情况: 我对代码的期望如下: < li >首先,我将从导入的API模块中< code >获取带有数据的访问令牌 < li >之后,我将< code>this.state的< code>clientToken属性设置为等