关于java:毫无耐性的Micronaut试用

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

@MicronautTest
public 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. 爪哇我话你知 ↩

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理