【JavaEE】Linux学习指南:基础命令与项目部署

对于Java程序员来说,关于Linux重点学习 基础命令 和 **项目部署(Java)**即可

一、Linux环境搭建

1.1环境搭建方式

主要有四种:

  • 直接安装在物理机上。但是Linux桌面使用起来非常不友好--不推荐
  • 使用虚拟机软件,将Linux搭建在虚拟机上。但是由于当前的虚拟机软件(如VMWare之类的)存在一些bug,会导致环境上出现各种莫名其妙的问题--非常不推荐
  • 使用WSL(Windows Subsystem for Linux)。这个是Windows近几年开发的新功能,在Windows系统内集成了一个Linux。但是目前这个技术还不够成--暂时不推荐
  • 使用云服务器,可以直接在 腾讯云,阿里云或华为云 等服务器厂商处直接购买一个云服务器--推荐

使用云服务器不仅环境搭建简单,避免折腾,同时还有一个最大的好处,部署在云服务器上的项目可以直接被外网访问到,这个时候就和一个公司发布一个正式的网站没有任何区别,

1.2使用云服务器

在使用云服务器环节,我们最重要的是得到三个信息:

  • 服务器的外网IP
  • 服务器的管理员账户
  • 管理员账户密码(自己设置的)

1.3使用终端软件连接到Linux

终端软件是一类工具软件,可以和远程的主机建立网络连接,从而对主机进行一些操作

常见的终端软件:

·XShell(这里我们使用的--下载免费版即可)

·Putty

·MobaXTerm

·Iterm2

·SecureCRT

终端软件(如XShell)和远程服务器的工作流程

二、Linux常用命令

这里我们选在使用 蓝桥云课 中的Linux学习进行代码的演示

初始文件:

ls

语法:ls [选项] [目录或文件]

常用选项:

· -a:列出目录下的所有文件,包括以 . 开头的隐含文件

· -d:将目录像文件一样显示,而不是显示其下的文件。如:ls -d 指定目录

· -k:以k字节的形式表示文件的大小。如 ls -alk 指定文件

· -l:列出文件的详细信息

· -r:对目录反向排序

· -t:以时间排序

· -R:列出所有子目录下的文件(递归)

pwd

语法:pwd

功能:显示用户当前所在的目录

cd

Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件

语法:cd 目录名

功能:改变工作目录。将当前工作目录改变到指定的目录下

touch

语法:touch [选项]... 文件 ...

功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件

如:touch test.txt

cat

语法:cat [选项] [文件 ]

功能:查看目标文件的内容

常用选项:

· -n:对输出的所有行编号

如:cat test.txt

当前test.txt未输入任何数据,所以使用cat是无法查询到内容的

mkdir

语法:mkdir [选项] dirname ...

功能:在当前目录下创建一个名为"dirname"的目录

常用选项:

· -p,-parents:可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多级目录

如:

mkdir test

rm

语法:rm [-f-i-r-v] [dirName/dir]

功能:删除文件或目录

常用选项:

· -f:即使文件属性为只读(即写保护),亦直接删除

· -i:删除前逐一询问确认

· -r:删除目录及其下所有文件

如:

rm -r test(这是一个目录)

注意事项:

千万不要运行 rm -rf

注意:当直接使用rm对目录进行删除时,是无法进行的。这里需要添加选项 -r

vim

vim是一个知名的文本编辑器,使用vim就可以进行文本编辑了

vim就相当于Windows的记事本,只不过功能比记事本强大一些

1)创建文件/打开文件

vim [文件名]

2)进入插入模式

vim 打开文件后默认是普通模式。普通模式下键盘的按键表示一些特殊功能的快捷键(例如 按下 j 并不是输入字母"j",而是表示光标往下移动一行)。需要进入插入模式才能进行文本编辑

使用 i 键可以进入到 插入模式(左下角提示--INSERT--)然后就可以像记事本一样正常编辑了

3)保存

在插入模式下不能保存文件,需要先回到 普通模式。 按下 Esc 回到普通模式

在普通模式下输入 :w ,再按下回车,即可保存文件

4)退出

在插入模式下不能退出,需要先回到 普通模式

退出时,分以下情况:

1、文件未修改:输入 :q,再按下回车,即可退出

2、文件修改并保存:使用 :wq 同时执行保存和退出

3、文件修改,但不希望保存: 使用 :wq! 进行强制退出

在test.txt文件中输入hello world

命令:

1.打开文件(默认是普通模式)

vim test.txt

2.进入插入模式

使用 i 键进入插入模式

3.输入数据

如这里的:hello world

4.保存并退出

先回到普通模式--使用Esc键

在普通模式--输入 :wq进行保存

4

查看test.txt文件

cp

语法:cp [选项] 源文件或目录 目标文件或目录

功能:复制文件或目录

说明:cp指令用于复制文件或目录。

若同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。

若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息

常用选项:

· -f或-force:强行复制文件或目录,不论目的文件或目录是否已经存在

· -i或-interactive:覆盖文件之前先询问用户

· -r:递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理

· -R或-recursive:递归处理,将指定目录下的文件及子目录一并处理

如:

cp test.txt test2.txt

mv

语法:mv [选项] 源文件或目录 目标文件或目录

功能:

1.视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中

2.当第二个参数类型是文件时,mv命令完成文件重命名,此时 源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为 给定的目标文件名

3.当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中

常用选项:

· -f:如果目标文件已经存在,不会询问而直接覆盖

· -i:若目标文件已经存在时,就会询问是否覆盖

如:将test.txt文件重命名为1.txt

命令:mv test.txt test1.txt

tail

语法:tail [必要参数] [选择参数] [文件]

功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件

选项:

· -f:循环读取

· -n<行数>:显示行数

如:查看test1.txt文件的末尾内容

命令:tail test1.txt

grep

语法:grep [参数]... [文件]...

功能:用于查找文件中是否包含指定字符串,并显示对应的行

选项:

· -n<行数>:显示行数

· -w:全字匹配。要求整个单词都完全相同的结果才能匹配出来,而不仅仅是一个单词的一个部分

· -r:递归查找。可以搜索多级目录下的所有文件

· --color:高亮查找到的结果

· --include:指定查找某些文件

· --exclude:指定排除某些文件

如:查询test1.txt是否包含"hello"字符串,并显示对应的行

命令:grep "hello" test1.txt

ps

语法:ps [参数]...

功能:用于查看当前系统上运行的进程

选项:

· a:显示一个终端的所有进程

· u:以用户为主的格式来显示程序状况

· x:显示所有程序,不止是会话中的进程

· e:显示所有进程,包括系统守护进程

· f:显示完整格式输出

如:

ps aux #显示系统上所有的进程

ps aux | grep "进程名"

ps aux | grep "进程id"

netstat

语法:netstat [参数] ...

功能:查看系统上的网络状态

选项:

· -a:显示所有正在或不在侦听的套接字

· -n:显示数字形式地址而不是去解析主机、端口或用户名

· -p:显示套接字所属进程的PID和名称

如:

netstat -anp

netstat -anp | grep "进程名"

netstat -anp | grep "端口号"

管道

管道是一种古老的"进程间通信"方式。在Linux指令中可以使用 | 作为管道标记

意思是 将前一个指令标准输出的内容,作为第二个指令的标准输入内容

ps -ef | grep "java"

ps -ef | head -10

tail -f log.txt | grep "Exception"

管道的工作原理

管道在内核中维护一个内存缓冲区(通常为4KB或更大)

左侧命令写入数据到管道(通过其标准输出)

右侧命令从管道读取数据(通过其标准输入)

如果管道满了,写入会阻塞;如果管道空了,读取会阻塞

管道是单向的:数据只能从左向右流动

如:读取test1.txt的文件内容,并将数据写入到管道,从管道中读取数据,查看是否包含"w"字符串

三、搭建Java部署环境

步骤:

在XShell等终端软件上进行操作

1.下载Linux软件包管理工具--apt

2.JDK--Java项目所需要的

3.MySQL--数据库配置

4.配置Web项目到Linux--部署到远程服务器上

apt(Advanced Packaging Tool)

apt是Linux软件包管理工具。用于在Ubuntu、Debian和相关Linux发行版上安装、更新、删除和管理deb软件包。简单来说,它相当于系统的"官方应用商店",让我们能用一条命令完成软件的搜索、安装、升级和卸载,并且能自动处理复杂的依赖关系

大多数apt命令必须以具有sudo权限的用户身份运行

apt的核心价值:自动化依赖管理

apt最核心的价值在于 自动化的依赖管理。在apt出现之前,手动安装软件往往是个"依赖地狱":我们需要逐个下载并安装A、B、C等多个依赖包,且版本必须兼容。apt解决了这个问题,我们只需告诉它要安装什么,它就会自动计算并下载所有必需的依赖,让整个过程变得简单可靠

常用命令

列出所有软件包--apt list

这个命令输出所有包的列表,内容比较多,可以使用grep命令过滤输出

如:apt list | grep "java"

更新软件包数据库--sudo apt-get update

apt实际上在可用软件包的数据库上工作。如果数据库没有更新,系统将不知道是否有更新的软件包可用。这就是为什么在安装任何Linux系统之后,第一件事应该是更新apt数据库

运行此命令时,您将看到从各种服务器检索到的软件包信息

安装软件包--sudo apt install package_name

移除软件包--sudo apt remove package_name

remove命令将卸载给定的软件包,但可能会留下一些配置文件。如果要删除包含所有配置文件的软件包,请使用purge而不是remove

apt remove和 apt purge的区别

·apt remove删除包的二进制文件,它留下了残留的配置文件

·apt purge删除与包相关的所有内容,包括配置我呢见

如果弄乱了程序的配置,希望从系统中完全清除它的痕迹再重新开始,可以使用apt purge

JDK

1、更新软件包

sudo apt-get update

2、安装openjdk

查找jdk包--apt list | grep "jdk"

安装jdl--sudo apt install openjdk-17-jdk

注意:此处安装的是OpenJDK,OpenJDK是一个开源版本的JDK,和Oracle官方的JDK略有差别。此处我们就使用OpenJDK即可。安装Oracle JDK比较麻烦

使用 java -version 验证是否安装成功

如果提示 "java命令找不到"则说明安装失败

卸载OpenJDK

检查安装的是哪个OpenJDK

dpkg --list |grep -i jdk

移除openjdk包

apt-get purge openjdk*

卸载OpenJDK相关包

apt-get purge icedtea-* openjdk-*

检查所有OpenJDK包是否都已卸载完毕:

dpkg --list | grep -i jdk

MySQL

1.使用apt安装MySQL

查找安装包

apt list |grep "mysql-server"

安装mysql

sudo apt install mysql-server

2.查看MySQL状态

sudo systemctl status mysql

3.MySQL安装安全设置

默认的MySQL设置是不安全的,MySQL安装提供了一个安全脚本,用于解决不太安全的默认选项

运行以下命令:

sudo mysql_secure_installation

接下来按照提示输入即可

4.设置密码

连接mysql服务器

sudo mysql

使用alter user 命令修改密码

alter user '账户'@'localhost' identified with mysql_native_password by '密码'

这里设置的密码后续在生产环境的配置文件(application-prod.yml)中会用到,用于登录并操作数据库

卸载MySQL

停止MySQL

sudo systemctl stop mysql

卸载mysql

sudo apt-get remove --purge mysql-server mysql-client mysql-common

删除MySQL配置文件和数据

sudo rm -rf /etc/mysql /var/lib/mysql

清理残留文件和目录

sudo apt-get autoremove

sudo apt-get autoclean

验证卸载结果

mysql --version

部署Web项目到Linux

什么是部署

工作中涉及到的"环境"

  • 开发环境:开发人员写代码用的机器
  • 测试环境:测试人员测试程序使用的机器
  • 生产环境(线上环境):最终项目发布时所使用的机器。对稳定性要求很高

把程序安装到生产环境上,这个过程称为"部署"。也叫"上线"

一旦程序部署成功,那么这个程序就能被外网中千千万万的普通用户访问到

换句话说,如果程序有BUG,这个BUG也就会被千千万万的用户看到

为了防止部署出错,一般公司内部都会有一些自动化部署工具(如Jenkins等)。当前我们先使用手动部署的方式来完成

环境配置

程序正常运行,需要保证环境和程序都要正确,我们需要先配置环境

须知:

我们在开发环境中的数据库表也需要发布到生产环境,此时项目中的配置文件(有关数据库)就需要更改路径(改为生产环境)

所以我们需要 数据库表代码准备+数据准备+程序配置文件修改 这三步去完成环境的配置

简单来说,我们本地(开发环境)下的数据库也需要放到线上,不然线上没有数据库数据,是无法进行的(好比说:进行登录时,线上没有数据库数据,那怎么能进行后续操作呢)

这里数据库表代码和数据直接复制本地sql,然后在终端软件XShell进行执行即可,所以就不进行展示了

多环境文件配置

针对不同环境创建不同的配置文件,要求名字为application-XXX.yml或application-XXX.properties

以下以application-XXX.yml为例

在配置文件里写不同的内容

application-dev.yml

application-prod.yml

在主配置文件application.yml中指定配置文件,并删除数据库相关配置

从Maven中读取环境配置变量(pom.xml)

修改application.yml

这里将active修改为 @profile.name@,使得在打包前,勾选哪个环境,就能将对应的配置文件打包

构建项目并打包

在本地使用maven进行打包

1.如果Test代码中有与环境配置相关的操作(比如数据库相关的操作),打包会失败,点击下图①处的图标,即可以跳过测试

2.点击clean-->package

点击package后,控制台会显示jar包的位置,以及是否打包成功

上传Jar包到服务器,并运行

1.上传Jar包

直接拖动打好的jar包到XShell窗口即可完成文件的上传

2.运行程序

nohup java -jar spring-blog-demo-0.0.1-SNAPSHOT.jar.0 &

3.查看是否运行

ps -ef | grep "java"

4.访问项目

这里通过url访问网页,并进行功能的验证,发现正常运行

常见问题

一个程序的正常运行,需要程序的正确和环境的正确。同样的代码在Windows上可以运行成功,不一定在Linux上运行成功。不同的系统对代码的理解和支持是不同的。比如Windows系统对MySQL不区分大小写,而Linux区分大小写

服务不能正常访问的原因有很多,主要分以下几方面

1.服务未启动

a.使用ps -ef | grep "java" 查看java程序是否在运行

b.如果未启动成功,需要查看对应的日志,根据原因来分析:

i.数据库不存在

ii.表不存在(区分大小写)

iii.数据库密码不正确

iv.JDK安装版本不对,或者未安装

v.mysql未设置密码

vi. ......

2.http端口未开放

检查云服务器防火墙/安全组是否开放相应端口(如8080)

杀掉进程

如果我们需要重启服务,或者重新部署等,都需要先停止之前的服务

查看当前服务的进程

ps -ef |grep "java"

上图的242033就是该服务的进程

杀掉进程

kill -9 PID

即:kill -9 242033

相关推荐
阿凉07022 小时前
STM32 Flash 扇区分布学习
stm32·嵌入式硬件·学习
有谁看见我的剑了?2 小时前
Rocky Linux 更换 阿里云的镜像源
linux·运维·阿里云
我的xiaodoujiao2 小时前
API 接口自动化测试详细图文教程学习系列12--Requests模块4--测试实践操作
python·学习·测试工具·pytest
夜瞬2 小时前
NLP学习笔记06:关系抽取——从规则方法到预训练模型
笔记·学习·自然语言处理
聆风吟º2 小时前
从“命令盲区”到“随查随用”:我用Nexent搭了一个Linux知识库助手
linux·ai·智能体·nexent
一只机电自动化菜鸟2 小时前
一建机电备考笔记(21):石油化工设备(含考频+易错点)
经验分享·笔记·学习·职场和发展·课程设计
IMPYLH2 小时前
Linux 的 readlink 命令
linux·运维·服务器·网络·bash
醇氧2 小时前
【学习】深度解析CMM与CMMI能力成熟度模型
学习·cmmi
一个小浪吴啊2 小时前
Linux/Mac Hermes Agent部署教程
linux·运维·macos·ai·ai编程