应用graalVM,gradle,micronaut 开发一个简略的web申请,同时公布成一个独自的二进制文件。 感激: 入门教程1 和 国内java资源下载 2:
装置
装置graalVM
因为临时sdkman还没有对graalVM进行版本保护,因而手动下载graalvm-ce-java11-[os]-amd64.tar.gz
安装包并解压缩。
环境配置
设置环境变量~/.bashrc
export GRAALVM_HOME="$HOME/graalvm-ce-java11"export JAVA_HOME="$GRAALVM_HOME"export PATH="$JAVA_HOME/bin:$PATH"$ source ~/.bashrc
设置结束后,查看java环境
装置native-image插件
留神: graalvm无奈穿插编译,在win/mac下打包的二进制文件无奈运行于linux,个别采纳docker pull镜像的形式解决
native-image
当初变为了graalVM
的一个插件,须要额定装置
# gu: graalvm update$ gu install native-image
会主动装置于$GRAALVM_HOME/bin
目录下,设置结束后,查看native-image
环境
装置gradle
应用sdkman
装置gradle
$ sdk insall gradle 6.5.1
这里大概率您会遇到网络环境问题,因而倡议手动下载gradle
安装包,解压
$ sdk install gradle 6.5.1-local /your/pathof/gradle-6.5.1-bin
环境配置
设置环境变量~/.bashrc
export GRADLE_HOME="$HOME/.sdkman/candidates/gradle/current"export GRADLE_USER_HOME="/your/pathof/gradleUser"$ source ~/.bashrc
设置结束后,查看gradle环境
$ gradle -v
设置aliyun源
创立文件~/.sdkman/candidates/gradle/6.5.1/init.d/build.gradle
allprojects { repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/google/' } all { ArtifactRepository repo -> if (repo instanceof MavenArtifactRepository) { def url = repo.url.toString() if (url.startsWith('https://repo.maven.apache.org/maven2/') || url.startsWith('https://repo.maven.org/maven2') || url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/') || url.startsWith('https://maven.google.com/') || url.startsWith('https://dl.google.com/dl/android/maven2/')) { //project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL." remove repo } } } } buildscript { repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/google/' } all { ArtifactRepository repo -> if (repo instanceof MavenArtifactRepository) { def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/') || url.startsWith('https://dl.google.com/dl/android/maven2/')) { //project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL." remove repo } } } } }}
装置Micronaut
命令行名为: mn
采纳sdkman
装置,网络问题请自行解决或sdk local install的形式
$ sdk install micronaut
设置结束后,查看mn环境
$ mn -V
至此,环境装置完结????
创立Micronaut我的项目
采纳cli命令mn
,这里同样采纳入门教程2的我的项目
$ mn create-app example.micronaut.demo
此命令会创立demo
文件夹
$ tree demo
这是一个中规中矩的java我的项目,build工具采纳gradle,并且带了Dockerfile
部署文件,同时也一个micronaut-cli.yml
配置文件
集体习惯,不管三七二十一,先build一把,把相干的依赖包都拉取下来
$ cd demo$ gradle clean build
Application.java
程序入口,相似springboot
的Application.java
编写一个controller
在src/main/java/example/micronaut
下创立packagecontrollers
,创立java文件controller/HelloController.java
package example.micronaut.controllers;import io.micronaut.http.MediaType;import io.micronaut.http.annotation.Controller;import io.micronaut.http.annotation.Get;import io.micronaut.http.annotation.Produces;@Controller("/hello")public class HelloController { @Get @Produces(MediaType.TEXT_PLAIN) public String index() { return "Hello Micronaut"; }}
注解:
- @Controller: rest门路映射
- @Get: index()办法反对http get申请
- @Produces: 产生的后果类型,这里设置为一般文本型。默认为
MediaType.APPLICATION_JSON
编写单元测试
在src/test/java/example/micronaut
下创立packagecontrollers
,创立java文件controller/HelloControllerTest.java
package example.micronaut.controllers;import static org.junit.jupiter.api.Assertions.assertEquals;import static org.junit.jupiter.api.Assertions.assertNotNull;import io.micronaut.http.HttpRequest;import io.micronaut.http.client.RxHttpClient;import io.micronaut.http.client.annotation.Client;import io.micronaut.test.annotation.MicronautTest;import org.junit.jupiter.api.Test;import javax.inject.Inject;@MicronautTestpublic class HelloControllerTest { @Inject @Client("/") RxHttpClient client; @Test public void testHello() { HttpRequest<String> request = HttpRequest.GET("/hello"); String body = client.toBlocking().retrieve(request); assertNotNull(body); assertEquals("Hello Micronaut!", body); }}
注解:
- @MicronautTest: 初始化 Application Context 和 Embedded Server 内置服务
- @Inject: JSR330 规范注入注解,注入
RxHttpClient
的bean - @Client: 服务拜访的根门路"/"
运行
单元测试:
$ gradle test
运行程序:
$ gradle run
默认端口:8080,拜访
本地镜像Native-Image打包
again: graalVM目前不反对穿插编译
配置依赖包
我的项目的build.gradle
文件中减少依赖
// 注解处理器,生成 native-image 工具要应用的 reflection-config.json 元数据annotationProcessor("io.micronaut:micronaut-graal")// SVM(Substrate VM)虚拟机compileOnly("org.graalvm.nativeimage:svm")
native-image相干配置
在src/main/resources
目录下创立META-INF/native-image
目录,再在其下创立目录:example/microunaut/micronautDemo
,外面创立文件native-image.properties
Args = -H:IncludeResources=logback.xml|application.yml \ -H:Name=micronautDemo \ -H:Class=example.micronaut.Application
- -H:IncludeResources: 指定容许蕴含的动态资源,能够应用正则表达式。这里为 logback.xml 和 application.yml。
- -H:Name: 指定生成的 Native Image 的名字,这里为 micronautDemo。
- -H:Class: 指定程序的入口(定义了 main() 办法的类)。这里为 example.micronaut.Application,即 Application.java 文件中的 main() 办法。
打包fat-jar
$ ./gradle assemble
在build/libs
下生成jar文件,咱们须要那个比拟大的demo-0.1-all.jar
文件
生成本地镜像
这一步工夫会比拟久,也比拟耗资源
$ native-image --no-server -cp build/libs/demo-0.1-all.jar
生成结束后失去
run it
$ chmod u+x ./micronautDemo$ ./micronautDemo
- 给老手看的 Micronaut 入门教程 ↩
- 爪哇我话你知 ↩