graalvm native image 试用
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 试用的更多相关文章
- Solon 1.5.67 发布,增加 GraalVm Native 支持
Solon 已有120个生态扩展插件,此次更新主要为细节打磨: 添加 solon.extend.graalvm 插件,用于适配 graalvm native image 模式 从此,solon 进入 ...
- 译文:在GraalVM中部署运行Spring Boot应用
GraalVM是一种高性能的多语言虚拟机,用于运行以JavaScript等基于LLVM的各种语言编写的应用程序.对于Java应用也可作为通常JVM的替代,它更具有性能优势.GraalVM带来的一个有趣 ...
- 通过 GraalVM 将 Java 程序编译成本地机器码!
前言 2018年4月,Oracle Labs新公开了一项黑科技:Graal VM. 这是一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为"任何语言"的运行平台使 ...
- Spring Native 项目,把 Spring 项目编译成原生程序!
Spring Native 是什么 优点 缺点 原生镜像(native image)和常规 JVM 程序的区别 前置条件:GraalVM 支持的语言 关键特性 GraalVM 下的 Java 微服务 ...
- 🏆【JVM深层系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究
GraalVM 背景 新.旧编程语言的兴起躁动,说明必然有其需求动力所在,譬如互联网之于JavaScript.人工智能之于Python,微服务风潮之于Golang等等.大家都清楚不太可能有哪门语言能在 ...
- 使用Quarkus在Openshift上构建微服务的快速指南
在我的博客上,您有机会阅读了许多关于使用Spring Boot或Micronaut之类框架构建微服务的文章.这里将介绍另一个非常有趣的框架专门用于微服务体系结构,它越来越受到大家的关注– Quarku ...
- 云原生时代,Java的危与机(周志明)
说明 本篇文章是转载自周志明老师的文章,链接地址:https://www.infoq.cn/article/RQfWw2R2ZpYQiOlc1WBE 今天,25 岁的 Java 仍然是最具有统治力的编 ...
- Java微服务 vs Go微服务,究竟谁更强!?
前言 Java微服务能像Go微服务一样快吗? 这是我最近一直在思索地一个问题. 去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nels ...
- 云原生时代的Java
原文链接(作者:周志明):https://time.geekbang.org/column/article/321185 公开课链接:https://time.geekbang.org/opencou ...
随机推荐
- 查看window重启日志
命令行输入 net statistics WORKSTATION 显示开机时间 如果你今天一直没有关机,但是你看到这个信息显示今天XX点才开始统计数据的说明电脑重启了
- Spring Boot 代码覆盖率测试
代码覆盖率测试是规范软件开发流程里一个必不可少的环节.一般都是在PG末尾阶段,伴随着IT自测产生. ↑以上,是自己yy出来的啊,反正我司是这样要求的.不跑覆盖率,鬼知道你在代码里夹杂了一些什么东西. ...
- 《Game Programming Patterns》游戏设计模式
转载自:https://blog.csdn.net/poem_qianmo/article/details/52505170 https://blog.csdn.net/poem_qianmo/art ...
- 异步IO与回调
最好了解 Java NIO 中 Buffer.Channel 和 Selector 的基本操作,主要是一些接口操作,比较简单. 本文将介绍非阻塞 IO 和异步 IO,也就是大家耳熟能详的 NIO 和 ...
- [转载]DevExpress GridControl 使用方法技巧 总结 收录整理
最近开始用DevExpress组件,发现很好的经验总结博客,在这里转载分享 原作者:https://www.cnblogs.com/wordgao/p/4517011.html 一.如何解决单击记录整 ...
- 订单1:n支付单 设计讨论
方法一:订单1:1支付单,下单时生成1订单,并生成1支付单(这个支付单是微信需要的相关信息),设置超时时间2小时,如果订单超时,则提示用户,订单已超时,重新下单即可: 方法二:订单1:N支付单,下单时 ...
- vue条件语句、循环语句、计算属性、侦听器监听属性
因为 v-if 和v-for是一个指令,所以必须将它添加到一个元素上.但是如果想切换多个元素呢?此时可以把一个 <template> 元素当做不可见的包裹元素,并在上面使用 v-if.最终 ...
- C#异步的世界【下】(转)
接上篇:<C#异步的世界[上]> 上篇主要分析了async\await之前的一些异步模式,今天说异步的主要是指C#5的async\await异步.在此为了方便的表述,我们称async\aw ...
- .Net 获取当前周是第几周
最近项目中需要获取当前周是今年的第几周,这东西听起来不难,但是还挺有意思的. 在中国,一周是从周一开始算,周天结束,在国外就不是这样了,是从周天到周六为一个周. 有很多种方式去实现在这个功能,下面介绍 ...
- .net core 加载项目提示项目文件不完整,dotnet提示不是内部或外部命令
记录一下 在系统环境变量中PATH添加如下: C:\Windows;C:\Windows\System32\System32\Wbem;C:\Windows\System32;