当前位置: 首页 > news >正文

【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&#xff0c;引入外部tomcat4.2.3 添加servlet-ap…...

Casbin实战经验大揭秘:教育培训领域的创新实践和高效优化策略

策略描述语言&#xff08;论文&#xff09; 摘要: 为了保护云资源的安全&#xff0c;防止数据泄露和非授权访问&#xff0c;必须对云平台的资源访问实施访问控制。然而&#xff0c;目前主流云平台通常采用自己的安全策略语言和访问控制机制&#xff0c;从而造成两个问题&#x…...

MyBatis篇---第一篇

系列文章目录 文章目录 系列文章目录一、什么是MyBatis二、说说MyBatis的优点和缺点三、#{}和${}的区别是什么?一、什么是MyBatis (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、…...

三级分类部分三级目录无法加载,后端接口能在前端返回所有数据

目录 项目场景&#xff1a;三类分类部分不显示问题描述&#xff1a;数据库序号128后的目录不显示原因分析&#xff1a; 数据库&JAVA后端代码&#xff1a;后端接口 解决方案&#xff1a;1 数据库序号问题2 JAVA层面1 递归改成非递归写法2重新写接口&#xff1a; 查询cat_id为…...

Leetcode1839. 所有元音按顺序排布的最长子字符串

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

C/C++程序设计和预处理

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 一、引言 二、程序的翻译环境和执行环境 1、什么是程序 2、程序的翻译环境 3、程序的执行环境 三、预处理 1、预定义符…...

openssl生成自签名证书

原网址&#xff1a;https://blog.csdn.net/weixin_41767181/article/details/121531007 windows下安装openssl后&#xff0c;生成自签名证书并打包为P12文件的命令如下&#xff1a; 需要注意的是&#xff1a; 每一级的证书中&#xff0c;证书的公司名称等尽量不要一样根证书…...

JAVA毕业设计100—基于Java+Springboot+Vue的WMS仓库管理系统+移动端微信小程序(源码+数据库+部署视频)

基于JavaSpringbootVue的WMS仓库管理系统移动端(源码数据库部署视频) 一、系统介绍 本系统前后端分离带小程序 本系统分为管理员、用户角色(角色权限可自行分配) 功能列表&#xff1a; 1、 数据管理&#xff1a;物料数据管理、物料Bom管理、物料组管理、物料分类管理、供应…...

深度学习推荐系统架构、Sparrow RecSys项目及深度学习基础知识

文章目录 &#x1f31f; 技术架构&#xff1a;深度学习推荐系统的经典技术架构长啥样&#xff1f;&#x1f34a; 一、深度学习推荐系统的技术架构&#x1f34a; 二、基于用户行为的推荐&#x1f34a; 三、基于多模态数据的推荐&#x1f34a; 四、基于知识图谱的推荐 &#x1f3…...

ios UI 基础开发二

第一节&#xff1a;UIPickerView、UIPickerViewDataSource、UIPickerViewDelegate 设置约束&#xff0c;如果要设置两个兄弟的约束&#xff0c;可以按住option键&#xff0c;用鼠标右键把a拖到b上面&#xff0c;表示a按照b来对齐 生成随机数 如果后面列的数据&#xff0c;依赖前…...

失配树学习笔记

失配树&#xff0c;是一种奇妙的数据结构&#xff0c;它利用 KMP、LCA 解决求两前缀的最长公共 Border 的问题。 首先介绍一下什么是 Border&#xff0c;我们知道 nxt 数组是前后缀相同的最大长度&#xff0c;Border 相当于是 nxt 数组的弱化版&#xff0c;只是去掉了“最大”…...

【Electron】Not allowed to load local resource

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

Maven 基础教程系列

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

c++之类和对象

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

分布式应用开发的核心技术系列之——基于TCP/IP的原始消息设计

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

医疗领域的数字化浪潮:互联网医院平台的关键作用

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

将本地的项目上传到Gitee

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

概率论_概率公式中的分号(;)、逗号(,)、竖线(|)

1. 概率公式中的分号(;)、逗号(,)、竖线(|) ; 分号代表前后是两类东西&#xff0c;以概率P(x;θ)为例&#xff0c;分号前面是x样本&#xff0c;分号后边是模型参数。 , 逗号代表两者地位平等&#xff0c;代表与的关系 | 竖线代表 if&#xff0c;一上面为例&#xff0c;就是如果…...

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、分流&#xff1a;使用侧输出流3、合流&#xff1a;union4、合流&#xff1a;connect5、connect案例 分流&#xff0c;很形象的一个词&#xff0c;就像一条大河&#xff0c;遇到岸边有分叉的&#xff0c;而形成了主流和测流。对于数据流也一样…...

信息收集:从图像元数据(隐藏信息收集)到用户身份的揭秘 --- 7000

目录 &#x1f310; 访问Web服务 &#x1f4bb; 分析源代码 ⬇️ 下载图片并保留元数据 &#x1f50d; 提取元数据&#xff08;重点&#xff09; &#x1f464; 生成用户名列表 &#x1f6e0;️ 技术原理 图片元数据&#xff08;EXIF 数据&#xff09; Username-Anarch…...

jieba实现和用RNN实现中文分词的区别

Jieba 分词和基于 RNN 的分词在技术路线、实现机制、性能特点上有显著差异&#xff0c;以下是核心对比&#xff1a; 1. 技术路线对比 维度Jieba 分词RNN 神经网络分词范式传统 NLP&#xff08;规则 统计&#xff09;深度学习&#xff08;端到端学习&#xff09;核心依赖词典…...

民锋视角下的资金流效率与账户行为建模

民锋视角下的资金流效率与账户行为建模 在当前复杂多变的金融环境中&#xff0c;资金流效率已成为衡量一家金融服务机构专业能力的重要指标。民锋在账户管理与资金调配的实战经验中&#xff0c;逐步建立起一套以资金流路径为核心的行为建模方法&#xff0c;用以评估客户行为、交…...

Prompt工程学习之思维树(TOT)

思维树 定义&#xff1a;思维树&#xff08;Tree of Thoughts, ToT&#xff09; 是一种先进的推理框架&#xff0c;它通过同时探索多条推理路径对思维链&#xff08;Chain of Thought&#xff09;** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤…...

Java中Git基础操作详解(clone、commit、push、branch)

Git是Java开发者必备的版本控制工具&#xff0c;以下是核心操作的详细说明及示例&#xff1a; ​​一、Git基础概念​​ ​​仓库&#xff08;Repository&#xff09;​​&#xff1a;存储代码的目录&#xff0c;包含所有版本历史。​​提交&#xff08;Commit&#xff09;​​…...

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 多线程批量处…...

算法工程师认知水平要求总结

要成为一名合格的算法工程师或算法科学家&#xff0c;需要达到的认知水平不仅包括扎实的技术功底&#xff0c;更涵盖系统性思维、问题抽象能力和工程实践智慧。以下是关键维度的认知能力要求&#xff1a; 一、理论基础认知深度 数学根基 概率统计&#xff1a;深刻理解贝叶斯推断…...

低功耗高安全:蓝牙模块在安防系统中的应用方案

随着物联网(IoT)和智能家居的快速发展&#xff0c;安防行业正迎来前所未有的技术革新。蓝牙模块作为一种低功耗、高稳定性的无线通信技术&#xff0c;凭借其低成本、易部署和智能化管理等优势&#xff0c;在安防领域发挥着越来越重要的作用。本文将探讨蓝牙模块在安防系统中的应…...

Kafka 快速上手:安装部署与 HelloWorld 实践(二)

四、Kafka 的 HelloWorld 实践 完成 Kafka 的安装部署后&#xff0c;我们就可以进行一些简单的操作来体验 Kafka 的功能了。下面通过一个 HelloWorld 示例&#xff0c;展示如何在 Kafka 中创建主题、发送消息和消费消息。 &#xff08;一&#xff09;创建主题&#xff08;Top…...

如何确定微服务的粒度与边界

确定微服务的粒度与边界 在完成初步服务拆分之后&#xff0c;架构师往往会遇到另一个难题&#xff1a;该拆到多细&#xff1f;哪些功能可以归并为一个服务&#xff0c;哪些又必须单独部署&#xff1f;这就是“服务粒度与边界”的问题。本节将围绕实际架构经验&#xff0c;介绍…...