- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编译一个基于spark-java的简单java应用程序到原生图像。该应用程序公开一个 GET/healthcheck
端点,该端点始终返回 text/plain:OK
。
项目中只有两个依赖项:
dependencies {
implementation 'com.sparkjava:spark-core:2.9.1'
implementation 'org.slf4j:slf4j-simple:1.7.21'
}
我通过 GraalVM 运行 fatjar 创建了 native 镜像配置:
java -agentlib:native-image-agent=config-output-dir=native-image/ -jar javaspark-native-1.0-SNAPSHOT-fatjar.jar
重要的是我正在对端点进行 REST 调用,以确保代理可以检查代码中的必要分支。然后将生成的 *.json 文件放入 META-INF/native-image
中,因此由 native-image
自动选取。
然后我使用多阶段 docker build 来编译 fatjar 并将 jar 编译到 native 镜像中:
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y gcc zlib1g-dev wget
RUN wget https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-19.3.0.2/graalvm-ce-java11-linux-amd64-19.3.0.2.tar.gz
RUN tar -vzxf graalvm-ce-java11-linux-amd64-19.3.0.2.tar.gz
ENV PATH /graalvm-ce-java11-19.3.0.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RUN gu install native-image
WORKDIR /graalvm-demo
COPY . /graalvm-demo
RUN ./gradlew clean fatJar
RUN native-image --verbose --enable-http -H:+ReportUnsupportedElementsAtRuntime --no-fallback -jar /graalvm-demo/build/libs/javaspark-native-1.0-SNAPSHOT-fatjar.jar
FROM adoptopenjdk/openjdk11:x86_64-alpine-jdk-11.0.3_7-slim
WORKDIR /graalvm-demo
COPY --from=0 /graalvm-demo/javaspark-native-1.0-SNAPSHOT-fatjar .
RUN apk --update --no-cache add \
curl \
tar \
&& rm -rf /var/cache/apk/*
EXPOSE 8080
CMD ./javaspark-native-1.0-SNAPSHOT-fatjar
当通过以下方式触发 docker 构建时:
docker build . -t app
一切看起来都很好 - 图像已创建,启动后控制台不会报告任何问题:
[Thread-0] INFO org.eclipse.jetty.util.log - Logging initialized @1ms to org.eclipse.jetty.util.log.Slf4jLog
[Thread-0] INFO spark.embeddedserver.jetty.EmbeddedJettyServer - == Spark has ignited ...
[Thread-0] INFO spark.embeddedserver.jetty.EmbeddedJettyServer - >> Listening on 0.0.0.0:8080
[Thread-0] INFO org.eclipse.jetty.server.Server - jetty-9.4.z-SNAPSHOT; built: 2019-04-29T20:42:08.989Z; git: e1bc35120a6617ee3df052294e433f3a25ce7097; jvm 11.0.5
[Thread-0] INFO org.eclipse.jetty.server.session - DefaultSessionIdManager workerName=node0
[Thread-0] INFO org.eclipse.jetty.server.session - No SessionScavenger set, using defaults
[Thread-0] INFO org.eclipse.jetty.server.session - node0 Scavenging every 600000ms
[Thread-0] INFO org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@6260ba9e{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
[Thread-0] INFO org.eclipse.jetty.server.Server - Started @4ms
但是,当我尝试访问端点时,它不起作用:
[qtp1802776325-8] WARN org.eclipse.jetty.io.ManagedSelector - java.lang.ExceptionInInitializerError
[qtp1802776325-10] WARN org.eclipse.jetty.io.ManagedSelector - java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.jetty.server.HttpOutput
有人知道我做错了什么吗?
存储库中演示该问题的提交:https://github.com/xmcax/javaspark-native/tree/f5636ed39c63e35861840998a21a0b79bf4ff996
最佳答案
事实证明,自 GraalVM 19.0.x ( https://www.graalvm.org/docs/release-notes/19_0/#1900 ) 起:
There was a change in how classes are initialized in a native-image. Now, we initialize application classes at run time by default.
这解释了为什么我到目前为止看到的所有教程都没有提到我的问题中描述的问题 - 它们都使用 GraalVM 的早期版本,其中静态类默认在构建时初始化。应用相同的方法可以解决该问题。与:
RUN native-image \
-H:+ReportUnsupportedElementsAtRuntime \
-H:+TraceClassInitialization \
--verbose \
--enable-http \
--static \
--no-fallback \
--initialize-at-build-time=org.eclipse.jetty,org.slf4j,javax.servlet,org.sparkjava \
-jar /sparkjava/build/libs/javaspark-native-1.0-SNAPSHOT-fatjar.jar
一切都按预期进行。使用 alpine 基础镜像,生成的 docker 镜像大小为 26M:
REPOSITORY TAG IMAGE ID CREATED SIZE
ni7 latest dcb94dbfb6ad About a minute ago 26MB
完整的解决方案可以在这里看到:https://github.com/xmcax/javaspark-native/tree/b9235b1f777de661c0087fbfef4ccaf39303ad3e
关于java - SparkJava 编译为 native 镜像不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59599053/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!