我有一个小 Java 程序。我使用 Graal 构建了一个二进制文件native-image(即 GraalVM AOT 又名 SubstrateVM)。
我的程序可以使用 Java 运行时或本地映像二进制文件执行。判断我正在运行的上下文的最佳方法是什么?
(一般来说,这可能是一种不好的做法,但我相信在某些并不少见的情况下这是不可避免的/必要的。)
此处提供示例项目: https : //github.com/codependent/micronaut-aws-lambda-proxy-graal
我在 Amazon AWS 上部署了一个 Micronaut 应用程序作为 Lambda 函数。它被编译成 GraalVM 本机映像并使用AWS Lambda 自定义运行时运行。
如果应用程序不使用 DynamoDB,它会顺利运行。配置它并作为普通 Java 应用程序启动时,它也可以正常工作。但是,当将其用作在 AWS 上运行的 Graal 本机映像时,它会失败:
io.micronaut.context.exceptions.BeanInstantiationException:实例化 [com.amazonaws.services.dynamodbv2.document.DynamoDB] 类型的 bean 时出错:消息:无法从 com/amazonaws/partitions/endpoints.json 加载分区元数据
我正在使用此依赖项: compile 'com.amazonaws:aws-java-sdk-dynamodb:1.11.504'
如何修复无法加载分区元数据错误?
完整日志:
Caused by: com.amazonaws.SdkClientException: Unable to load partition metadata from com/amazonaws/partitions/endpoints.json
at com.amazonaws.partitions.PartitionsLoader.build(PartitionsLoader.java:82)
at com.amazonaws.regions.RegionMetadataFactory.create(RegionMetadataFactory.java:30)
at com.amazonaws.regions.RegionUtils.initialize(RegionUtils.java:64)
at com.amazonaws.regions.RegionUtils.getRegionMetadata(RegionUtils.java:52)
at com.amazonaws.regions.RegionUtils.getRegion(RegionUtils.java:105)
at com.amazonaws.client.builder.AwsClientBuilder.getRegionObject(AwsClientBuilder.java:256)
at com.amazonaws.client.builder.AwsClientBuilder.withRegion(AwsClientBuilder.java:245)
at com.amazonaws.client.builder.AwsClientBuilder.withRegion(AwsClientBuilder.java:232)
at com.codependent.micronaut.awslambda.configuration.DynamoDbConfiguration.dynamoDbClient(DynamoDbConfiguration.kt:18)
at com.codependent.micronaut.awslambda.configuration.$DynamoDbConfiguration$DynamoDbClientDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1385)
Run Code Online (Sandbox Code Playgroud)
更新:
我错过了异常的以下嵌套原因: Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of …
public class SimpleApp {
public static void main( String[] args ) {
JOptionPane.showMessageDialog(null, "Ciao", "Info", JOptionPane.INFORMATION_MESSAGE);
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用创建本机图像时,native-image --no-fallback我得到了这个:
错误:在图像堆中检测到一个已启动的线程。在图像生成器中运行的线程不再在图像运行时运行。该对象可能是由类初始值设定项创建的,并且可以从静态字段访问。默认情况下,所有类初始化都在本机映像构建期间完成。您可以使用选项 -H:ClassInitialization= 手动将类初始化延迟到映像运行时。或者您可以编写自己的初始化方法并从主入口点显式调用它们。
详细信息: Trace: object sun.java2d.opengl.OGLRenderQueue field sun.java2d.opengl.OGLRenderQueue.theInstance
我们正在尝试将部分单体应用迁移到微服务,我们决定使用 micronaut。我们现在正在提取一个电子邮件服务,该服务提供一些输入将呈现电子邮件并与 SMTP 服务器通信以发送它们。
为此,我们使用 Java Mail,当我们尝试创建 GraalVM docker 映像时,它似乎存在一些问题。有没有人设法做到这一点,或者根本不可能让它发挥作用?
一些附加信息:
Dockerfile:
FROM oracle/graalvm-ce:19.2.0 as graalvm
COPY . /home/app/email-service
WORKDIR /home/app/email-service
RUN gu install native-image
RUN native-image --no-server -cp build/libs/email-service-*.jar
FROM frolvlad/alpine-glibc
EXPOSE 8080
COPY --from=graalvm /home/app/email-service .
ENTRYPOINT ["./email-service"]
Run Code Online (Sandbox Code Playgroud)
本机-image.properties:
JDBC 驱动程序、redis、kafka 和 thymeleaf 还进行了其他一些“惰性”初始化。
Args = --initialize-at-run-time=io.micronaut.views.thymeleaf.ThymeleafFactory \
--initialize-at-run-time=io.micronaut.views.thymeleaf.ThymeleafViewsRenderer \
--initialize-at-run-time=io.micronaut.views.velocity.VelocityViewsRenderer \
--initialize-at-run-time=io.micronaut.configuration.lettuce.session.$RedisHttpSessionConfigurationDefinition \
--initialize-at-run-time=io.micronaut.configuration.kafka.embedded.KafkaEmbedded \
--initialize-at-run-time=oracle.jdbc.driver.OracleDriver \
--initialize-at-run-time=java.sql.DriverManager \
--initialize-at-run-time=org.hibernate.jpa.HibernatePersistenceProvider \
--initialize-at-run-time=com.sun.mail.util.MailLogger \
-H:IncludeResources=logback.xml|application.yml \
-H:Name=email-service \
-H:Class=com.acme.MySuperDuperApplication
Run Code Online (Sandbox Code Playgroud)
Micronaut 版本: 1.2.0
Java 邮件版本: 1.6.2 ( com.sun.mail:javax.mail:1.6.2) …
我正在尝试Java Hello World使用onnative-image提供的实用程序将一个简单的应用程序编译为本机代码GraalVM,Windows但我总是遇到错误(见下文)。
HelloWorld.java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我class使用以下命令将代码编译为文件:
>javac HelloWorld.java
Run Code Online (Sandbox Code Playgroud)
接下来,我native-image从以下调用命令VS 2017 Developer Command Prompt:
>native-image -H:+ReportExceptionStackTraces HelloWorld
[helloworld:20420] classlist: 1,249.05 ms
[helloworld:20420] (cap): 704.71 ms
[helloworld:20420] setup: 997.16 ms
Error: Error compiling query code (in C:\Users\User\AppData\Local\Temp\SVM-2348968769537330415\JNIHeaderDirectives.cpp). Compiler command CL -IC:\GraalVM\include\win32 C:\Users\User\AppData\Local\Temp\SVM-2348968769537330415\JNIHeaderDirectives.cpp /FeC:\Users\User\AppData\Local\Temp\SVM-2348968769537330415\JNIHeaderDirectives.exe output included error: [Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27035 for …Run Code Online (Sandbox Code Playgroud) java windows visual-studio-2017 graalvm graalvm-native-image
大家好,我是 GraalVM 的新手,正在尝试按照指南启动一个 spring 本机项目https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/#getting-started-buildpacks。
当我添加plugins { id 'org.springframework.experimental.aot' version '0.11.0' }到 build.gradle 文件后尝试同步时,它失败并出现错误:
Plugin [id: 'io.spring.dependency-management', version: '1.0.11.RELEASE'] was not found in any of the following sources:
* Try:
Run with --scan to get full insights.
* Exception is:
org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'io.spring.dependency-management', version: '1.0.11.RELEASE'] was not found in any of the following sources:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'io.spring.dependency-management:io.spring.dependency-management.gradle.plugin:1.0.11.RELEASE')
Searched in …Run Code Online (Sandbox Code Playgroud) 我的项目使用了Nashorn Javascript引擎。我正在尝试迁移到java11,也从Nashorn迁移到Graal。我在这里阅读到可以从JDK 11开始通过标准JDK安装来使用graal。此外,我还阅读了Graal-SDK已上传到Maven Central的信息,并且具有Java标记polyglot.js.nashorn-compat以方便迁移。因此,我使用了jdk11,将maven依赖项添加到pom.xml中,并使用了Java标志,但是当我尝试通过名称“ graal.js”获取引擎时,此处为null:
ScriptEngine engine = engineManager.getEngineByName("graal.js")
Run Code Online (Sandbox Code Playgroud)
我想念的是什么?如何使其运作?
我喜欢在 Quarkus 中使用 JAX-RS 的想法,因为它会使代码不依赖于框架实现。但是,当涉及到 DB 时,我们建议使用“Panache”并将 DB 实体从PanacheEntity. 我想它对于 AOT 工作(基本上是 Quarkus 正在尝试做的事情)非常方便和有益,并且大大简化了 Quarkus 工作,但是它引入了对特定实现的严重依赖,因此我们不能使用纯 JPA 模块。
这与“干净的架构”相冲突,并使此类 DB 模块的测试变得复杂 [如果可能的话]。假设我希望能够为 Spring 和基于 Quarkus 的应用程序模块使用相同的 DB 模块(仅使用纯 JPA 注释)。它迫使我在设计纯度方面复制代码或作弊。
是否有可能使用纯 JPA 注释进行持久化,并且可能会使用插件(在编译期间修改代码)或使用不进行运行时字节码修改/使用反射的 ORM 框架来付出代价?有什么例子吗?
附注。恭喜1.0发布!干得好,Quarkus 团队。