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

在Travis CI中使用本机图像编译的GraalVM

笪健
2023-03-14

我有一个Java项目,我用GraalVM原生映像编译成可执行的二进制文件。我想为Travis CI的项目配置持续集成过程,这对我来说很难——Travis CI允许吗?如何配置。特拉维斯。用GraalVM原生图像构建的yml文件

共有2个答案

宗政洋
2023-03-14

选项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

关键部分是您的Dockerfilenow(参见这个完整的示例,利用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-java11https://hub.docker.com/r/oracle/graalvm-ce/在这里由于缺少native image命令和Maven,我们使用guutil来安装命令,并再次使用SDKMAN来安装Maven。现在,您可以在本地和像TravisCI这样的CloudCI系统上编译GraalVM原生图像。

请记住一个提示:本机图像编译非常需要内存。如果您需要使用--no server选项,那么您应该使用-J-Xmx4G参数将内存使用限制为特拉维斯构建的RAM的4GB,因为否则您的构建可能会因错误而失败:映像构建请求失败,退出状态137或类似错误。

下一个逻辑步骤是将生成的Docker映像推送到某种Docker注册表,并可能在某些云PaaS中运行容器。如果你需要更多的信息,可以看看这本完全可压缩的指南。在这个示例项目中,还有一个完全工作的Docker多阶段构建启用了Dockerfilehttps://github.com/jonashackt/spring-boot-graalvm/blob/master/Dockerfile

闻人树
2023-03-14

我能够使用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