一步步搭建采用Gradle来运行VertX应用的生产环境

2019-08-23 10:36:04 浏览数 (1)

1.搭建Maven私服

  1. 创建/opt/nexus/目录做为nexus的根目录,把nexus-2.14.5-02-bundle.tar.gz解压到此目录中
  2. 修改/opt/nexus/nexus-2.14.5-02/conf/nexus.properties文件,把application-port设置成合适的端口
  3. 修改/opt/nexus/nexus-2.14.5-02/bin/jsw/conf/wrapper.conf文件,配置合适的JVM参数.

3.1在文件的最开始添加

代码语言:javascript复制
#@wjw_add
wrapper.ignore_sequence_gaps=TRUE 

3.2添加JVM参数

代码语言:javascript复制
#->@wjw_add
wrapper.java.additional.11=-Djava.net.preferIPv4Stack=true
wrapper.java.additional.12=-Dcom.sun.jndi.ldap.connect.pool.protocol="plain ssl"
wrapper.java.additional.13=-server
wrapper.java.additional.14=-Xms1g
wrapper.java.additional.15=-Xmx8g
wrapper.java.additional.16=-XX:ReservedCodeCacheSize=96m
#<-@wjw_add

3.3注释掉

代码语言:javascript复制
#@wjw_note wrapper.java.initmemory=256

#@wjw_note wrapper.java.maxmemory=768
  1. 如果需要以root启动,修改/opt/nexus/nexus-2.14.5-02/bin/nexus文件,去掉RUN_AS_USER的注释,改成RUN_AS_USER=root
  2. 启动nexus,/opt/nexus/nexus-2.14.5-02/bin/nexus start

2. 配置Gradle环境

Linux:

  1. 创建/opt/GRADLE_USER_HOME目录
  2. 修改/etc/profile,在最后添加export > GRADLE_USER_HOME=/opt/GRADLE_USER_HOME
  3. 执行source /etc/profile,是配置环境生效

Windows:

打开系统属性->环境变量->添加用户变量

代码语言:javascript复制
变量名: GRADLE_USER_HOME
变量值: z:GRADLE_USER_HOME

3. 让Gradle Wrapper引用本地的发布包

Gradle Wrapper 免去了用户在使用 Gradle 进行项目构建时需要安装 Gradle 的繁琐步骤. 每个 Gradle Wrapper 都绑定到一个特定版本的 Gradle,所以当你第一次在给定 Gradle 版本下运行上面的命令之一时,它将下载相应的 Gradle 发布包,并使用它来执行构建.默认,Gradle Wrapper 的发布包是指向的官网的 Web 服务地址,有时候,下载这个发布包比较慢甚至不成功,本文演示了加速下载发布包的方式.

Gradle Wrapper 的配置在gradle/wrapper/gradle-wrapper.properties, 其默认的配置如下:

代码语言:javascript复制
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-4.10-bin.zip

其中,distributionUrl 指 明了 Gradle Wrapper 下载 Gradle 发布包的位置.如果遇到下载这个发布包比较慢甚至不成功的时候,可以将该地址引到本地的文件,比如:

代码语言:javascript复制
#distributionUrl=https://services.gradle.org/distributions/gradle-4.10-bin.zip
distributionUrl=file:/D:/software/webdev/java/gradle-4.10-all.zip

这样构建的速度将会非常快了.当然,前提是,要实现准本好发布包放到本地.

4. Vert.Xbuild.gradle文件模版

代码语言:javascript复制
buildscript {
    repositories {
      mavenLocal()
      maven{ url "http://SVN:8081/nexus/content/groups/public"}
      mavenCentral()
      jcenter()         
    }
}

apply plugin: 'java'
apply plugin: 'groovy'  //@wjw_note(for groovy)
apply plugin: 'eclipse'
apply plugin: 'application'

group = 'name.quanke.study.vertx.two'
version = '1.0-SNAPSHOT'

description = """我的第一个Vert.x 3 应用"""

sourceCompatibility = 1.8
targetCompatibility = 1.8
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

//@wjw_note(for groovy): 采用Java   Groovy的方式,两者分工也很明确:前者用于数据处理,后者则用于DSL和数据类。
//@wjw_note(for groovy): 此时,由于混用了两者,并且可能会出现Groovy与Java互用类的情况,那么就要用到joint compile。在build.gradle中需要配置如下:
sourceSets.main.java.srcDirs = []
sourceSets.main.groovy.srcDirs  = ["src/main/java"]
[compileGroovy]*.options*.encoding = 'UTF-8'

repositories {
    mavenLocal()
    maven{ url "http://SVN:8081/nexus/content/groups/public"}
    mavenCentral()
    jcenter()         
}

def vertxVersion = '3.5.3'
dependencies {
    compile "io.vertx:vertx-core:${vertxVersion}"
    compile "io.vertx:vertx-lang-groovy:${vertxVersion}"       //@wjw_note(for groovy)

 	  compile "org.codehaus.groovy:groovy-all:2.4.10"  //@wjw_note(for groovy)
    
	  compile 'org.slf4j:slf4j-log4j12:1.7.25'
	
    testCompile group: 'junit', name: 'junit', version:'4.12'
    testCompile group: 'io.vertx', name: 'vertx-unit', version:'${vertxVersion}'
}

mainClassName = 'name.quanke.study.vertx.two.Launcher'
def mainVerticleName = 'name.quanke.study.vertx.two.MyMainVerticle'

// Vert.x watches for file changes in all subdirectories
// of src/ but only for files with .java extension
def watchForChange = 'src/**/*'

// Vert.x will call this task on changes
def doOnChange = ".${File.separator}gradlew classes" 

/* @wjw_note gradle版本要>=4.9!
gradle run
*/
run {
  //@wjw_note设置 applicationDefaultJvmArgs 参数
  if(System.getProperty('os.name').toUpperCase().startsWith("WINDOWS")) {
    applicationDefaultJvmArgs = ["-Dfile.encoding=GBK","-Duser.timezone=GMT 8","-Duser.language=zh","-Duser.country=CN","-Djava.net.preferIPv4Stack=true"]
  } else {
    applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8","-Duser.timezone=GMT 8","-Duser.language=zh","-Duser.country=CN","-Djava.net.preferIPv4Stack=true"]
  }
  println "applicationDefaultJvmArgs=${applicationDefaultJvmArgs}"

  doFirst {
     //@wjw_note需要与终端交互的必须设置
     setStandardInput System.in
     setStandardOutput System.out
     setErrorOutput System.err
   
     //@wjw_note debug开关
     if (System.getProperty('DEBUG', 'false') == 'true') {
       applicationDefaultJvmArgs  = ['-Xdebug', '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=localhost:9099']
     }    
     
     //@wjw_note 添加接受JVM命令行参数,例如:-PjvmArgs="-Xms211m -XX:MaxPermSize=211m"	
     if ( project.hasProperty('jvmArgs') ) {
   		 applicationDefaultJvmArgs  = (project.jvmArgs.split("\s ") as List)
   	 } else {  
       applicationDefaultJvmArgs  = ["-Xms200m","-XX:MaxPermSize=200m"]
     }
   
     //@wjw_note debug开关
     if (System.getProperty('START', 'false') == 'true') {
       def javaOpts=""
       applicationDefaultJvmArgs.each { item ->
         javaOpts=javaOpts item " "
       }
       args = ["start", mainVerticleName, "--vertx-id=${mainVerticleName}", "--java-opts=${javaOpts}"]   //@wjw_note: 后台启动vertx,可以用: vertx stop ${mainVerticleName} 来停止
     } else {
       args = ["run", mainVerticleName]
       //args = ["run", mainVerticleName, "--launcher-class=${mainClassName}", "--redeploy=${watchForChange}", "--on-redeploy=${doOnChange}"]  //@wjw_note Enable automatic redeployment
     }
       
     println "args=${args}"
  }
}

task createWrapper(type: Wrapper) {
  gradleVersion = '4.10'
}

5. 自己定制project.name

在项目目录下创建settings.gradle,文件类容是

代码语言:javascript复制
rootProject.name = 'my-vertx-two-app'
if (!JavaVersion.current().java8Compatible) {
  throw new IllegalStateException('''A Haiku:
                                    |  This needs Java 8,
                                    |  You are using something else,
                                    |  Refresh. Try again.'''.stripMargin())
} 

6. Git的.gitignore文件模版

在项目目录下创建.gitignore,文件类容是

代码语言:javascript复制
.gradle
/build/
/bin/
/classes/
/config-repo/
!gradle/wrapper/gradle-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/

7. 创建启动Verticlename.quanke.study.vertx.two.MyMainVerticle

代码语言:javascript复制
package name.quanke.study.vertx.two;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.AsyncResult;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Future;

public class MyMainVerticle extends AbstractVerticle {

  //@wjw_note: 至于deployVerticle(),它 可以接受字符串和类实例。当使用字符串时,若是非Java类,如Groovy,需要采用这样的格式:"语言前缀:类全限定名"。如:  
  @Override
  public void start(Future<Void> fut) {
    vertx.deployVerticle(MyTwoVerticle.class, new DeploymentOptions(),(AsyncResult<String> e) -> {
      if(e.succeeded()) {
        System.out.println("部署Verticle成功: " e.result());
      } else {
        System.out.println("部署Verticle失败:" e.cause().getMessage());
      }
    });
    
    //@wjw_note: 部署Verticle的几种方式
    //vertx.deployVerticle(MyGroovyVerticle.class, new DeploymentOptions(),(AsyncResult<String> e) -> {
    //vertx.deployVerticle(new MyGroovyVerticle(), (AsyncResult<String> e) -> {
    vertx.deployVerticle("name.quanke.study.vertx.two.MyGroovyVerticle", (AsyncResult<String> e) -> {
      if(e.succeeded()) {
        System.out.println("部署Verticle成功: " e.result());
      } else {
        System.out.println("部署Verticle失败:" e.cause().getMessage());
      }
    });
  }
}

8. 创建业务处理Verticlename.quanke.study.vertx.two.MyTwoVerticle

代码语言:javascript复制
package name.quanke.study.vertx.two;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;

public class MyTwoVerticle extends AbstractVerticle {

  @Override
  public void start(Future<Void> fut) {
    vertx
        .createHttpServer()
        .requestHandler(r -> {
          r.response().putHeader("content-type", "text/plain; charset=utf-8");
          r.response().end("Hello from my two "  
              "Vert.x 3 application(应用)--" System.currentTimeMillis());
        })
        .listen(8080, result -> {
          if (result.succeeded()) {
            fut.complete();
          } else {
            fut.fail(result.cause());
          }
        });
  }
}

9. 用gradlew来运行Vert.X

  • 前台运行:gradlew run
  • 后台运行:gradlew run -DSTART=true
  • 调试运行:gradlew run -DDEBUG=true

0 人点赞