Java Web项目是怎么跑起来的?

本文详细阐述了JavaWeb项目的构建过程,以Maven为例,介绍了clean、compile、package、install和deploy等常用命令。同时,解析了JavaWeb项目从git选择代码到部署到目标机器并启动的完整流程,涉及依赖管理、项目信息管理和自动化构建。最后,讨论了一键构建JavaWeb项目的服务实现步骤,强调了自动化和效率提升的重要性。
摘要由CSDN通过智能技术生成

良心公众号

关注不迷路

01

简单Java程序的启动过程

在之前的HelloWorld是怎么跑起来的?一文中,我们一起学习了IDE执行简单的Java程序的过程。可以总结为如下三个步骤:

  • 首先,将程序通过javac命令进行编译,得到.class文件。

  • 然后,idea通过java命令的-javaagent参数对将要运行的程序加以监控。

  • 之后,JVM执行.class文件

而在日常的工作中,我们面对的往往不是像HelloWorld这样简单的程序,更多的是诸如复杂的Java Web之类的项目,那么对于庞大的Java Web项目而言,它又是怎么跑起来的呢?当构建一个Java Web项目时,在程序的世界里,究竟发生了些什么?这篇文章让我们来一探究竟。

02

Maven相关知识综述

我们在上文中提到了一个词,叫“构建”。那么问题来了,何为构建?除了编写代码以外,我们日常工作中所做的编译运行单元测试生成文档打包部署等等这一系列的动作,就是构建。

对于同一个Java Web项目,选择不同的构建工具,其跑起来的细节会略有差异。比较常用的构建工具有较为古老的Ant,当下主流的Maven,以及新兴的Gradle等等……而本文将以当下最主流的Maven为例,讲述Java Web的构建过程。

虽然可能很多小伙伴对Maven已经非常熟悉,但在讲述具体的构建流程之前,我们还是先对Maven做一个总体的介绍,以统一一下对Maven的认识。

Maven主要有三个功能:项目构建依赖管理项目信息管理

  • 项目构建:Maven提供这样的功能,使得用户仅通过简单的命令,就能实现编译、运行单元测试、生成文档、打包和部署等流程的自动化。

  • 依赖管理:Maven提供了可能是世界上最全的免费中央仓库,帮助我们自动下载构件,并通过精心设计的groupId,artifactId和version组成的坐标帮助我们管理纷繁复杂的依赖。

  • 项目信息管理:Maven还能帮助我们管理原本分散在项目中各个角落的项目信息,包括项目描述开发者列表版本控制系统地址许可证缺陷管理系统地址等。

在了解了Maven的主要功能之后,我们回到本文的主题。我们会发现,依赖管理功能和项目信息管理功能发挥作用更多地是体现在我们的编码阶段,通过其提供的强大的依赖管理功能和便捷的项目信息管理功能,我们能够从繁杂的依赖管理中跳脱出来,从项目的细枝末节中抽身出来,集中精力在编码这件事情上,从而提高我们的工作效率。而项目构建的功能,则自然是在项目的构建过程中发挥作用,这也正是我们今天要关注的重点。

假设现在有一个已经开发完成的Java Web项目,我们使用Maven对其进行构建。常用的命令有如下几个:

// 删除target目录下的内容
mvn clean


// 编译main目录的源代码
mvn clean compile


// 编译main和test目录的源代码,并按照pom的定义打包
mvn clean package


// 编译main和test目录的源代码,按照pom的定义打包,并发布到本地仓库
mvn clean install


// 编译main和test目录的源代码,按照pom的定义打包,并发布到本地和远程仓库
mvn clean deploy

03

Java Web项目的启动过程

了解了上面这些命令的作用之后,我们再来详细看一下Java Web项目的启动过程。

我们梳理一下Java Web项目启动所需要的步骤,或者说,如果我们需要实现一个一键构建Java Web项目的服务(暂且称之为build service),我们应该怎么做?

  • 首先,我们需要选择Java Web项目所对应的git仓库,及需要发布的提交。因此,build service需要接入git。

  • 接下来,我们需要选择Java Web项目需要部署到的目标机器。因此,build service需要有一个接口可以获取当前可用的所有机器列表,当然,如果需要更细维度的选择,我们可以对不同集群的机器加以区分。

  • 我们在build service上选择了需要发布的提交,以及需要部署的目标机器之后,deploy service会拉取这个提交所对应的代码,然后需要执行mvn clean package操作进行编译打包,并将包传输至目标机器。

    这个地方可以共同约定,在项目中附加一个构建脚本,然后build service根据传输参数的不同,可以支持有选择的构建某个模块,或者根据集群不同执行不同的操作等等个性化的需求。

  • 到这时,一个可执行的包已经存在于目标机器上了,但是它还没有启动,一个最简单的办法就是登录这台机器,并手动启动即可。但这显然不符合自动化的要求,因此,我们依然可以通过共同约定,在项目中附加一个启动脚本,在build service将可执行的包传输至目标机器之后,再执行这个启动脚本,实现服务的启动。

上述四个步骤我们可以汇总成一张简单的图,如下所示:

以上就是一个Java Web项目启动的整体流程,当然,这里面并没有展开讲述一些之前已经提到过的细节,比如编译过程是由javac将程序编译成.class文件,然后启动的时候,是由JVM去执行这些.class文件等等。可以参考相关链接中历史文章的讲述。

04

相关链接

HelloWorld是怎么跑起来的?

每日一面——你对Class文件了解多少?

每日一面——谈谈你对类加载机制的理解

05

参考资料

《Maven实战》许晓斌著

今天关于Java Web项目是如何运行起来的总结就到这里了。

欢迎大家一起讨论技术,共同成长!


学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值