共计 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
程序入口,相似 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;
@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
- 给老手看的 Micronaut 入门教程 ↩
- 爪哇我话你知 ↩