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

48次阅读

共计 4799 个字符,预计需要花费 12 分钟才能阅读完成。

应用 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. 爪哇我话你知 ↩

正文完
 0