热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【SpringBoot】一文掌握程序的打包与运行

文章目录前言分析、剧透程序准备数据库环境搭建创建SpringBoot项目、选择用到的依赖。完善三层架构基本框架构建实体类开发持久层开发业务层开发控制层程序打包和运行教你一招结尾小结




文章目录


    • 前言
    • 分析、剧透
    • 程序准备
      • 数据库
      • 环境搭建
          • 创建SpringBoot项目、选择用到的依赖。
          • 完善三层架构基本框架
          • 构建实体类
          • 开发持久层
          • 开发业务层
          • 开发控制层



    • 程序打包和运行
          • 教你一招



    • 结尾小结





🌕博客x主页:己不由心王道长🌕!
🌎文章说明:SpringBoot关于程序的打包和运行🌎
✅系列专栏:spring
🌴本篇内容:基于Windows对程序进行打包和运行🌴
☕️每日一语:世上有很多不可能,不过不要在你未尽全力之前下结论。☕️
🕤作者详情:作者是一名双非大三在校生,喜欢Java,欢迎大家探讨学习,喜欢的话请给博主一个三连鼓励。🕤
🚩 交流社区:己不由心王道长(优质编程社区)



前言

我个人认为,学习一个知识点或者做一个项目,我们得有一个清晰的思路。知道自己要做什么。这个时候你就得把思路理清,而理清思路又不至于丢失的方法就是画出流程图。这里推荐一些好的软件,如:Xmind、processOn等都值得入手,上手快速。
本次讲解整体流程:
在这里插入图片描述


分析、剧透

本次是通过后端的测试,进行程序的打包和运行,并不牵扯到前端,但是可以基于postman进行测试
在这里插入图片描述


程序准备


数据库

一、建表:

create table user(
id int(2),
name varchar(15),
age int(3),
email varchar(30),
password varchar(20)
);

二、插入数据:

insert into user(id,name,age,email,password) values(1,"Jone",18,"test1@qq.com","775033");

三、验证
在这里插入图片描述
在这里插入图片描述


环境搭建


  • 环境搭建是从后端、从底层往上层开发的。就是先数据持久层、然后业务层、然后是控制层。
  • 整体流程图:

创建SpringBoot项目、选择用到的依赖。

在这里插入图片描述
在这里插入图片描述
1、添加IDEA没有提供选择的技术或者其他需要的技术


  • 我们在选择技术的时候,可能不会一下就完全想到用什么技术来实现我们的功能。而项目已经创建,删除再创建实属不聪明之举。
  • 所以我们需要在创建项目之后再对项目进行一次技术的整合,因为用的是SpringBoot,绝大部分开发用到的技术其实SpringBoot已经帮我们管理好了。
  • 这里就添加一些SpringBoot没有提供的

整体依赖坐标

<?xml version&#61;"1.0" encoding&#61;"UTF-8"?>
<project xmlns&#61;"http://maven.apache.org/POM/4.0.0" xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation&#61;"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>SpringBoot-development</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot-development</name>
<description>SpringBoot-development</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!--thymeleaf模板-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--web启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Mybatis整合Spring依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--数据库依赖-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!--Lombok依赖、简化实体类开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--测试类依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--Mybatisplus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>1.0.5</version>
</dependency>
<!-- 连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!-- jsp依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<!-- jstl标签库依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<!--打包插件、这里不要删除&#xff0c;这个项目的主要目的就是打包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

2、把Application启动类提到上一个目录


  • 这里为什么这么做是有原因的
  • SpringBootApplication类默认扫描本层包及其子包的文件&#xff0c;所以启动类必须在所有类的外面或者在同一层。
    这里启动类在三层架构的同级目录之中。

3、把application.properties文件改为application.yml


  • 这里我们用yml语法&#xff0c;yml语法有很多好处&#xff0c;这里就不再赘述。
    在这里插入图片描述

完善三层架构基本框架

  • 三层架构&#xff1a;dao/mapper、service、controller。
  • 这里直接添加包即可&#xff0c;本不止于作为一个小结点。
    在这里插入图片描述

构建实体类

  • 实体类与数据库的字段要一一对应
  • 这里添加了lombok依赖&#xff0c;我们可以看看lombok的强大之处。

package com.example.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* &#64;author 不止于梦想
* &#64;date 2022/10/29 21:53
*/

&#64;Data
&#64;NoArgsConstructor
&#64;AllArgsConstructor
public class User {
private Integer id;
private String Username;
private Integer age;
private String email;
}

开发持久层

  • 回想一下我们当时开发两天半时长项目时&#xff0c;持久层用到了两个方法&#xff0c;一个是验证用户名和密码是否存在。
  • 另一个是添加用户&#xff0c;一共两个方法。

一、开发接口

package com.example.mapper;
import com.example.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
/**
* &#64;author 不止于梦想
* &#64;date 2022/11/11 14:34
*/

&#64;Mapper
public interface UserMapper {
//通过用户名和密码查询
User selectByNameAndPwd(&#64;Param("username") String username,&#64;Param("password") String password);
//添加用户
int insertByUser(&#64;Param("user") User user);
}

四、测试


  • 从底层往上开发&#xff0c;一个好处就是可以方便测试数据是否正确。
    在这里插入图片描述

开发业务层

UserService:

package com.example.service;
import com.example.pojo.User;
/**
* &#64;author 不止于梦想
* &#64;date 2022/11/11 14:51
*/

public interface UserService {
User selectByNameAndPwd(String name, String password);
int insertUser(User user);
}

ImplUserService:

package com.example.service.impl;
import com.example.mapper.UserMapper;
import com.example.pojo.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* &#64;author 不止于梦想
* &#64;date 2022/11/11 14:53
*/

&#64;Service
public class ImplUserService implements UserService {
&#64;Autowired
private UserMapper userMapper;
&#64;Override
public User selectByNameAndPwd(String name, String password) {
return userMapper.selectByNameAndPwd(name,password);
}
&#64;Override
public int insertUser(User user) {
return userMapper.insertByUser(user);
}
}

测试&#xff1a;
在这里插入图片描述


开发控制层

UserController:

package com.example.controller;
import com.example.pojo.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* &#64;author 不止于梦想
* &#64;date 2022/11/11 15:12
*/

&#64;Controller
&#64;RequestMapping("/user")
public class UserController {
&#64;Autowired
UserService userService;
//登录成功跳转到登录页面
&#64;RequestMapping("/login")
public void login(String name, String password) {
ModelAndView mv &#61; new ModelAndView();
User user &#61; userService.selectByNameAndPwd(name, password);
if(user!&#61;null){
//如果用户存在&#xff0c;跳转到登录成功页面
mv.setViewName("succeed");
mv.addObject("user",user);
System.out.println("登录成功");
System.out.println(mv);
}else {
mv.setViewName("login");
System.out.println("登录失败");
System.out.println(mv);
}
}
//注册成功跳转登录页面&#xff0c;注册失败留在注册页面
&#64;RequestMapping("/register")
public void register(User user){//这里没有视图&#xff0c;所有设置为void
//如果影响行数不等于0&#xff0c;则说明加入成功,返回登录页面
int i &#61; userService.insertUser(user);
if(i!&#61;0){
//return "login";
}
//否则注册失败&#xff0c;留在注册界面
//return "register";
}
}

测试&#xff1a;当账号密码存在&#xff0c;跳转成功页面
![在这里插入图片描述](https://img-blog.csdnimg.cn/6220615c0a86421cae77c691abb0dd24.png

当密码不正确&#xff1a;跳转登录页面
在这里插入图片描述


程序打包和运行

第一&#xff0c;为什么我们需要打包&#xff1f;因为当我们把项目在我们的电脑上写好以后&#xff0c;需要发布项目供客户使用&#xff0c;不能你一写好&#xff0c;关机回家&#xff0c;客户也跟着下线。所以一般会把程序打包&#xff0c;然后在专门的服务器上运行。
程序打包&#xff1a;找到我们的项目的生命周期&#xff0c;先clean&#xff0c;然后执行package。

在这里插入图片描述
注意以下输出&#xff1a;
在这里插入图片描述
在这里插入图片描述
看到BUILD SUCCESS说明我们已经打包成功了。
运行程序&#xff1a;
找到打包好的target目录&#xff0c;右键——>open in——>Explorer

在这里插入图片描述
进入到存储的项目target目录中&#xff1a;
在这里插入图片描述
在地址栏里输入cmd,敲入Java -jar s&#43;tab键自动补全&#xff0c;运行项目
在这里插入图片描述
然后看下图&#xff1a;您猜怎么着&#xff1f;我们刚才的项目运行的时候已经把端口占用了&#xff0c;有没有解决办法&#xff1f;有
在这里插入图片描述


教你一招

解决端口占用问题&#xff1a;
一、以临时端口号解决
在这里插入图片描述
java -jar 项目 --server.port&#61;临时端口号
启动&#xff1a;可以看到启动是没问题的
在这里插入图片描述
而且端口已经变成了8085&#xff0c;我们在上面的时候设置的端口号是8081
在这里插入图片描述
可是设置临时端口号也有弊端&#xff0c;弊端就是很混乱&#xff0c;今天这个被占用&#xff0c;明天那个被占用。有没有一劳永逸的办法&#xff1f;没有&#xff0c;但是有一个你掌握了就能解决此类问题的办法。

二&#xff1a;杀死端口占用

#查询端口
netstat -ano
#查询指定端口
netstat -ano|findstr "端口号"
#根据进程PID查询进程名称
tasklist | findstr "进程PID号"
#根据PID杀死任务
taskkill /F /PID "进程PID号"
# 根据进程名称杀死任务
taskkill -f -t -im "进程名称"

举例&#xff1a;
在这里插入图片描述

小结&#xff1a;
在这里插入图片描述
还有一个需要注意的点就是&#xff0c;打包我们的项目&#xff0c;需要导入一个插件&#xff0c;不过这个插件在我们创建springboot项目之初就已经导入了。
在这里插入图片描述
另外还有一些常见的小问题&#xff0c;如打包之后多出来很多东西&#xff0c;还记得我们在上面打包过程中的test过程吗&#xff1f;不记得了&#xff1f;上去看看&#xff0c;我已经截图放在文章中了&#xff0c;在我们执行打包的时候&#xff0c;一般需要跳过这个test过程&#xff0c;以保证数据的准确性。
在这里插入图片描述
找到maven生命周期&#xff0c;选择test&#xff0c;点击闪电符号即可跳过测试。


结尾小结

我这里在调试debug的时候&#xff0c;出现了一些小问题&#xff0c;如下图所示&#xff1a;
在这里插入图片描述
问题&#xff1a;Skipped breakpoint at com.sun.proxy.$Proxy74.toString()&#43;0 because it happened inside debugger evaluatio

翻译&#xff1a;跳过com.sun.proxy.$Proxy74.toString&#xff08;&#xff09;&#43;0处的断点&#xff0c;因为它发生在调试器评估中

看不懂&#xff0c;查看了资料说&#xff1a;IDEA的debugger是默认会在内部将方法执行一次&#xff0c;然后回显提示数据&#xff0c;本意是很好&#xff0c;但有时候会干扰影响结果。

解决方案&#xff1a;file——>settings——>build——>Debugger——>Data Views——>java
在这里插入图片描述
把上图中的1取消勾选即可&#xff0c;一般取消这个即可&#xff0c;如果还是不行就把1、2处都取消勾选&#xff0c;这样就万无一失了。
大家又掌握一个小方法。
在这里插入图片描述







推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有