Start

Hello World

欢迎来到Vert.x的世界,相信您在接触Vert.x的同时,迫不及待想动手试一试,如您在学习计算机其它知识一样,总是从Hello World开始,下面我们将引导您制作一个最基本简单的Hello World例子,但在此之前,我们需要您具备有以下基础知识:

  1. Java基础知识,您不需要了解Java EE或者是Java ME的知识,但是需要您对Java有所了解,在此文档中,我们不会介绍任何关于Java SE又称Core Java的知识点。请注意:Vert.x 3以上版本需要Java 8以上版本方能运行;

  2. Maven相关知识,您需要知道什么Maven是做什么用的,以及如何使用Maven;

  3. 互联网的基础知识,知道什么是网络协议,尤其是TCP,HTTP协议。

本文将会建立一个基本的HTTP服务器,并监听8080端口,对于任何发往该服务器以及端口的请求,服务器会返回一个Hello World字符串。

首先新建一个Maven项目,一个基本的Maven项目目录结构如下所示:

  1. ├── pom.xml
  2. ├── src
  3. ├── main
  4. ├── java
  5. └── resources
  6. └── test
  7. └── java

随后在pom.xml中加入相关的依赖和插件,如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>io.example</groupId>
  7. <artifactId>vertx-example</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <vertx.version>3.4.2</vertx.version>
  11. <main.class>io.example.Main</main.class>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>io.vertx</groupId>
  16. <artifactId>vertx-core</artifactId>
  17. <version>${vertx.version}</version>
  18. </dependency>
  19. </dependencies>
  20. <build>
  21. <plugins>
  22. <plugin>
  23. <artifactId>maven-compiler-plugin</artifactId>
  24. <version>3.3</version>
  25. <configuration>
  26. <source>1.8</source>
  27. <target>1.8</target>
  28. </configuration>
  29. </plugin>
  30. <plugin>
  31. <groupId>org.apache.maven.plugins</groupId>
  32. <artifactId>maven-shade-plugin</artifactId>
  33. <version>2.4.2</version>
  34. <executions>
  35. <execution>
  36. <phase>package</phase>
  37. <goals>
  38. <goal>shade</goal>
  39. </goals>
  40. <configuration>
  41. <transformers>
  42. <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  43. <manifestEntries>
  44. <Main-Class>${main.class}</Main-Class>
  45. </manifestEntries>
  46. </transformer>
  47. </transformers>
  48. <artifactSet />
  49. <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-prod.jar</outputFile>
  50. </configuration>
  51. </execution>
  52. </executions>
  53. </plugin>
  54. </plugins>
  55. </build>
  56. </project>

跟其它Maven项目一样,我们首先定义了项目的GroupId,ArtifactId以及版本号,随后我们定义了两个属性,分别是:vertx.version,也就是Vert.x的版本号,此处我们使用最新的Vert.x版本,也就是3.4.2;以及main.class,也就是我们要使用的包含有main函数的主类。之后我们引入了两个Maven插件,分别是maven-compiler-pluginmaven-shade-plugin,前者用来将.java的源文件编译成.class的字节码文件,后者可将编译后的.class字节码文件打包成可执行的jar文件,俗称fat-jar

然后我们在src/main/java/io/example目录下新建两个java文件,分别是Main.javaMyFirstVerticle.java,代码如下:

Main.java

  1. package io.example;
  2. import io.vertx.core.Vertx;
  3. /**
  4. * Created by chengen on 26/04/2017.
  5. */
  6. public class Main {
  7. public static void main(String[] args){
  8. Vertx vertx = Vertx.vertx();
  9. vertx.deployVerticle(MyFirstVerticle.class.getName());
  10. }
  11. }

MyFirstVerticle.java

  1. package io.example;
  2. import io.vertx.core.AbstractVerticle;
  3. /**
  4. * Created by chengen on 26/04/2017.
  5. */
  6. public class MyFirstVerticle extends AbstractVerticle {
  7. public void start() {
  8. vertx.createHttpServer().requestHandler(req -> {
  9. req.response()
  10. .putHeader("content-type", "text/plain")
  11. .end("Hello World!");
  12. }).listen(8080);
  13. }
  14. }

然后用Maven的mvn package命令打包,随后在src的同级目录下会出现target目录,进入之后,会出现vert-example-1.0-SNAPSHOT.jarvert-example-1.0-SNAPSHOT-prod.jar两个jar文件,后者是可执行文件,在有图形界面的操作系统中,您可双击执行,或者用以下命令:java -jar vert-example-1.0-SNAPSHOT-prod.jar执行。

随后打开浏览器,在浏览器的地址栏中输入:http://localhost:8080/ 便可看到熟悉的Hello World!啦。

启动器

我们也可以使用Launcher来替代Main类,这也是官方推荐的方式,在pom.xml中加入main.verticle属性,并将该属性值设置为maven-shade-plugin插件的manifestEntriesMain-Verticle对应的值,最后修改main.classio.vertx.core.Launcher,修改后的pom.xml如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>io.example</groupId>
  7. <artifactId>vertx-example</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <vertx.version>3.4.2</vertx.version>
  11. <main.class>io.vertx.core.Launcher</main.class>
  12. <main.verticle>io.example.MainVerticle</main.verticle>
  13. </properties>
  14. <dependencies>
  15. <dependency>
  16. <groupId>io.vertx</groupId>
  17. <artifactId>vertx-core</artifactId>
  18. <version>${vertx.version}</version>
  19. </dependency>
  20. </dependencies>
  21. <build>
  22. <plugins>
  23. <plugin>
  24. <artifactId>maven-compiler-plugin</artifactId>
  25. <version>3.3</version>
  26. <configuration>
  27. <source>1.8</source>
  28. <target>1.8</target>
  29. </configuration>
  30. </plugin>
  31. <plugin>
  32. <groupId>org.apache.maven.plugins</groupId>
  33. <artifactId>maven-shade-plugin</artifactId>
  34. <version>2.4.2</version>
  35. <executions>
  36. <execution>
  37. <phase>package</phase>
  38. <goals>
  39. <goal>shade</goal>
  40. </goals>
  41. <configuration>
  42. <transformers>
  43. <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  44. <manifestEntries>
  45. <Main-Class>${main.class}</Main-Class>
  46. <Main-Verticle>${main.verticle}</Main-Verticle>
  47. </manifestEntries>
  48. </transformer>
  49. </transformers>
  50. <artifactSet />
  51. <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-prod.jar</outputFile>
  52. </configuration>
  53. </execution>
  54. </executions>
  55. </plugin>
  56. </plugins>
  57. </build>
  58. </project>

然后在src/main/java/io/example目录下新增MainVerticle.java文件,代码如下:

  1. package io.example;
  2. import io.vertx.core.AbstractVerticle;
  3. /**
  4. * Created by chengen on 26/04/2017.
  5. */
  6. public class MainVerticle extends AbstractVerticle {
  7. public void start() {
  8. vertx.deployVerticle(MyFirstVerticle.class.getName());
  9. }
  10. }

然后重新打包后执行,便可再次看到Hello World!。

请注意:重新打包之前,您可能需要清除之前编译后留下的文件,用mvn clean package命令打包。

测试

下面我们将会介绍测试部分,首先引入两个新的测试依赖,修改后的pom.xml如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>io.example</groupId>
  7. <artifactId>vertx-example</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <vertx.version>3.4.2</vertx.version>
  11. <main.class>io.vertx.core.Launcher</main.class>
  12. <main.verticle>io.example.MainVerticle</main.verticle>
  13. </properties>
  14. <dependencies>
  15. <dependency>
  16. <groupId>io.vertx</groupId>
  17. <artifactId>vertx-core</artifactId>
  18. <version>${vertx.version}</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>io.vertx</groupId>
  22. <artifactId>vertx-unit</artifactId>
  23. <version>${vertx.version}</version>
  24. <scope>test</scope>
  25. </dependency>
  26. <dependency>
  27. <groupId>junit</groupId>
  28. <artifactId>junit</artifactId>
  29. <version>4.12</version>
  30. <scope>test</scope>
  31. </dependency>
  32. </dependencies>
  33. <build>
  34. <plugins>
  35. <plugin>
  36. <artifactId>maven-compiler-plugin</artifactId>
  37. <version>3.3</version>
  38. <configuration>
  39. <source>1.8</source>
  40. <target>1.8</target>
  41. </configuration>
  42. </plugin>
  43. <plugin>
  44. <groupId>org.apache.maven.plugins</groupId>
  45. <artifactId>maven-shade-plugin</artifactId>
  46. <version>2.4.2</version>
  47. <executions>
  48. <execution>
  49. <phase>package</phase>
  50. <goals>
  51. <goal>shade</goal>
  52. </goals>
  53. <configuration>
  54. <transformers>
  55. <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  56. <manifestEntries>
  57. <Main-Class>${main.class}</Main-Class>
  58. <Main-Verticle>${main.verticle}</Main-Verticle>
  59. </manifestEntries>
  60. </transformer>
  61. <!--多语言支持在打包时需加入以下转换器-->
  62. <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  63. <resource>META-INF/services/io.vertx.core.spi.VerticleFactory</resource>
  64. </transformer>
  65. </transformers>
  66. <artifactSet />
  67. <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-prod.jar</outputFile>
  68. </configuration>
  69. </execution>
  70. </executions>
  71. </plugin>
  72. </plugins>
  73. </build>
  74. </project>

随后在src/test/java/io/example目录下新增MyFirstVerticleTest.java文件:

  1. package io.example;
  2. import io.vertx.core.Vertx;
  3. import io.vertx.ext.unit.Async;
  4. import io.vertx.ext.unit.TestContext;
  5. import io.vertx.ext.unit.junit.VertxUnitRunner;
  6. import org.junit.After;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9. import org.junit.runner.RunWith;
  10. /**
  11. * Created by chengen on 26/04/2017.
  12. */
  13. @RunWith(VertxUnitRunner.class)
  14. public class MyFirstVerticleTest {
  15. private Vertx vertx;
  16. @Before
  17. public void setUp(TestContext context) {
  18. vertx = Vertx.vertx();
  19. vertx.deployVerticle(MyFirstVerticle.class.getName(), context.asyncAssertSuccess());
  20. }
  21. @After
  22. public void tearDown(TestContext context) {
  23. vertx.close(context.asyncAssertSuccess());
  24. }
  25. @Test
  26. public void testApplication(TestContext context) {
  27. final Async async = context.async();
  28. vertx.createHttpClient().getNow(8080, "localhost", "/", response -> {
  29. response.handler(body -> {
  30. context.assertTrue(body.toString().contains("Hello"));
  31. async.complete();
  32. });
  33. });
  34. }
  35. }

执行该测试案例便可得到期望的结果,理解测试代码并不难,留给读者作为练习。

至此,大功告成,欢迎来到Vert.x的世界。