前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一步步搭建采用Gradle来运行VertX应用的生产环境

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

作者头像
白石
发布2019-08-23 10:36:04
1.1K0
发布2019-08-23 10:36:04
举报
文章被收录于专栏:白石白石

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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.搭建Maven私服
  • 2. 配置Gradle环境
  • 3. 让Gradle Wrapper引用本地的发布包
  • 4. Vert.Xbuild.gradle文件模版
  • 5. 自己定制project.name
  • 6. Git的.gitignore文件模版
  • 7. 创建启动Verticlename.quanke.study.vertx.two.MyMainVerticle
  • 8. 创建业务处理Verticlename.quanke.study.vertx.two.MyTwoVerticle
  • 9. 用gradlew来运行Vert.X
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档