我有一个Java项目,我用GraalVM原生映像编译成可执行的二进制文件。我想为Travis CI的项目配置持续集成过程,这对我来说很难——Travis CI允许吗?如何配置。特拉维斯。用GraalVM原生图像构建的yml文件?
选项1:直接在Travis CI主机上编译本机映像的GraalVM
在TravisCI上安装GraalVM(包括本机映像)的第一个选项是:只需使用SDKMAN。。特拉维斯。yml
看起来像这样:
language: minimal
install:
# Install GraalVM with SDKMAN
- curl -s "https://get.sdkman.io" | bash
- source "$HOME/.sdkman/bin/sdkman-init.sh"
- sdk install java 20.0.0.r11-grl
# Check if GraalVM was installed successfully
- java -version
# Install Maven, that uses GraalVM for later builds
- sdk install maven
# Show Maven using GraalVM JDK
- mvn --version
# Install GraalVM Native Image
- gu install native-image
# Check if Native Image was installed properly
- native-image --version
script:
# Run GraalVM Native Image compilation
- native-image \
--no-server \
--no-fallback \
-H:+TraceClassInitialization \
-H:Name=yourArtifactNameHere \
-H:+ReportExceptionStackTraces \
-DremoveUnusedAutoconfig=true \
-DremoveYamlSupport=true \
-cp yourClassPathHere yourMainClassHere;
这里有一个关键点需要注意:不要单独使用语言:java
或缺省的linux发行版,如dist: bionic
!,因为它们带有预先安装的Maven版本——这些版本被配置为使用预先安装的OpenJDK。但是大多数人需要Maven使用我们安装的SDKMAN GraalVM来正确编译我们的Java项目。因此,我们只需使用语言:最小化
,这是一种基于基本Travis构建环境获取Travis构建的简单方法,而无需预先安装JDK或Maven。为了验证这一点,我们运行一个mvn--version
,它应该在我们的Travis构建中显示这样的内容:
$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /home/travis/.sdkman/candidates/maven/current
Java version: 11.0.6, vendor: Oracle Corporation, runtime: /home/travis/.sdkman/candidates/java/20.0.0.r11-grl
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-1028-gcp", arch: "amd64", family: "unix"
script
部分中的native image
命令在这里只是一个占位符,因为根据您的用例,您可能有完全不同的参数。
在我的例子中,我想编译一个Spring Boot应用程序,所以我还创建了一个100%可理解的示例项目Spring Boot graalvm,在这里,您还可以查看TravisCI构建,它安装graalvm并进行本机映像编译:https://travis-ci.org/jonashackt/spring-boot-graalvm
===========================================
选项2:使用TravisCI Docker服务在Docker中编译本机图像的GraalVM
也许您已经习惯了在Docker容器中构建Java应用程序——那么GraalVM本机映像编译也不例外。使用TravisCI docker服务,。travis.yml
变得相当简单:
dist: bionic
language: minimal
services:
- docker
script:
- docker build . --tag=spring-boot-graal
关键部分是您的Dockerfile
now(参见这个完整的示例,利用Docker多阶段构建)——以及与选项1相比的优势:您可以在您的机器上本地测试它。下面是一个示例Dockerfile
:
FROM oracle/graalvm-ce:20.1.0-java11
MAINTAINER Jonas Hecht
ADD . /build
WORKDIR /build
# For SDKMAN to work we need unzip & zip
RUN yum install -y unzip zip
RUN \
# Install SDKMAN
curl -s "https://get.sdkman.io" | bash; \
source "$HOME/.sdkman/bin/sdkman-init.sh"; \
sdk install maven; \
# Install GraalVM Native Image
gu install native-image;
RUN source "$HOME/.sdkman/bin/sdkman-init.sh" && mvn --version
RUN native-image --version
RUN source "$HOME/.sdkman/bin/sdkman-init.sh" && native-image \
--no-server -J-Xmx4G \
--no-fallback \
-H:+TraceClassInitialization \
-H:Name=yourArtifactNameHere \
-H:+ReportExceptionStackTraces \
-DremoveUnusedAutoconfig=true \
-DremoveYamlSupport=true \
-cp yourClassPathHere yourMainClassHere;
我们使用的是DockerHub上的官方Oracle GraalVM imageOracle/GraalVM ce:20.1.0-java11
https://hub.docker.com/r/oracle/graalvm-ce/在这里由于缺少native image
命令和Maven,我们使用gu
util来安装命令,并再次使用SDKMAN来安装Maven。现在,您可以在本地和像TravisCI这样的CloudCI系统上编译GraalVM原生图像。
请记住一个提示:本机图像编译非常需要内存。如果您需要使用--no server
选项,那么您应该使用-J-Xmx4G
参数将内存使用限制为特拉维斯构建的RAM的4GB
,因为否则您的构建可能会因错误而失败:映像构建请求失败,退出状态137
或类似错误。
下一个逻辑步骤是将生成的Docker映像推送到某种Docker注册表,并可能在某些云PaaS中运行容器。如果你需要更多的信息,可以看看这本完全可压缩的指南。在这个示例项目中,还有一个完全工作的Docker多阶段构建启用了Dockerfile
:https://github.com/jonashackt/spring-boot-graalvm/blob/master/Dockerfile
我能够使用install jdk在Travis CI构建中配置本机映像GraalVM编译。巴赫的sh。java-java外壳生成器。这是。特拉维斯·西。yml:
sudo: false
language: java
cache:
directories:
- $HOME/.m2
before_install:
- wget https://github.com/sormuras/bach/raw/master/install-jdk.sh
matrix:
include:
# GraalVM
- env: JDK='GraalVM 19'
install: . ./install-jdk.sh --url "https://github.com/oracle/graal/releases/download/vm-19.2.0/graalvm-ce-linux-amd64-19.2.0.tar.gz"
script:
- mvn package -Pnative -Dnative-image.docker-build=true
我有一个JavaFX项目,希望使用GraalVM Java虚拟机和相关的本机映像工具将其编译成Linux二进制文件。我正在使用GraalVM Java 11版本20.1.0和本机Image Maven插件来实现这一点,该插件是通过Maven添加的。 最初,我收到一个错误,说明我使用本机映像跟踪代理生成用于反射的配置文件,我将其传递到编译器插件中,如下所示: 我还打开了堆栈跟踪异常报告。 现在,当我
我的应用程序位于Quarkus框架之上。该应用程序的主要功能是简单的REST API,用于安排一些任务(现在它只是将一些消息发布到日志中)。 调度功能是我用Quartz framework实现的,通常情况下,当应用程序收到安排新事件的POST请求时,它会做两件事: 将实体从请求保存到数据库 在JSON中提到的日期和时间上安排Quartz作业 此外,当应用程序刚刚启动时,我创建了从数据库中获取所有实
GraalVM系统显然无法将Spring应用程序编译为本机映像。
根据文档,GraalVM项目中的本机映像编译器有一些动态代理的限制。既然Hibernate大量使用了代理,那么它在提前编译的项目中能正常工作吗? Quarkus项目似乎表明它可以,但我的理解主要是基于Reddit的一篇帖子说 Hibernate ORM现在即使编译为GraalVM本机映像也可以工作--只要确保使用Quarkus构建应用程序即可。 如果我不想(或者不会)使用夸克呢?是否可以使用使用H
使用原生图像来改善松露解释器的启动时间似乎很常见。 我的理解是,使用本机映像的AOT编译将导致方法编译为在专用子虚拟机中运行的本机代码。 此外,Truffle框架依赖于动态收集的分析信息来确定要部分评估的节点树。PE的工作方式是获取有问题节点的JVM字节码,并在Graal JIT编译器的帮助下对其进行分析。 这就是我感到困惑的地方。如果我们通过原生图像传递一个 Truffle 解释器,则每个节点方
我用Micronaut 2.0.0创建了一个简单的应用程序:它是使用Micronaut application generator在此处https://Micronaut.io/launch/生成的,然后添加了以下内容: 然后我使用构建应用程序。 当我用启动它时,它成功启动。它会正确响应: 现在我构建一个本机映像: 然后运行它: 开始还可以。 现在相同的请求会产生错误: 我使用GraalVM CE