【java】Java项目从开发到部署生产完整流程梳理
文章目录
- 前言
- 一、开发环境
- 二、项目搭建
- 2.1 Maven创建项目
- 2.1.1 创建maven项目
- 2.1.2 引入依赖
- 2.1.3 maven常用命令
- 三、SpringBoot基础配置
- 四、项目打包
- 4.1 打包jar
- 4.2 打包war
- 4.2.1 修改项目打包为war包
- 4.2.2 排除内嵌的tomcat,引入外部tomcat
- 4.2.3 添加servlet-api依赖
- 4.2.4 修改app入口方法,继承SpringBootServletInitializer,记得重写configure方法
- 4.2.5 和打包jar包一样添加war包插件,其中warName就是项目启动后访问项目的contextPath,当然这时候可以去tomcat里配置无需contextPath。默认访问该项目
- 五、服务部署
- 5.1 winserver
- 5.2 centos
- 六、Nginx相关配置
- 6.1 端口转发
- 6.2 HTTPS
- 6.3 静态Web
- 6.4 静态资源访问
前言
从事Java开发许久,从最初学习的JDK环境变量开始,到如今开发部署发布,已经逐渐形成了自己的一套体系,当然,其中也不少学习了网上各种资料总结,接下来将在本文对Java项目开发到部署发布整个流程进行归纳梳理。
一、开发环境
关于开发环境,在之前写的一篇文章里有详细教学,因为是比较基础的部分,就不在这里过多赘述,如果各位看官需要翻阅可以点击下面链接跳转
Java开发环境搭建教程
二、项目搭建
环境配置好了,自然就是搭建项目框架,这里使用的是idea+maven方式,其他IDE大同小异
2.1 Maven创建项目
2.1.1 创建maven项目
首先file->new->project,注意图中红框的JDK版本
2.1.2 引入依赖
打开项目的pom.xml文件,在中配置每一个dependency,而springboot项目,需要添加父依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>***</version>
</parent><dependencies><dependency><groupId>***</groupId><artifactId>***</artifactId><version>**</version></dependency>
</dependencies>
2.1.3 maven常用命令
一般来说,maven常用命令用clean和install(package),idea为maven项目提供了按钮操作,无需在terminal中使用mvn命令
三、SpringBoot基础配置
server:port: 6013 # tomcat端口servlet:context-path: /v1 # api context pathspring:application:name: TEST # app namedatasource:url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&characterEncoding=UTF8username: rootpassword: admindriver-class-name: com.mysql.cj.jdbc.Driverjpa:hibernate: ddl-auto: updateshow-sql: truelogging:config: classpath:log/logging.xml # 日志配置路径
四、项目打包
因为是maven构建的springboot项目,故这里仅讲述maven打包的方式
4.1 打包jar
在pom.xml中配置build即可
<build><finalName>{自行指定打包名称,不配置则默认项目名称}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork> <mainClass>{springboot项目入口,即main方法所在类class}</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>
4.2 打包war
相对于jar包,打包war就需要排除springboot中内嵌的tomcat
4.2.1 修改项目打包为war包
4.2.2 排除内嵌的tomcat,引入外部tomcat
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions>
</dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope>
</dependency>
4.2.3 添加servlet-api依赖
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>7.0.42</version> <scope>provided</scope>
</dependency>
4.2.4 修改app入口方法,继承SpringBootServletInitializer,记得重写configure方法
@SpringBootApplication
@EnableCaching
public class TestApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(TestApplication.class); } public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); }
}
4.2.5 和打包jar包一样添加war包插件,其中warName就是项目启动后访问项目的contextPath,当然这时候可以去tomcat里配置无需contextPath。默认访问该项目
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <warSourceExcludes>src/main/resources/**</warSourceExcludes> <warName>test</warName> </configuration>
</plugin>
五、服务部署
5.1 winserver
winserver的部署和我们在电脑开发类似,打包cmd,运行java -jar jar包完整路径即可
当然,可以编写bat脚本一键启动等等,这些骚操作就不在这里过多讲述,可自行发挥bat编写
5.2 centos
和winserver类似,打包传上去,java -jar jar包路径
不过由于ssh session的关系,如果直接运行上面命令,会在session前台运行,此时session要么关闭,要么看着jar包运行。如果需要后台运行,则需要用到nohup命令
nohup java -jar **.jar &
控制台输出默认在nohup.out中
同winserver的bat一样,jar包也通常不会再linux中直接运行,一般使用sh脚本或者写入service中,通过脚本或systemctl等命令运行
六、Nginx相关配置
6.1 端口转发
一般来说,我们开发的端口不会直接使用80,会使用域名转发到我们的端口服务上,在nginx中,可以进行一下配置达到此效果
server {listen 80;server_name www.***.com;charset utf-8;location / {proxy_pass http://127.0.0.1:8080/**;}error_page 404 400 401 402 403 /404.html;location = /404.html {root html;}error_page 500 502 503 504 /500.html;location = /500.html {root html;}
}
6.2 HTTPS
https首先需要为自己的域名购买或生成证书,具体方法可自行百度或在各大云服务商购买
有了证书后,将证书中后缀为crt和key的两个文件放入和ngxin的nginx.conf文件平级或者下级的目录中,然后在需要https访问的域名中配置如下
server {# https 默认443端口listen 443 ssl;server_name www.***.com;charset utf-8;#证书文件名称ssl_certificate 1_www.***.com_bundle.crt; #私钥文件名称ssl_certificate_key 2_www.***.com.key; ssl_session_timeout 5m;#请按照以下协议配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on;location / {proxy_pass http://127.0.0.1:8080/**;}error_page 404 400 401 402 403 /404.html;location = /404.html {root html;}error_page 500 502 503 504 /500.html;location = /500.html {root html;}
}
6.3 静态Web
静态web的配置方式与端口转发类似,只是将proxy_pass换成了root路径
server {listen 80;server_name www.***.com;charset utf-8;location / {root /usr/local/web/***;index index.html;}error_page 404 400 401 402 403 /404.html;location = /404.html {root html;}error_page 500 502 503 504 /500.html;location = /500.html {root html;}
}
6.4 静态资源访问
静态资源和静态web配置一致,只需要将web路径换成资源路径即可,访问同样按照web访问资源文件
server {listen 80;server_name file.***.com;charset utf-8;location / {root /usr/local/file/***;index index.html;}
}
相关文章:

【java】Java项目从开发到部署生产完整流程梳理
文章目录 前言一、开发环境二、项目搭建2.1 Maven创建项目2.1.1 创建maven项目2.1.2 引入依赖2.1.3 maven常用命令 三、SpringBoot基础配置四、项目打包4.1 打包jar4.2 打包war4.2.1 修改项目打包为war包4.2.2 排除内嵌的tomcat,引入外部tomcat4.2.3 添加servlet-ap…...

Casbin实战经验大揭秘:教育培训领域的创新实践和高效优化策略
策略描述语言(论文) 摘要: 为了保护云资源的安全,防止数据泄露和非授权访问,必须对云平台的资源访问实施访问控制。然而,目前主流云平台通常采用自己的安全策略语言和访问控制机制,从而造成两个问题&#x…...
MyBatis篇---第一篇
系列文章目录 文章目录 系列文章目录一、什么是MyBatis二、说说MyBatis的优点和缺点三、#{}和${}的区别是什么?一、什么是MyBatis (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、…...

三级分类部分三级目录无法加载,后端接口能在前端返回所有数据
目录 项目场景:三类分类部分不显示问题描述:数据库序号128后的目录不显示原因分析: 数据库&JAVA后端代码:后端接口 解决方案:1 数据库序号问题2 JAVA层面1 递归改成非递归写法2重新写接口: 查询cat_id为…...

Leetcode1839. 所有元音按顺序排布的最长子字符串
Every day a Leetcode 题目来源:1839. 所有元音按顺序排布的最长子字符串 解法1:滑动窗口 要找的是最长美丽子字符串的长度,我们可以用滑动窗口解决。 设窗口内的子字符串为 window,每当 word[right] > window.back() 时&…...

C/C++程序设计和预处理
个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏:C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 一、引言 二、程序的翻译环境和执行环境 1、什么是程序 2、程序的翻译环境 3、程序的执行环境 三、预处理 1、预定义符…...
openssl生成自签名证书
原网址:https://blog.csdn.net/weixin_41767181/article/details/121531007 windows下安装openssl后,生成自签名证书并打包为P12文件的命令如下: 需要注意的是: 每一级的证书中,证书的公司名称等尽量不要一样根证书…...

JAVA毕业设计100—基于Java+Springboot+Vue的WMS仓库管理系统+移动端微信小程序(源码+数据库+部署视频)
基于JavaSpringbootVue的WMS仓库管理系统移动端(源码数据库部署视频) 一、系统介绍 本系统前后端分离带小程序 本系统分为管理员、用户角色(角色权限可自行分配) 功能列表: 1、 数据管理:物料数据管理、物料Bom管理、物料组管理、物料分类管理、供应…...

深度学习推荐系统架构、Sparrow RecSys项目及深度学习基础知识
文章目录 🌟 技术架构:深度学习推荐系统的经典技术架构长啥样?🍊 一、深度学习推荐系统的技术架构🍊 二、基于用户行为的推荐🍊 三、基于多模态数据的推荐🍊 四、基于知识图谱的推荐 dz…...

ios UI 基础开发二
第一节:UIPickerView、UIPickerViewDataSource、UIPickerViewDelegate 设置约束,如果要设置两个兄弟的约束,可以按住option键,用鼠标右键把a拖到b上面,表示a按照b来对齐 生成随机数 如果后面列的数据,依赖前…...
失配树学习笔记
失配树,是一种奇妙的数据结构,它利用 KMP、LCA 解决求两前缀的最长公共 Border 的问题。 首先介绍一下什么是 Border,我们知道 nxt 数组是前后缀相同的最大长度,Border 相当于是 nxt 数组的弱化版,只是去掉了“最大”…...

【Electron】Not allowed to load local resource
问题描述 使用 audio 标签播放音频文件,控制台报错 Not allowed to load local resource。 Not allowed to load local resource原因分析 通常是安全策略所引起的。Electron 默认情况下禁止加载本地资源,以防止潜在的安全风险。 解决方案 在 main.js…...

Maven 基础教程系列
Maven是一个项目开发管理和理解工具。基于项目对象模型的概念:构建、依赖关系管理、文档创建、站点发布和分发发布都由pom.xml声明性文件控制。Maven可以通过插件进行扩展,以使用许多其他开发工具来报告或构建过程。 一、Maven 使用教程-CSDN博客 二、…...

c++之类和对象
1.auto 可以自动推导结果的类型 typeid()可以打印类型 引用也可以 auto真正的价值可以简化迭代器的写法 并且auto定义的变量必须初始化。 不能做参数 返回值也不可以用auto auto不能用来声明数组 如果想要修改要用引用且指针不好解决。 c11之后的nullptr 以后再用空指针用nul…...

分布式应用开发的核心技术系列之——基于TCP/IP的原始消息设计
本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 本文的内容主要围绕以下几个部分: TCP/IP的简单介绍。消息的介绍。基于消息分类的传输格式&…...

医疗领域的数字化浪潮:互联网医院平台的关键作用
数字化浪潮正在迅速改变医疗领域的方式和效率。互联网医院平台作为数字化医疗的关键元素,正在为医疗行业带来巨大的变革。本文将探讨互联网医院平台的关键作用,并提供一个示例,使用Python编写一个简单的医疗预约系统。 互联网医院平台的关键…...

将本地的项目上传到Gitee
目录 1.先在Gitee新建一个仓库,提交即可 2.进入到要上传的项目里面,右键选择 Git Bash Here 3.右键后就打开了Git命令窗口 4.配置你的用户名和邮箱(已经配置过则可跳过) 5.查看你的用户名和邮箱配置(可不查看) 6.输入git init指令&#…...

概率论_概率公式中的分号(;)、逗号(,)、竖线(|)
1. 概率公式中的分号(;)、逗号(,)、竖线(|) ; 分号代表前后是两类东西,以概率P(x;θ)为例,分号前面是x样本,分号后边是模型参数。 , 逗号代表两者地位平等,代表与的关系 | 竖线代表 if,一上面为例,就是如果…...
Spark Streaming 整合 Kafka
本文代码链接:https://download.csdn.net/download/shangjg03/88442308 1.版本说明 Spark 针对 Kafka 的不同版本,提供了两套整合方案:`spark-streaming-kafka-0-8` 和 `spark-streaming-kafka-0-10`,其主要区别如下: 本文使用的 Kafka 版本为 `kafka_2.12-2.2.0`,故采用…...

【API篇】五、Flink分流合流API
文章目录 1、filter算子实现分流2、分流:使用侧输出流3、合流:union4、合流:connect5、connect案例 分流,很形象的一个词,就像一条大河,遇到岸边有分叉的,而形成了主流和测流。对于数据流也一样…...

信息收集:从图像元数据(隐藏信息收集)到用户身份的揭秘 --- 7000
目录 🌐 访问Web服务 💻 分析源代码 ⬇️ 下载图片并保留元数据 🔍 提取元数据(重点) 👤 生成用户名列表 🛠️ 技术原理 图片元数据(EXIF 数据) Username-Anarch…...
jieba实现和用RNN实现中文分词的区别
Jieba 分词和基于 RNN 的分词在技术路线、实现机制、性能特点上有显著差异,以下是核心对比: 1. 技术路线对比 维度Jieba 分词RNN 神经网络分词范式传统 NLP(规则 统计)深度学习(端到端学习)核心依赖词典…...
民锋视角下的资金流效率与账户行为建模
民锋视角下的资金流效率与账户行为建模 在当前复杂多变的金融环境中,资金流效率已成为衡量一家金融服务机构专业能力的重要指标。民锋在账户管理与资金调配的实战经验中,逐步建立起一套以资金流路径为核心的行为建模方法,用以评估客户行为、交…...
Prompt工程学习之思维树(TOT)
思维树 定义:思维树(Tree of Thoughts, ToT) 是一种先进的推理框架,它通过同时探索多条推理路径对思维链(Chain of Thought)** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤…...
Java中Git基础操作详解(clone、commit、push、branch)
Git是Java开发者必备的版本控制工具,以下是核心操作的详细说明及示例: 一、Git基础概念 仓库(Repository):存储代码的目录,包含所有版本历史。提交(Commit)…...
Python爬虫:trafilatura 的详细使用(快速提取正文和评论以及结构,转换为 TXT、CSV 和 XML)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、trafilatura 概述1.1 trafilatura介绍1.2 亮点特色1.3 安装二、基本使用2.1 从URL直接提取内容2.2 输出格式控制2.3 从HTML字符串提取2.4 使用命令行工具三、高级功能3.1 全局设置3.2 提取参数定制3.3 多线程批量处…...
算法工程师认知水平要求总结
要成为一名合格的算法工程师或算法科学家,需要达到的认知水平不仅包括扎实的技术功底,更涵盖系统性思维、问题抽象能力和工程实践智慧。以下是关键维度的认知能力要求: 一、理论基础认知深度 数学根基 概率统计:深刻理解贝叶斯推断…...

低功耗高安全:蓝牙模块在安防系统中的应用方案
随着物联网(IoT)和智能家居的快速发展,安防行业正迎来前所未有的技术革新。蓝牙模块作为一种低功耗、高稳定性的无线通信技术,凭借其低成本、易部署和智能化管理等优势,在安防领域发挥着越来越重要的作用。本文将探讨蓝牙模块在安防系统中的应…...
Kafka 快速上手:安装部署与 HelloWorld 实践(二)
四、Kafka 的 HelloWorld 实践 完成 Kafka 的安装部署后,我们就可以进行一些简单的操作来体验 Kafka 的功能了。下面通过一个 HelloWorld 示例,展示如何在 Kafka 中创建主题、发送消息和消费消息。 (一)创建主题(Top…...
如何确定微服务的粒度与边界
确定微服务的粒度与边界 在完成初步服务拆分之后,架构师往往会遇到另一个难题:该拆到多细?哪些功能可以归并为一个服务,哪些又必须单独部署?这就是“服务粒度与边界”的问题。本节将围绕实际架构经验,介绍…...