文档章节

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

白石
 白石
发布于 2018/09/27 11:11
字数 1349
阅读 119
收藏 0

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在文件的最开始添加

#@wjw_add
wrapper.ignore_sequence_gaps=TRUE 


3.2添加JVM参数

#->@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注释掉

#@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:

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

变量名: 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, 其默认的配置如下:

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 发布包的位置.如果遇到下载这个发布包比较慢甚至不成功的时候,可以将该地址引到本地的文件,比如:

#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文件模版

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,文件类容是

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,文件类容是

.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

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

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

© 著作权归作者所有

白石

白石

粉丝 67
博文 51
码字总数 102811
作品 1
海淀
程序员
私信 提问
构建 Docker 镜像,还属Gradle靠谱!

Docker, 是一个开源的, 基于 LXC 的轻量型容器管理器。 借助 Docker, 开发人员只需 将应用程序及所依赖的运行环境 打包到一个可移植的容器中, 就可以正常运行, 而不必考虑 语言、框架及...

IBMdW
2018/04/10
71
0
Jhipster创建一个应用

创建一个应用 快速开始 首先,创建你要存放应用的目录: 进入目录: 生成应用: 根据需求回答相应的问题,详细的问题在 下面部分 会提到. 当应用生成后,你可以通过 Maven ( on Linux/MacOS...

Feel_______
2016/08/01
715
0
一步步搭建采用Gradle来运行Spring Boot应用的生产环境

1.搭建Maven私服 创建目录做为nexus的根目录,把解压到此目录中 修改文件,把设置成合适的端口 修改文件,配置合适的JVM参数. 3.1在文件的最开始添加 3.2添加JVM参数 3.3注释掉 如果需要以root启...

白石
2017/11/02
224
0
在Windows上搭建PhoneGAP(crodova)的开发环境

PhoneGAP是一个可以将web应用打包成移动应用的开源框架,使用它可以迅速的将HTML、CSS和JavaScript开发的web应用打包成跨平台的移动应用程序,而Apache Cordova是PhoneGap贡献给Apache后的开...

宋国君
2017/10/30
0
0
一步步采用 Kubernetes

为什么选择 Docker 和 Kubernetes 呢? 容器允许我们构建、发布和运行分布式应用。它们使应用程序摆脱了机器限制,可以让我们以一定的方式创建一个复杂的应用程序。 使用容器编写应用程序可以...

作者: Santiago Arias
2018/01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用CSS自定义属性构建骨架屏

写在前面 几天前看到薄荷前端团队分享的《前端骨架屏方案小结》,突然回想起一年前看到的max bock写的《Building Skeleton Screens with CSS Custom Properties》,翻译整理写下出此文,分享...

前端老手
昨天
9
0
Docker常用命令小记

除了基本的<font color="blue">docker pull</font>、<font color="blue">docker image</font>、<font color="blue">docker ps</font>,还有一些命令及参数也很重要,在此记录下来避免遗忘。 ......

程序员欣宸
昨天
5
0
MAT使用-jvm内存溢出问题分析定位

1.MAT简介: MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,...

xiaomin0322
昨天
5
0
内网和外网之间的通信(端口映射原理)

首先解释一下“内网”与“外网”的概念: 内网:即所说的局域网,比如学校的局域网,局域网内每台计算机的IP地址在本局域网内具有互异性,是不可重复的。但两个局域网内的内网IP可以有相同的...

Jack088
昨天
6
0
3.深入jvm内核-原理、诊断与优化-4. GC算法和种类

一、GC算法和种类 GC的概念 GC算法 引用计数法 标记清除 标记压缩 复制算法 可触及性 Stop-The-World GC的对象是堆空间和永久区 引用计数法 老牌垃圾回收算法 通过引用计算来回收垃圾 使用者...

hexiaoming123
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部