文档章节

gradle + Jetty + docker 实现Java自动化打包

-外星人-
 -外星人-
发布于 2016/12/09 00:45
字数 1107
阅读 154
收藏 3
点赞 0
评论 0

从去年开始,构建工具就从maven转向gradle了,servlet容器也从tomcat转向了jetty,直接使用内嵌的方式运行,然后用gradle打包成应用程序,直接启动bin目录下的运行文件即可运行,简单快捷。

首先说明一点,就是这种方式只适用于纯api项目,也就是无jsp,不然打包成jar会有问题。

项目框架 spring mvc + mybatis,数据库用mysql + redis,spring mvc 跟 mybatis 配置我就不多说了,主要介绍一下jetty的吧。

import com.alibaba.druid.support.http.WebStatFilter;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import java.util.Date;

public class AppServer {

    public static void main(String[] args) throws Exception {
        long startTime = System.currentTimeMillis();
        System.out.printf("USE SYSTEM %s %s %s \n", System.getProperty("os.name"), System.getProperty("os.arch"), System.getProperty("os.version"));
        System.out.printf("USE JDK %s %s \n", System.getProperty("java.version"), System.getProperty("java.vm.specification.name"));
        int port = 8080;

        if (args.length > 0) {
            port = Integer.valueOf(args[0]);
        }

        ServletContextHandler servletContext = new ServletContextHandler();
        servletContext.setContextPath("/");

        Server server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(port);
        server.setConnectors(new Connector[] { connector });
        HandlerCollection handlerCollection = new HandlerCollection();
        ServletContextHandler springMvcHandler = new ServletContextHandler();
        springMvcHandler.setContextPath("/");
        XmlWebApplicationContext context = new XmlWebApplicationContext();
        context.setConfigLocations(new String[]{"classpath:applicationContext.xml", "classpath:dispatcher-servlet.xml"});
        springMvcHandler.addEventListener(new ContextLoaderListener(context));

        springMvcHandler.addServlet(new ServletHolder("consult", ServletHandler.Default404Servlet.class), "/static");
        springMvcHandler.addServlet(new ServletHolder("druid", com.alibaba.druid.support.http.StatViewServlet.class), "/druid/*");
        springMvcHandler.addServlet(new ServletHolder("mvc", new DispatcherServlet(context)), "/*");
        // WEB监控
        FilterHolder webStatFilter = new FilterHolder(new WebStatFilter());
        webStatFilter.setInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        springMvcHandler.addFilter(webStatFilter, "/*", null);
        handlerCollection.setHandlers(new Handler[]{springMvcHandler});
        server.setHandler(handlerCollection);
        server.start();
        System.out.printf("Server started take %d ms, open your in browser http://localhost:%d/\n", (System.currentTimeMillis() - startTime), port);
        System.out.println("Start Time " + new Date());
        server.join();

    }

}

其实很简单,就是初始化spring容器,然后构建一个jetty 的 Server ,通过代码的形式把spring mvc的servlet配置好,因为我用的数据库驱动是durid,所以顺便配置了一个durid自带的监控servlet,可以看到SQL执行情况,还可以监控WEB的一些性能指标,然后直接启动就可以了

gradle 的配置

group 'com.xxxx'

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'main.AppServer'

sourceCompatibility = 1.8

repositories {
    jcenter()
}

dependencies {
    compile project(":core")
    compile "org.springframework:spring-web:$springVersion"
    compile "org.springframework:spring-webmvc:$springVersion"
    compile "org.eclipse.jetty:jetty-webapp:$jettyVersion"
    compile 'com.graphql-java:graphql-java:2.1.0'
    compile "commons-fileupload:commons-fileupload:1.3.1"
}
def env = System.getProperty("env") ?: "dev"
def res = env == "dev" ? "resources" : "profile/$env";
sourceSets {
    main {
        resources {
            srcDirs = ["src/main/resources", "src/main/$res"]
        }
    }
}
println "package $env version";
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

我的gradle项目是多模块项目,这里的配置是web相关的配置,core是核心逻辑,通过一个环境变量env打包不同环境的程序 目录结构如下:

project
	- docker
		- build.sh
		- Dockerfile
	- core
		- src/main
			- resources
			- profile
				- test
				- production
		- build.gradle
	- web
	    - src/main
		    - java
		    - resources
		- build.gradle
	- gradle.gradle
	- settings.gradle
	- package.sh
```	
打包命令:

$ package.sh # JAVA打包 $ docker/build.sh # docker打包

运行以上命令之后,会生成一个docker镜像,直接通过docker run命令运行即可,如:

$ docker run -it --rm -p 8080:8080 Image镜像 # Ctrl + C 之后会关掉容器,并自动删除容器,可看容器日志,测试阶段可以这么运行 $ docker run -d --name -p 8080:8080 Image镜像 # 后台运行容器,关掉终端,也不会停止

当然,假如你搭建了docker私有仓库的话,还可以push到仓库中,然后在其他机器直接run就会自动下下来了,主要要加完整的路径,如:https://0.0.0.1/Image镜像 ,否则默认会到Docker中心仓库下载,不想吐槽。如果你的容器是无状态的话,还可以通过 docker swarm 部署一个集群,自动负载多个docker容器,可平滑升级,但是在Aliyun跨主机,哎。。。只能直接来。

build.sh

#!/bin/bash echo $0 basepath=$(cd dirname $0; pwd) cp $basepath/../web/build/distributions/web.tar $basepath/web.tar tag="$1" if [ "$tag" = "" ]; then tag="latest" fi host="" image="api:$tag" sudo docker build -t $host$image $basepath


没什么技术含量,就是把手敲的代码写到一个脚本里面

Dockerfile

FROM anapsix/alpine-java:jre8 ADD web.tar / ENV JAVA_OPTS='-server -Duser.timezone=Asia/Shanghai' EXPOSE 8080 ENTRYPOINT ["/web/bin/web"]

这里一定要加上-Duser.timezone=Asia/Shanghai,不然时区会不对,不是我大天朝的时间,打包完140M,我的程序不到20M,应该包含了一个jre,所以没办法,对java应用来说已经很小了。

package.sh

#!/bin/bash basepath=$(cd dirname $0; pwd) cd $basepath git pull gradle build -x test


总结一下,通过jetty可以很方便的进行java 纯api的项目开发,直接内嵌,部署简答,打包到docker之后,服务端部署就更简单了,不用装jdk,特别是需要配置多个实例的时候,直接通过docker swarm启动一个Service设置一下启动多少个实例就OK了,简单快捷

下次介绍一下怎么基于nginx + lua结合后端的jetty,打造一个前后端分离的应用。

© 著作权归作者所有

共有 人打赏支持
-外星人-
粉丝 45
博文 45
码字总数 22101
作品 0
深圳
程序员
gradle/Groovy语法

Groovy官网的介绍(http://www.groovy-lang.org/download.html#gvm) Gradle API 文档: https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html 深入理解Android(一)......

shareus ⋅ 04/27 ⋅ 0

跟我一起学docker(十)--jenkins的使用

什么是Jenkins? jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译、打包、分发部署。jenkins可以很好的支持各种语言(比如:java, c#, php...

IT人故事会 ⋅ 05/03 ⋅ 0

使用Docker运行Java应用程序

使用Docker运行Java应用程序 部署软件混乱; 需要克服许多问题才能生成顺畅且无痛的部署过程。诸如环境设置,依赖性地狱,编排管理以及系统可用性等问题是部署新应用程序时遇到的许多问题中的...

优惠券发放 ⋅ 05/30 ⋅ 0

gradle打包运行配置Main-Class

用gradle编译,打包了一个Java项目 如果打成的包不用gradle run命令运行,用Java命令运行,但是jar包中没有配置相关的Main-Class,怎样配置gradle才能让jar包中包含Main-Class?...

HaleyZhang ⋅ 05/24 ⋅ 0

Drools7.x环境搭建与简单示例

Drools是个规则引擎的开源实现。官方文档比较长。这里提供一个方法,搭建最基本的Drools运行环境,并提供一个简单示例。 环境准备: JDK 至少需要JDK 1.5以上,JDK去这里下载:http://www.or...

supergao222 ⋅ 01/10 ⋅ 0

用Java为Hyperledger Fabric(超级账本)开发区块链链代码智能合约之编写链代码程序

编写第一个 Java 链代码程序 在上一节中,您已经熟悉了如何构建、运行、部署和调用链代码,但尚未编写任何 Java 代码。 在本节中,将会使用 Eclipse IDE、一个用于 Eclipse 的 Gradle 插件,...

笔阁 ⋅ 05/24 ⋅ 0

JavaAgent-SandBox

1.前言 之前初步学习了javaAgent,并做了一份总结《JavaAgent学习笔记》。然后在看到《JVM-Sandbox 基于JVM的非侵入式运行期AOP解决方案》之后,接触到了集团的sandBox。并尝试使用这种有真正...

何度 ⋅ 05/09 ⋅ 0

Gradle学习(九)——构建环境

转载请注明出处:http://blog.csdn.net/lastsweetop/article/details/78914742 通过gradle.properties配置构建环境 为了更容易的配置用于构建的java进程,Gradle提供了几个选项。你可以在本地...

lastsweetop ⋅ 2017/12/27 ⋅ 0

Spring Boot 内嵌 Servlet 容器

Web容器名称 Servlet版本 Java版本 Tomcat 8 3.1 Java 7.0 + Tomcat 7 3.0 Java 6.0 + Jetty 9 3.1 Java 7.0 + Jetty 8 3.0 Java 6.0 + Undertow 1.1 3.1 Java 7.0 +...

WorriedFox ⋅ 05/02 ⋅ 0

加强Docker容器与Java 10集成

很多运行在Java虚拟机(JVM)中的应用,包括数据服务如Apache Spark和Kafka以及传统企业应用,都运行在容器中。最近,运行在容器里的JVM出现了由于内存和CPU资源限制和使用率导致性能损失问题...

java高级架构牛人 ⋅ 06/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 5分钟前 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 10分钟前 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 22分钟前 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 42分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 57分钟前 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部