文档地址:​​https://reactiverse.io/vertx-maven-plugin​

已有项目添加该插件

在项目 pom.xml 目录,执行下面的命令即可添加:

mvn io.reactiverse:vertx-maven-plugin:1.0.17:setup

执行该命令后,在 pom.xml 中会增加下面的配置:

<properties>
<vertx.version>3.5.3</vertx.version>
<vertx-maven-plugin.version>1.0.17</vertx-maven-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-stack-depchain</artifactId>
<version>${vertx.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

还有下面的插件:

<plugin>
<groupId>io.reactiverse</groupId>
<artifactId>vertx-maven-plugin</artifactId>
<version>${vertx-maven-plugin.version}</version>
<executions>
<execution>
<id>vmp</id>
<goals>
<goal>initialize</goal>
<goal>package</goal>
</goals>
</execution>
</executions>
<configuration>
<redeploy>true</redeploy>
</configuration>
</plugin>

自动引入的 vert.x 版本为 3.5.3,你可以通过在 mvn 命令增加 ​​-DvertxVersion=3.4.0​​ 这个参数来指定需要的版本。

从头创建空项目

首先你必须创建一个目录,vert.x 插件不会自动给你创建目录,只会创建目录内的 src 和 pom.xml 等文件。

创建一个目录,进入该目录内,在该目录内执行下面的命令:

mvn io.reactiverse:vertx-maven-plugin:1.0.17:setup ^
-DprojectGroupId=org.acme ^
-DprojectArtifactId=acme-project ^
-DprojectVersion=1.0-SNAPSHOT -Dverticle=io.vertx.sample.MyFirstVerticle -Ddependencies=web

如果你使用的 Linux 系统,将上面的 ​​^​​​ 改为 ​​\​​。

这里和上面相比增加了项目 GAV 的配置。

通过 ​​-Dverticle=io.vertx.sample.MyFirstVerticle​​,可以生成一个默认的 Verticle 类。

通过 ​​-Ddependencies=web​​ 可以指定你想加入的 vert.x 的依赖,这里写的名字都是缩写,具体对应关系看下面的介绍。

使用上面命令后,就创建了一个基础 vert.x 项目,在开始学习 vert.x 的时候,通过这种方式可以更快的创建基础项目。

-Ddependencies 对照表

源码:​​dependencies.json​

下面 JSON 中的 labels 就是缩写名,groupId 和 artifactId 是对应的依赖。

[
{
"name": "Vert.x Web",
"labels": [
"web",
"groupId": "io.vertx",
"artifactId": "vertx-web"},
{
"name": "Vert.x Web Client",
"labels": [
"web-client",
"groupId": "io.vertx",
"artifactId": "vertx-web-client"},
{
"name": "Vert.x Mongo Client",
"labels": [
"mongo",
"groupId": "io.vertx",
"artifactId": "vertx-mongo-client"},
{
"name": "Vert.x Kafka Client",
"labels": [
"kafka",
"groupId": "io.vertx",
"artifactId": "vertx-kafka-client"},
{
"name": "Vert.x Consul Client",
"labels": [
"consul",
"groupId": "io.vertx",
"artifactId": "vertx-consul-client"},
{
"name": "Vert.x gRPC",
"labels": [
"gRPC",
"groupId": "io.vertx",
"artifactId": "vertx-grpc"},
{
"name": "Vert.x (async) JDBC Client",
"labels": [
"jdbc",
"groupId": "io.vertx",
"artifactId": "vertx-jdbc-client"},
{
"name": "Vert.x Redis Client",
"labels": [
"redis",
"groupId": "io.vertx",
"artifactId": "vertx-redis-client"},
{
"name": "Vert.x Mail Client",
"labels": [
"mail",
"smtp",
"groupId": "io.vertx",
"artifactId": "vertx-mail-client"},
{
"name": "Vert.x STOMP",
"labels": [
"stomp",
"groupId": "io.vertx",
"artifactId": "vertx-stomp"},
{
"name": "Vert.x EventBus Bridge using TCP",
"labels": [
"tcp-bridge",
"groupId": "io.vertx",
"artifactId": "vertx-tcp-eventbus-bridge"},
{
"name": "Vert.x - Apache Camel bridge",
"labels": [
"camel",
"groupId": "io.vertx",
"artifactId": "vertx-camel-bridge"},
{
"name": "Vert.x Bridge with AMQP",
"labels": [
"amqp",
"groupId": "io.vertx",
"artifactId": "vertx-amqp-bridge"},
{
"name": "Vert.x Client for RabbitMQ",
"labels": [
"rabbitmq",
"groupId": "io.vertx",
"artifactId": "vertx-rabbitmq-client"},
{
"name": "Vert.x Authentication Support using JDBC",
"labels": [
"jdbc-auth",
"groupId": "io.vertx",
"artifactId": "vertx-auth-jdbc"},
{
"name": "Vert.x Authentication Support using JWT",
"labels": [
"jwt-auth",
"groupId": "io.vertx",
"artifactId": "vertx-auth-jwt"},
{
"name": "Vert.x Authentication Support using Mongo",
"labels": [
"mongo-auth",
"groupId": "io.vertx",
"artifactId": "vertx-auth-mongo"},
{
"name": "Vert.x Authentication Support using Shiro",
"labels": [
"shiro-auth",
"groupId": "io.vertx",
"artifactId": "vertx-auth-shiro"},
{
"name": "Vert.x Authentication Support using OAuth 2",
"labels": [
"oauth2",
"oauth2-auth",
"oauth",
"groupId": "io.vertx",
"artifactId": "vertx-auth-oauth2"},
{
"name": "Vert.x support for RX Java",
"labels": [
"rx",
"rxjava",
"groupId": "io.vertx",
"artifactId": "vertx-rx-java"},
{
"name": "Vert.x support for JavaScript (Nashorn)",
"labels": [
"js",
"javascript",
"groupId": "io.vertx",
"artifactId": "vertx-lang-js"},
{
"name": "Vert.x support for Kotlin",
"labels": [
"kotlin",
"vertx-kotlin",
"groupId": "io.vertx",
"artifactId": "vertx-lang-kotlin-compiler"},
{
"name": "Vert.x support for Ruby (JRuby)",
"labels": [
"rb",
"ruby",
"jruby",
"groupId": "io.vertx",
"artifactId": "vertx-lang-ruby"},
{
"name": "Vert.x support for Apache Groovy",
"labels": [
"groovy",
"groupId": "io.vertx",
"artifactId": "vertx-lang-groovy"},
{
"name": "Vert.x Service Discovery",
"labels": [
"discovery",
"service-discovery",
"groupId": "io.vertx",
"artifactId": "vertx-service-discovery"},
{
"name": "Vert.x Circuit Breaker",
"labels": [
"circuit-breaker",
"circuit",
"groupId": "io.vertx",
"artifactId": "vertx-circuit-breaker"},
{
"name": "Vert.x Service Discovery for Kubernetes",
"labels": [
"discovery-kubernetes",
"service-discovery-kubernetes",
"groupId": "io.vertx",
"artifactId": "vertx-service-discovery-bridge-kubernetes"},
{
"name": "Vert.x Service Discovery for Consul",
"labels": [
"discovery-consul",
"service-discovery-consul",
"groupId": "io.vertx",
"artifactId": "vertx-service-discovery-bridge-consul"},
{
"name": "Vert.x Metrics using Dropwizard",
"labels": [
"jmx",
"dropwizard",
"groupId": "io.vertx",
"artifactId": "vertx-dropwizard-metrics"},
{
"name": "Vert.x Metrics using Hawkular",
"labels": [
"hawkular",
"groupId": "io.vertx",
"artifactId": "vertx-hawkular-metrics"},
{
"name": "Vert.x Shell",
"labels": [
"shell",
"groupId": "io.vertx",
"artifactId": "vertx-shell"},
{
"name": "Vert.x Unit",
"labels": [
"test",
"groupId": "io.vertx",
"artifactId": "vertx-unit",
"scope": "test"},
{
"name": "Vert.x Cluster Manager based on Hazelcast",
"labels": [
"hazelcast",
"hazelcast-cluster-manager",
"groupId": "io.vertx",
"artifactId": "vertx-hazelcast"},
{
"name": "Vert.x Cluster Manager based on Infinipan",
"labels": [
"infinispan",
"infinispan-cluster-manager",
"groupId": "io.vertx",
"artifactId": "vertx-infinispan"},
{
"name": "Vert.x Cluster Manager based on Zookeeper",
"labels": [
"zookeeper-cluster-manager",
"groupId": "io.vertx",
"artifactId": "vertx-zookeeper"},
{
"name": "Vert.x Cluster Manager based on Apache Ignite",
"labels": [
"ignite",
"groupId": "io.vertx",
"artifactId": "vertx-ignite"},
{
"name": "Vert.x Cluster Manager based on Apache Zookeeper",
"labels": [
"zookeeper",
"groupId": "io.vertx",
"artifactId": "vertx-zookeeper"},
{
"name": "Vert.x Web Template Engine based on Pebble",
"labels": [
"pebble",
"pebble-template",
"pebble-template-engine",
"groupId": "io.vertx",
"artifactId": "vertx-web-templ-pebble",
"classifier": "shaded"},
{
"name": "Vert.x Web Template Engine based on Apache Freemarker",
"labels": [
"freemarker",
"freemarker-template",
"freemarker-template-engine",
"groupId": "io.vertx",
"artifactId": "vertx-web-templ-freemarker",
"classifier": "shaded"},
{
"name": "Vert.x Web Template Engine based on Thymeleaf",
"labels": [
"thymeleaf",
"thymeleaf-template",
"thymeleaf-template-engine",
"groupId": "io.vertx",
"artifactId": "vertx-web-templ-thymeleaf",
"classifier": "shaded"},
{
"name": "Vert.x Web Template Engine based on Handlebars",
"labels": [
"handlebars",
"handlebars-template",
"handlebars-template-engine",
"groupId": "io.vertx",
"artifactId": "vertx-web-templ-handlebars",
"classifier": "shaded"},
{
"name": "Vert.x Web Template Engine based on Jade",
"labels": [
"jade",
"jade-template",
"jade-template-engine",
"groupId": "io.vertx",
"artifactId": "vertx-web-templ-jade",
"classifier": "shaded"},
{
"name": "Vert.x Web Template Engine based on MVEL",
"labels": [
"mvel",
"mvel-template",
"mvel-template-engine",
"groupId": "io.vertx",
"artifactId": "vertx-web-templ-mvel",
"classifier": "shaded"},
{
"name": "Vert.x (async) RPC service proxies",
"labels": [
"service-proxies",
"rpc-services",
"groupId": "io.vertx",
"artifactId": "vertx-service-proxy"},
{
"name": "Vert.x Service Factory using Apache Maven",
"labels": [
"maven-service-factory",
"groupId": "io.vertx",
"artifactId": "vertx-maven-service-factory"},
{
"name": "Vert.x Service Factory",
"labels": [
"service-factory",
"groupId": "io.vertx",
"artifactId": "vertx-service-factory"},
{
"name": "Vert.x Service Factory using HTTP",
"labels": [
"http-service-factory",
"groupId": "io.vertx",
"artifactId": "vertx-http-service-factory"},
{
"name": "Vert.x Configuration",
"labels": [
"config",
"groupId": "io.vertx",
"artifactId": "vertx-config"},
{
"name": "Vert.x Configuration with Kubernetes ConfigMap",
"labels": [
"config-kubernetes",
"config-config-map",
"config-configmap",
"groupId": "io.vertx",
"artifactId": "vertx-config-kubernetes-configmap"},
{
"name": "Vert.x Configuration with a Git repository",
"labels": [
"config-git",
"groupId": "io.vertx",
"artifactId": "vertx-config-git"},
{
"name": "Vert.x Configuration - HOCON format",
"labels": [
"config-hocon",
"groupId": "io.vertx",
"artifactId": "vertx-config-hocon"},
{
"name": "Vert.x Configuration - Yaml format",
"labels": [
"config-yaml",
"groupId": "io.vertx",
"artifactId": "vertx-config-yaml"},
{
"name": "Vert.x Configuration with a Zookeeper backend",
"labels": [
"config-zookeeper",
"groupId": "io.vertx",
"artifactId": "vertx-config-zookeeper"},
{
"name": "Vert.x Configuration with a Redis backend",
"labels": [
"config-redis",
"groupId": "io.vertx",
"artifactId": "vertx-config-redis"}
]

打包项目

集成了 vert.x 插件后,打包变的极其容易,只需要下面的命令:

mvn clean package

通过这种方式就会打出一个 fat jar 包,可以直接通过 ​​java -jar xxxx.jar​​ 运行的包。

其他命令

除了上面这些,还有 ​​vertx:run, vertx:debug, vertx:start, vertx:stop​​命令,这些命令可以在不打 jar 包的情况下运行或者关闭项目。

常见问题

通过插件方式运行时,你经常会遇到下面的问题:

[INFO] 严重: java.net.BindException: Address already in

这种情况是因为使用类似 IDEA Maven 插件中的命令直接双击运行时,你无法关闭这个应用。如果你使用的纯命令行,直接 ​​Ctrl+C​​ 就能关闭。

使用 ​​vertx:run​​​ 在命令行运行时可以直接关闭。
使用 ​​​vertx:start​​​ 运行时,需要通过 ​​vertx:stop​​ 关闭。

万一遇上无法关闭的情况,在 windows 中,可以用下面方式解决。

在命令行中,输入下面的命令:

jps -m

这个命令会列出所有运行的 jvm:

15248 Jps -m
2384 Launcher run io.vertx.sample.MyFirstVerticle redeploy-termination-period=1000 -Dvertx.id=5fd656fa-55a9-46b4-8d23-caa95f2e5032-redeploy
8208
11844 Launcher run io.vertx.sample.MyFirstVerticle redeploy-termination-period=1000 -Dvertx.id=bec46d01-d441-4949-a2d9-f8ffbe85f965-redeploy
14200 Launcher run io.vertx.sample.MyFirstVerticle --redeploy=F:\Git\my-first-vertx-app\target\classes/**/* --redeploy-scan-period=1000 redeploy-termi
nation-period=1000 --launcher-class=io.vertx.core.Launcher
7580

根据后面的信息找到你想关闭的 jvm。输入下面的命令(假设关闭 2384):

taskkill /f /pid 2384

当相同端口的 jvm 关闭后,你就可以再次运行了。