graalvm 提供的native 模式,可以加速应用的启动,不同可以让应用不再依赖jvm 运行时环境,但是
也有一些限制 参考 https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md

项目准备

  • 项目结构
 
├── Dockerfile
├── pom.xml
└── src
    ├── main
    │ ├── java
    │ │ └── com
    │ │ └── dalong
    │ │ └── Application.java
    │ └── resources
    └── test
        └── java
 
 
  • maven pom.xml
    代码是一个简单的调用js 的代码,使用了graalvm 的polyglot 特性
    同时包含了native-image 的maven plugin 方便生成native 模式的可运行软件
 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dalong</groupId>
    <artifactId>js-exec</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <encoding>UTF-8</encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.graalvm.js</groupId>
            <artifactId>js</artifactId>
            <version>19.2.1</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>native-image-js</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.dalong.Application</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.oracle.substratevm</groupId>
                <artifactId>native-image-maven-plugin</artifactId>
                <version>19.2.0.1</version>
                <configuration>
                    <buildArgs>--language:js</buildArgs>
                    <imageName>${project.artifactId}</imageName>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>native-image</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
  • 代码
    Application.java
 
package com.dalong;
import org.graalvm.polyglot.*;
/**
 * @author dalong
 */
public class Application {
    /**
     * main for test graalvm exec js
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("Hello Java!");
        try (Context context = Context.create()) {
            context.eval("js", "print('Hello JavaScript!');");
        }
    }
  • dockerfile
    注意此构建是通过本机模式生成的(linux),我们也可以使用docker multi stage 的模式构建
 
FROM debian:9-slim
LABEL maintainer="dalongrong"
LABEL email = "1141591465@qq.com"
COPY target/js-exec /js-exec
CMD [ "/js-exec" ]

构建&&测试

  • 本地构建

    注意需要安装graalvm 可以通过sdkman 安装

mvn clean package

效果

[INFO] ImageClasspath Entry: org.graalvm.js:js:jar:19.2.1:compile (file:///Users/dalong/.m2/repository/org/graalvm/js/js/19.2.1/js-19.2.1.jar)
[INFO] ImageClasspath Entry: org.graalvm.regex:regex:jar:19.2.1:compile (file:///Users/dalong/.m2/repository/org/graalvm/regex/regex/19.2.1/regex-19.2.1.jar)
[INFO] ImageClasspath Entry: org.graalvm.truffle:truffle-api:jar:19.2.1:compile (file:///Users/dalong/.m2/repository/org/graalvm/truffle/truffle-api/19.2.1/truffle-api-19.2.1.jar)
[INFO] ImageClasspath Entry: org.graalvm.sdk:graal-sdk:jar:19.2.1:compile (file:///Users/dalong/.m2/repository/org/graalvm/sdk/graal-sdk/19.2.1/graal-sdk-19.2.1.jar)
[INFO] ImageClasspath Entry: org.ow2.asm:asm:jar:6.2.1:compile (file:///Users/dalong/.m2/repository/org/ow2/asm/asm/6.2.1/asm-6.2.1.jar)
[INFO] ImageClasspath Entry: org.ow2.asm:asm-tree:jar:6.2.1:compile (file:///Users/dalong/.m2/repository/org/ow2/asm/asm-tree/6.2.1/asm-tree-6.2.1.jar)
[INFO] ImageClasspath Entry: org.ow2.asm:asm-analysis:jar:6.2.1:compile (file:///Users/dalong/.m2/repository/org/ow2/asm/asm-analysis/6.2.1/asm-analysis-6.2.1.jar)
[INFO] ImageClasspath Entry: org.ow2.asm:asm-commons:jar:6.2.1:compile (file:///Users/dalong/.m2/repository/org/ow2/asm/asm-commons/6.2.1/asm-commons-6.2.1.jar)
[INFO] ImageClasspath Entry: org.ow2.asm:asm-util:jar:6.2.1:compile (file:///Users/dalong/.m2/repository/org/ow2/asm/asm-util/6.2.1/asm-util-6.2.1.jar)
[INFO] ImageClasspath Entry: com.ibm.icu:icu4j:jar:62.1:compile (file:///Users/dalong/.m2/repository/com/ibm/icu/icu4j/62.1/icu4j-62.1.jar)
[INFO] ImageClasspath Entry: com.dalong:js-exec:jar:1.0-SNAPSHOT (file:///Users/dalong/quarkus-cloud-native/quarkus-quickstarts/jsexec/target/native-image-js.jar)
[WARNING] Version mismatch between native-image-maven-plugin (19.2.0.1) and native-image executable (19.2.1)
[INFO] Executing: /Users/dalong/.sdkman/candidates/java/19.2.1-grl/jre/bin/native-image -cp /Users/dalong/.m2/repository/org/graalvm/js/js/19.2.1/js-19.2.1.jar:/Users/dalong/.m2/repository/org/graalvm/regex/regex/19.2.1/regex-19.2.1.jar:/Users/dalong/.m2/repository/org/graalvm/truffle/truffle-api/19.2.1/truffle-api-19.2.1.jar:/Users/dalong/.m2/repository/org/graalvm/sdk/graal-sdk/19.2.1/graal-sdk-19.2.1.jar:/Users/dalong/.m2/repository/org/ow2/asm/asm/6.2.1/asm-6.2.1.jar:/Users/dalong/.m2/repository/org/ow2/asm/asm-tree/6.2.1/asm-tree-6.2.1.jar:/Users/dalong/.m2/repository/org/ow2/asm/asm-analysis/6.2.1/asm-analysis-6.2.1.jar:/Users/dalong/.m2/repository/org/ow2/asm/asm-commons/6.2.1/asm-commons-6.2.1.jar:/Users/dalong/.m2/repository/org/ow2/asm/asm-util/6.2.1/asm-util-6.2.1.jar:/Users/dalong/.m2/repository/com/ibm/icu/icu4j/62.1/icu4j-62.1.jar:/Users/dalong/quarkus-cloud-native/quarkus-quickstarts/jsexec/target/native-image-js.jar --language:js -H:Class=com.dalong.Application -H:Name=js-exec
Build on Server(pid: 88272, port: 60056)*
[js-exec:88272] classlist: 5,881.54 ms
[js-exec:88272] (cap): 4,853.08 ms
[js-exec:88272] setup: 7,128.30 ms
[js-exec:88272] (typeflow): 32,678.52 ms
[js-exec:88272] (objects): 19,067.05 ms
[js-exec:88272] (features): 10,743.39 ms
[js-exec:88272] analysis: 65,674.81 ms
[js-exec:88272] (clinit): 1,198.02 ms
8711 method(s) included for runtime compilation
[js-exec:88272] universe: 4,099.50 ms
[js-exec:88272] (parse): 8,269.88 ms
[js-exec:88272] (inline): 8,757.03 ms
[js-exec:88272] (compile): 57,386.27 ms
[js-exec:88272] compile: 78,905.65 ms
[js-exec:88272] image: 13,244.40 ms
[js-exec:88272] write: 3,109.99 ms
[js-exec:88272] [total]: 179,773.77 ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:10 min
[INFO] Finished at: 2019-11-20T19:34:36+08:00
[INFO] ---------------------------------------------
  • 运行效果
./target/js-exec 
Hello Java!
Hello JavaScript!

参考资料

https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md
https://www.graalvm.org/docs/reference-manual/native-image/

graalvm native image 试用的更多相关文章

  1. Solon 1.5.67 发布,增加 GraalVm Native 支持

    Solon 已有120个生态扩展插件,此次更新主要为细节打磨: 添加 solon.extend.graalvm 插件,用于适配 graalvm native image 模式 从此,solon 进入 ...

  2. 译文:在GraalVM中部署运行Spring Boot应用

    GraalVM是一种高性能的多语言虚拟机,用于运行以JavaScript等基于LLVM的各种语言编写的应用程序.对于Java应用也可作为通常JVM的替代,它更具有性能优势.GraalVM带来的一个有趣 ...

  3. 通过 GraalVM 将 Java 程序编译成本地机器码!

    前言 2018年4月,Oracle Labs新公开了一项黑科技:Graal VM. 这是一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为"任何语言"的运行平台使 ...

  4. Spring Native 项目,把 Spring 项目编译成原生程序!

    Spring Native 是什么 优点 缺点 原生镜像(native image)和常规 JVM 程序的区别 前置条件:GraalVM 支持的语言 关键特性 GraalVM 下的 Java 微服务 ...

  5. 🏆【JVM深层系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究

    GraalVM 背景 新.旧编程语言的兴起躁动,说明必然有其需求动力所在,譬如互联网之于JavaScript.人工智能之于Python,微服务风潮之于Golang等等.大家都清楚不太可能有哪门语言能在 ...

  6. 使用Quarkus在Openshift上构建微服务的快速指南

    在我的博客上,您有机会阅读了许多关于使用Spring Boot或Micronaut之类框架构建微服务的文章.这里将介绍另一个非常有趣的框架专门用于微服务体系结构,它越来越受到大家的关注– Quarku ...

  7. 云原生时代,Java的危与机(周志明)

    说明 本篇文章是转载自周志明老师的文章,链接地址:https://www.infoq.cn/article/RQfWw2R2ZpYQiOlc1WBE 今天,25 岁的 Java 仍然是最具有统治力的编 ...

  8. Java微服务 vs Go微服务,究竟谁更强!?

    前言 Java微服务能像Go微服务一样快吗? 这是我最近一直在思索地一个问题. 去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nels ...

  9. 云原生时代的Java

    原文链接(作者:周志明):https://time.geekbang.org/column/article/321185 公开课链接:https://time.geekbang.org/opencou ...

随机推荐

  1. 【2019年07月22日】A股最便宜的股票

    查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 便宜指数 = PE + PB + 股息 + ROE,四因子等权,数值越大代表越低估. 本策略只是根据最新的数据来选 ...

  2. flutter RN taro选型思考

    当前RN已经成熟,但是依赖于大平台(JD.携程),小公司想开箱即用还是有困难的 纯Flutter还远未成熟,更多的是和原生进行混合 但是作为个体又想要在某一个点切入市场,就是需要作选择,基于当下及未来 ...

  3. python3 字符和数字(ASC码)转换

    print(ord('b')) print(ord('B')) print(chr(98)) print(chr(66)) 结果:98 66 b B 也可以数字转ASC码,原理一样,如下(结果就不输出 ...

  4. 怎么写自己的CMakeLists.txt--二

    之前写过一篇及其简单的关于CMakeLists.txt的写法,现在重点剖析find_package的用法. 如果程序中使用了外部库,事先并不知道它的头文件和链接库的位置,就要给出头文件和链接库的查找方 ...

  5. MySQL子查询结果集是否有记录

    Mark SELECT tu.id userId, tu.avatar_url avatarUrl, tu.wx_nick_name wxNickName, tu.city city, (select ...

  6. Windows下使用grep命令

    一.可供选择的工具列表: Grep for Windows – 轻量级选项 GNU utilities for Win32 – 本地港口 Cash – 重量轻,建于Node.js之上 Cygwin – ...

  7. 2019-11-29-win10-uwp-颜色转换

    原文:2019-11-29-win10-uwp-颜色转换 title author date CreateTime categories win10 uwp 颜色转换 lindexi 2019-11- ...

  8. python 练习题:使用迭代查找一个list中最小和最大值,并返回一个tuple

    # -*- coding: utf-8 -*- # 请使用迭代查找一个list中最小和最大值,并返回一个tuple from collections import Iterable def findM ...

  9. TCP/UDP协议(二)

    面试问题:Tcp/Udp协议是什么,各有什么异同点,各自的使用场景? Tcp协议(传输控制协议) tcp是面向连接的协议,在收发数据之前,必须与对方建立可靠的连接: 三次握手:简单形象通俗描述: 主机 ...

  10. 剑指Offer_栈的压入序列是否有对应的弹出序列

    题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序. 如:假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是 ...