作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 Kotlin 构建一个简单的应用程序,该应用程序在 GraalVM native 镜像上使用 kotlin.random.Random 类。
但这在运行时失败。堆栈跟踪见下文。
作为一种解决方法,您可以使用 java 标准 java.util.Random 类。
有人能告诉我如何使用 Kotlin 类型吗?
App.kt
import kotlin.random.Random
fun main(args: Array<String>) {
println(Random.nextInt())
}
############################################################################
# Graal Native Image Early-Access Build
#
# Make sure you configured Docker to use at least 6gb ram!
# build from project root dir with: docker build -t example-kotlin-random-graalvm-native:1.0.0-SNAPSHOT .
# run with: docker run -d example-kotlin-random-graalvm-native:1.0.0-SNAPSHOT
############################################################################
#####
# The builder image to build the native app
#####
FROM findepi/graalvm:native as builder
LABEL stage=builder
WORKDIR /builder
COPY ./build/libs/app-all.jar ./app.jar
RUN native-image \
--no-fallback \
--static \
-jar app.jar
#####
# The actual image to run
#####
FROM alpine:3.9
RUN apk --no-cache add ca-certificates
# App
WORKDIR /app
COPY --from=builder /builder/app .
EXPOSE $PORT
ENTRYPOINT ["./app"]
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.oracle.svm.core.hub.ClassInitializationInfo.initialize(ClassInitializationInfo.java:290)
at java.lang.Class.ensureInitialized(DynamicHub.java:475)
at kotlin.random.Random.<clinit>(Random.kt:242)
at com.oracle.svm.core.hub.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:350)
at com.oracle.svm.core.hub.ClassInitializationInfo.initialize(ClassInitializationInfo.java:270)
at com.example.AppKt.main(App.kt:8)
Caused by: java.lang.InstantiationException: Type `kotlin.internal.jdk8.JDK8PlatformImplementations` can not be instantiated reflectively as it does not have a no-parameter constructor or the no-parameter constructor has not been added explicitly to the native image.
at java.lang.Class.newInstance(DynamicHub.java:793)
at kotlin.internal.PlatformImplementationsKt.<clinit>(PlatformImplementations.kt:41)
... 6 more
最佳答案
您必须修改reflections rules
将以下内容添加到 native-image 参数:
-H:ReflectionConfigurationFiles=/path/to/reflectconfig
并将受影响的类的规则放入reflectionconfig文件中:
[{
"name" : "kotlin.internal.jdk8.JDK8PlatformImplementations",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredFields" : true,
"allPublicFields" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true
}]
或者,您也可以使用相同的文件指定 init 方法,
read this
关于java - 有没有办法在 GraalVM 原生镜像中使用 kotlin.random.Random,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61487173/
我是一名优秀的程序员,十分优秀!