使用 Vert.x Maven 插件快速创建项目

文档地址: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.3vertx.version>
  <vertx-maven-plugin.version>1.0.17vertx-maven-plugin.version>
properties>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.vertxgroupId>
      <artifactId>vertx-stack-depchainartifactId>
      <version>${vertx.version}version>
      <type>pomtype>
      <scope>importscope>
    dependency>
  dependencies>
dependencyManagement>

还有下面的插件:

<plugin>
  <groupId>io.reactiversegroupId>
  <artifactId>vertx-maven-pluginartifactId>
  <version>${vertx-maven-plugin.version}version>
  <executions>
    <execution>
      <id>vmpid>
      <goals>
        <goal>initializegoal>
        <goal>packagegoal>
      goals>
    execution>
  executions>
  <configuration>
    <redeploy>trueredeploy>
  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 use: bind

这种情况是因为使用类似 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 Launcher clean compile vertx:run

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

taskkill /f /pid 2384

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

你可能感兴趣的:(JAVA编程)