应用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

程序入口,相似springbootApplication.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


  1. 给老手看的 Micronaut 入门教程 ↩
  2. 爪哇我话你知 ↩