从去年开始,构建工具就从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
$ docker/build.sh
运行以上命令之后,会生成一个docker镜像,直接通过docker run命令运行即可,如:
$ docker run -it
$ docker run -d
当然,假如你搭建了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,打造一个前后端分离的应用。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
### 基于Linux下的Jenkins + Gradle + GitLab + Android Studio实现APP自动打包的知识点详解 #### 一、Jenkins安装与部署 **1.1 Jenkins简介** - **定义**: Jenkins 是一个开源软件项目,是持续集成(CI)和持续...
5. **Maven或Gradle**:作为构建工具,负责项目的依赖管理和编译打包。 6. **MySQL数据库**:通常作为后端存储,保存博客文章、用户信息等数据。 7. **Swagger**:可能用于构建API文档,方便接口的测试和调试。 8. *...
Tomcat或Jetty可能作为JAVA应用服务器,Nginx或Apache可作为反向代理和负载均衡器,而Docker和Kubernetes可能用于容器化部署和集群管理。 综上所述,"JAVA+SQL办公自动化系统"是一个综合性的IT项目,涵盖了软件开发...
【描述】:“java+java+java+java+java+java+java+java+java+java+java+java”重复了十二次“java”,这可能是在强调该系统完全基于Java技术栈构建。Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能、...
此外,它还便于自动化部署,如通过Docker容器化和持续集成/持续部署(CI/CD)流程。 总结,"嵌入jetty的springMVC可运行jar的REST+"是一个使用Jetty作为服务器,Spring MVC作为MVC框架,提供RESTful服务的Java Web...
示例servlet Java Web应用程序的简单示例,其中包含在Jetty中启动的gradle构建。 也是一个docker文件,用于使用Jetty中部署的代码构建容器。
4. **Java工具**:除了Eclipse,还有Maven、Gradle等构建工具,它们帮助管理项目依赖并自动化构建流程。此外,JUnit用于单元测试,IntelliJ IDEA是另一个广泛使用的IDE,提供与Eclipse不同的开发体验。 5. **Java...
- **Maven**或Gradle构建工具,自动化构建、依赖管理和打包过程。 - **IntelliJ IDEA**或Eclipse等IDE,提升开发效率。 这个项目为初学者提供了一个全面了解Web开发流程的机会,从需求分析、设计、编码到测试、...
11. **部署和运维**:了解如何将项目部署到Tomcat、Jetty等应用服务器,以及使用Docker进行容器化部署,是实际开发过程中必不可少的技能。 通过研究天下陶网络商城的源码和资料,不仅可以掌握上述技术,还能学习到...
7. **构建工具**:Maven或Gradle用于项目的构建和依赖管理,它们能自动化构建过程,如编译、测试、打包等。 8. **容器技术**:Tomcat、Jetty等应用服务器部署Java Web应用,Docker则提供了容器化部署环境,便于应用...
【Java+SSM+VueOA系统毕业设计与实现】是一个典型的Web应用开发项目,它结合了Java后端技术栈SSM(Spring、SpringMVC、MyBatis)和前端现代化框架Vue.js,构建了一个办公自动化(Office Automation, OA)系统。...
使用Jenkins、Travis CI或GitLab CI/CD等工具,可以实现Java项目的自动化编译、测试和部署,确保代码质量并减少错误。 7. **微服务架构**:现代Java应用常常采用微服务架构,每个服务都是独立的,可以单独部署。...
13. **Docker化部署**:Spring Boot 应用可以很自然地被打包为可执行的jar,配合Docker,可以实现轻量级的容器化部署。 14. **云原生支持**:Spring Boot 对Kubernetes、Cloud Foundry等云平台有很好的支持,能够...
9. **部署**:项目部署可能涉及Docker容器化,或者使用云服务如AWS、阿里云等进行部署,以实现快速、可扩展的部署方案。 这个项目为学习者提供了一个完整的、实战性的Java Web开发案例,通过研究源码,可以深入理解...
10. **Tomcat与Jetty服务器**:作为常用的Java Web容器,Tomcat和Jetty会被介绍如何部署和管理Web应用。 11. **单元测试与集成测试**:JUnit和Mockito是进行Java测试的工具,而Selenium则用于Web应用的端到端测试。...
10. **容器与服务器**:Tomcat、Jetty等应用服务器,Docker容器化技术。 11. **RESTful API设计**:HTTP状态码,URI设计,JSON格式,幂等性。 12. **性能优化**:JVM调优,代码优化,数据库优化。 13. **安全性**...
10. **持续集成与部署**:如使用Maven或Gradle进行项目构建,Jenkins实现自动化测试和部署,Docker容器化部署等。 《Java Web整合开发进阶100例》这本书将这些知识点融入具体的实例中,通过实战演练帮助读者巩固...
4. **Maven或Gradle构建工具**:Java工程的构建过程可以由Maven或Gradle管理。它们负责依赖管理、编译、测试、打包等任务,并生成可执行的JAR或WAR文件。 5. **包(Package)管理**:在Java中,包是组织类的一种...
Gradle则是一个更现代的构建自动化工具,提供了一种基于Groovy的领域特定语言,让构建脚本更加灵活。 对于测试,JUnit是Java最常用的单元测试框架,而Selenium和Appium则支持Web和移动应用的自动化测试。持续集成/...
- **Maven和Gradle**:构建工具,自动化构建、依赖管理和发布过程。 - **Jenkins**:持续集成/持续部署(CI/CD)工具,文档会展示如何配置和使用。 7. **设计模式和最佳实践** - 这部分可能包含GOF设计模式的解释...