ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Java】Linux使用及程序部署

【Java】Linux使用及程序部署 1.Linux 发行版Linux严格意义来说只是一个操作系统内核”。一个完整的操作系统操作系统内核配套的应用程序由于Linux是一个完全开源免费的内核因此有些公司/开源组织又基于Linux内核提供了不同的配套程序.这就构成了不同的“发行版。主要使用的发行版是RedHat(红帽)CentOS(RedHat的社区免费版本) 和 Ubuntu本文以Ubuntu 为例。2. Linux 环境搭建环境搭建方式使用云服务器以阿里云为例在阿里云购买云服务器操作系统选择 Ubuntuhttps://university.aliyun.com登录到Linux上我们需要三个重要的信息服务器的公网IP服务器的管理员用户固定为root管理员账号密码上述购买完服务器后可以得到一个公网IP此时点击重置密码的选项这里可以看到登录名以及可以重新设置一个密码这样我们需要的三个信息就到手了。3. 使用终端软件连接到Linux终端软件是一类工具软件可以和远程的主机建立网络连接从而对主机进行一些操作。常见的终端软件:XShellPuttyMobaXTermIterm2SecureCRT等安装 XShell 地址家庭/学校免费 – NetSarang Website选择下载左边这个下载完成后进入XShell界面中间有一个对话框点击新建设置名称和主机这个主机就是公网IP然后点击身份验证填写用户名和密码最后点击连接此时出现下面这个页面就表示连接成功其中rootiZwz9bsp8o9y3wak82wsh6Z:~#root这是当前登录的用户名。root 是 Linux 系统的超级管理员拥有系统的最高权限。分隔符意思是“以...身份登录在...主机上”。iZwz9bsp8o9y3wak82wsh6Z这是这台服务器的主机名 (Hostname)。: 分隔符用来分隔主机名和当前路径。~代表你当前所在的目录。~ 是 Linux 的简写代表当前用户的“家目录”Home Directory。root 用户所以这里实际上代表 /root 目录。#这是命令提示符。在 Linux 中# 代表你当前是超级管理员root如果是普通用户这里会显示 $。4. Linux 常见命令(1) ls语法ls [选项] [目录或文件]功能对于目录该命令列出该目录下的所有子目录与文件。对于文件将列出文件名以及其他信息。常用选项-a列出目录下的所有文件包括以.开头的隐含文件。-d将目录像文件一样显示而不是显示其下的文件。如ls -d 指定目录-k 以 k 字节的形式表示文件的大小。ls -alk 指定文件-l 列出文件的详细信息。-r对目录反向排序。-t 以时间排序。-R列出所有子目录下的文件。(递归示例(2) pwd语法: pwd功能显示用户当前所在的目录示例(3) mkdir语法mkdir [选项] dirname...功能在当前目录下创建一个名为“dirname”的目录/文件夹常用选项-p--parents可以是一个路径名称。此时若路径中的某些目录尚不存在加上此选项后系统将自动建立好那些尚不存在的目录即一次可以建立多级目录示例创建单级机目录如上述创建test目录成功但是创建一个多级的目录失败应该加上 -p 选项(4) cdLinux系统中磁盘上的文件和目录被组成一棵目录树每个节点都是目录或文件。语法cd 目录名功能改变工作目录即进入目录/文件夹。将当前工作目录改变到指定的目录下。示例也可以通过 pwd 命令观察它们的路径直接到达根目录认识Linux 目录结构Linux 是一个树形目录结构。几个特殊的目录/称为根目录.称为当前目录..称为当前目录的上级目录绝对路径vs相对路径形如: /usr/share/tomcat/logs/ 以根目录开头的称为绝对路径.形如./logs 以 . 或者 .. 开头的称为相对路径使用 tab 键补全我们敲的所有的Linux命令都可以使用tab键来尝试补全加快效率.使用ctrlc重新输入如果命令或者目录敲错了可以ctrc取消当前的命令.(5) touch语法:touch [选项]... 文件...功能touch命令参数可更改文档或目录的日期时间包括存取时间和更改时间或者新建一个不存在的文件。示例创建文件(6) rm语法rm [-f-i-r-v] [dirName/dir]功能删除文件或目录常用选项-f 即使文件属性为只读即写保护亦直接删除-i 删除前逐一询问确认-r 删除目录及其下所有文件示例删除文件此时在cc目录下创建了一个cc.txt 文件回到/root目录想要删除aa目录发现删除不了这是因为此时该路径下还有目录及一个 cc.txt文件想要删除掉aa目录就需要将它里面的东西一层层先删除掉可以使用 -r 就可以直接删除掉整个目录及其下所有的文件(7) mv语法语法mv [选项] 源文件或目录 目标文件或目录功能1.视mv命令中第二个参数类型的不同是目标文件还是目标目录mv命令将文件重命名或将其移至一个新的目录中。2.当第二个参数类型是文件时mv命令完成文件重命名此时源文件只能有一个也可以是源目录名它将所给的源文件或目录重命名为给定的目标文件名。3.当第二个参数是已存在的目录名称时源文件或目录参数可以有多个mV命令将各参数指定的源文件均移至目标目录中。常用选项-fforce强制的意思如果目标文件已经存在不会询问而直接覆盖-i若目标文件destination)已经存在时就会询问是否覆盖mv[选项]源文件或目录目标文件或目录示例移动文件此时想要往test目录下再创建一个文件 test.txt2由于已经有一个test.txt那么test.txt 就会被重命名为 test.txt2只是名字改变了但是文件内容一样如果/root目录上存在 test.txt2 文件想要将其移动到test目录下由于该目录下已经有一个 test.txt 文件如果移动过来该文件会被覆盖内容也会改变。如果/root目录上的 test.txt2 是一个目录那么移动到 test 目录后test.txt 文件会被移动到 test.txt2 目录里面变成 test/test.txt2/test.txt。(8) cp语法cp [选项] 源文件或目录 目标文件或目录功能复制文件或目录说明cp指令用于复制文件或目录如同时指定两个以上的文件或目录且最后的目的地是一个已经存在的目录则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录而最后的目的地并非一个已存在的目录则会出现错误信息常用选项-f 或-force强行复制文件或目录不论目的文件或目录是否已经存在-i 或-interactive覆盖文件之前先询问用户-r 递归处理将指定目录下的文件与子目录一并处理。若源文件或目录的形态不属于目录或符号链接则一律视为普通文件处理-R 或--recursive递归处理将指定目录下的文件及子目录一并处理与刚才的mv移动/重命名最大的区别是被复制的 test.txt 文件会保留不会消失其余的还是三种情况与mv一样。示例(9) vimvim是一个知名的文本编辑器.使用vim可以进行文本编辑了。vim就相当于Windows的记事本.只不过功能比记事本强大一些。1.创建文件/打开文件语法vim [文件名]示例选择编辑 test.txt 文件敲回车后就打开了该文件此时左下角显示此时是0行即文件还没有内容2. 写文件/进入插入模式vim打开文件后默认是普通模式.普通模式下键盘的按键表示一些特殊功能的快捷键例如按下j 键并不是输入字母j而是表示光标往下移动一行需要进入插入模式才能进行文本编使用i 键 可以进入到插入模式.左下角提示-INSERT-然后就可以像记事本一样正常编辑了.示例此时按下 i 键左下角提示-INSERT-此时就可以正常编辑内容3. 保存在插入模式下不能保存文件需要先回到普通模式按下EsC回到普通模式在普通模式下输入:w再按下回车, 即可保存文件。示例按下ESC回到普通模式此时左下角的插入模式标志消失敲下 :w 进行保存按下回车保存成功3. 退出在插入模式下不能退出需要先回到普通模式。退出时分以下情况①文件未修改输入:q再按下回车即可退出②文件修改并保存使用:wq同时执行保存和退出③文件修改强制保存并退出使用:wq示例1输入 :q 退出文件此时回到了Linux命令行界面此时的文件是未修改的状态如果文件修改了使用 :q 退出的话修改的内容不会保存例如以下修改了一些内容直接输入 :q 的话会报错说修改了内容但没保存如果想强制退出请加上 ! 号此时加上感叹号 !即输入 :q! 后就强制退出了再次进入文件未保存的内容就不在了示例2:wq编辑完文本之后直接输入该命令可以同时执行保存并退出此时文件在普通模式直接输入 :wq即可保存并退出再次进入文件修改的内容确实保存成功了示例三:wq!编辑完文本之后强制保存修改的内容并退出输入 :wq! 强制保存并退出(10) cat/more/less/head语法cat [选项] [文件]功能查看目标文件的内容常用选项-n对输出的所有行编号示例除了 cat命令表示查看文件内容more命令也是cat 是一次性把文件全部打印到屏幕上所以看大文件会刷屏而more是分页查看器就是为了解决大文件刷屏问题而生的。使用more的话如果文件内容太多可以使用 ctrlc/ :q 退出less命令也可以查看文件内容是 more 的升级版可以看到使用该命令查看文件内容完毕后左下角会有一个END输入 :q 退出查看后会发现它没有像前面两个一样将文件内容显示在命令行中这是因为less 查看文件 “打开了一个只读的阅读窗口”当查看完毕后退出就代表完成了。head命令是查看前 n 行的文件内容(11) tail语法tail [必要参数] [选择参数] [文件]功能用于显示指定文件末尾内容不指定文件时作为输入信息进行处理。常用查看日志文件。选项-f循环读取-n行数显示行数示例查看文件末尾 4行的内容(12) grep语法grep [参数]... [文件]...功能用于查找文件中是否包含指定字符串并显示对应的行。选项:-n行数显示的行数-W全字匹配要求整个单词都完全相同的结果才能匹配出来而不仅仅是一个单词的一部分。-r递归查找.可以搜索多级目录下的所有文件。--color高亮查找到的结果--include指定查找某些文件--exclude指定排除某些文件示例显示行数(13) ps语法ps [参数]..功能用于查看当前系统上运行的进程选项a显示一个终端的所有进程u以用户为主的格式来显示程序状况x显示所有程序不止是会话中的进程e显示所有进程包括系统守护进程f显示完整格式输出示例查找Java进程(14) netstat语法netstat [参数]..功能查看系统上的网络状态。选项-a显示所有正在或不在侦听的套接字-n显示数字形式地址而不是去解析主机、端口或用户名-p显示套接字所属进程的PID和名称示例(15) 管道管道是一种古老的“进程间通信”方式.在Linux指令中可以使用|作为管道标记。意思是将前一个指令标准输出的内容作为第二个指令的标准输入内容。——————5. 搭建Java部署环境① aptapt (Advanced PackagingTool)Linux软件包管理工具。用于在Ubuntu、Debian和相关Linux发行上安装、更新、删除和管理deb软件包.大多数apt命令必须以具有sudo权限的用户身份运行。apt常用命令列出所有软件包apt list这个命令输出所有包的列表, 内容比较多, 可以使用grep命令过滤输出apt list | grep java更新软件包数据库apt实际上在可用软件包的数据库上工作如果数据库没有更新系统将不知道是否有更新的软件包可用这就是为什么在安装任何Linux系统之后第一件事应该是更新apt数据库运行此命令时您将看到从各种服务器检索到的软件包信息。sudo apt-get update如果切换到root用户命令前就不需要加sudo了切换root用户。安装软件包sudo apt install package_name移除软件包sudo apt remove package_nameremove命令将卸载给定的软件包但可能会留下一些配置文件。如果要删除包含所有配置文件的软件包请使用purge而不是removeapt remove 和 apt purge 的区别apt remove删除包的二进制文件它留下了残留的配置文件.apt purge删除与包相关的所有内容包括配置文件.如果弄乱了程序的配置希望从系统中完全清除它的痕迹再重新开始可以使用apt purge通常使用apt remove就足够了② JDK1.更新软件包2.安装 open jdk查找jdk包apt list | grep jdk看查找结果我们选择下载 jdk17安装 jdk:apt install openjdk-17-jdk在执行的安装的过程中会让你选择是否继续直接选择 Y 就可以了。如果在安装过程中出现这个直接按 Tab键让 OK 变成高亮然后按回车就可以了。最后使用 java -version 验证是否安装成功③ MySQL1. 使用 apt安装MySQL查找安装包安装MySQL选择 Y 继续。2. 查看MySQL状态sudo systemctl status mysql3. MySQL安装安全设置默认的MySQL设置是不安全的MySQL安装提供了一个安全脚本用于解决不太安全的默认项。运行以下命令sudo mysql_secure_installation执行4. 设置密码连接MySQL服务器如果想要退出MySQL服务器使用 exit 命令使用 alter user 命令修改密码ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 密码;此时退出MySQL后再次登录就得重新输入修改的密码登陆此时在 XShell 里连接的 Linux 服务器上的 MySQL 的密码就是新修改的密码。接下来就可以正常操作MySQL数据库了增删查改操作等6. 部署Web项目到Linux以部署 博客系统 为例。① 什么是部署工作中涉及到的环境开发环境dev开发人员写代码用的机器测试环境test测试人员测试程序使用的机器。生产环境(线上环境)prod:最终项目发布时所使用的机器。对稳定性要求很高。把程序安装到生产环境上这个过程称为“部署也叫“上线.一旦程序部署成功那么这个程序就能被外网中千千万万的普通用户访问到。换句话说如果程序有BUG这个BUG也就被千千万万的用户看到了。部署过程至关重要属于程序开发中最重要的一环一旦部署出现问题极有可能导致严重的事故服务器不可用之类的).为了防止部署出错一般公司内部都有一些自动化部署工具如Jenkins等。当前我们先使用手工部署的方式来完成部署。② 环境部署程序正常运行需要保证环境和程序都要正确我们需要先设置环境数据准备按照之前的数据库建表脚本在服务器上运行建立相同的表结构。-- 建表SQL create database if not exists java_blog_spring charset utf8mb4; use java_blog_spring; -- 用户表 DROP TABLE IF EXISTS java_blog_spring.user_info; CREATE TABLE java_blog_spring.user_info( id INT NOT NULL AUTO_INCREMENT, user_name VARCHAR(128) NOT NULL, password VARCHAR(128) NOT NULL, github_url VARCHAR(128) NULL, delete_flag TINYINT(4) NULL DEFAULT 0, create_time DATETIME DEFAULT now(), update_time DATETIME DEFAULT now() ON UPDATE now(), PRIMARY KEY (id), UNIQUE INDEX user_name_UNIQUE (user_name ASC) ) ENGINE INNODB DEFAULT CHARACTER SET utf8mb4 COMMENT 用户表; -- 博客表 drop table if exists java_blog_spring.blog_info; CREATE TABLE java_blog_spring.blog_info ( id INT NOT NULL AUTO_INCREMENT, title VARCHAR(200) NULL, content TEXT NULL, user_id INT(11) NULL, delete_flag TINYINT(4) NULL DEFAULT 0, create_time DATETIME DEFAULT now(), update_time DATETIME DEFAULT now() ON UPDATE now(), PRIMARY KEY (id) ) ENGINE InnoDB DEFAULT CHARSET utf8mb4 COMMENT 博客表; -- 新增用户信息 insert into java_blog_spring.user_info (user_name, password, github_url) values (zhangsan, 123456, https://gitee.com/bubble-fish666/class-java45); insert into java_blog_spring.user_info (user_name, password, github_url) values (lisi, 123456, https://gitee.com/bubble-fish666/class-java45); insert into java_blog_spring.blog_info (title, content, user_id) values (第一篇博客, 111我是博客正文我是博客正文我是博客正文, 1); insert into java_blog_spring.blog_info (title, content, user_id) values (第二篇博客, 222我是博客正文我是博客正文我是博客正文, 2);将上述的数据复制黏贴到XShell窗口中此时MySQL中已经有了该数据库以及表数据了程序配置文件修改实际工作中开发环境测试环境以及生产环境的配置都是不一样的比如mysql的用户名和密码我们可以针对不同的环境设置不同的配置多平台文件配置针对不同平台创建不同的配置文件要求名字为application-XXX.yml或者applicationXXX.properties以下以application-XXX.yml为例固定格式只有后面的字母可以修改XXX 表示环境名称在配置文件里写不同的内容application-dev.ymlspring: datasource: url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncodingutf8useSSLfalseallowPublicKeyRetrievaltrue username: root password: MySQL密码 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl logging: file: name: spring-blog.logapplication-prod.ymlspring: datasource: url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncodingutf8useSSLfalseallowPublicKeyRetrievaltrue username: root password: Linux MySQL密码 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true logging: file: name: spring-blog.log在主配置文件 application.yml 中指定配置文件, 并删除数据库相关配置spring: profiles: active: prod此时启动程序可以看到运行的是 prod生产环境的 yml如果改成 dev运行的就是 开发环境的 ymlspring: profiles: active: dev此时通过postman测试接口可以测试成功如果是 prod 环境的测试失败从Maven中读取环境配置变量上述是通过主配置文件 yml 读取环境配置变量的还需要手动修改如果换成pom文件读取的话就无需手动修改。profiles profile iddev/id properties profile.namedev/profile.name /properties /profile profile idprod/id properties profile.nameprod/profile.name /properties /profile /profiles未点击刷新时Profile配置文件/环境配置只有以下的这两个【同一套代码在不同的场景下比如开发、测试、生产环境或者不同的操作系统可能需要不同的参数Profile 就是用来快速切换这些参数的开关。】刷新后就出现了新添加进入的环境配置然后修改 主配置文件 application.yml spring: profiles: active: profile.name此时需要更换环境的话直接勾选Maven的profile即可示例勾选 dev点击刷新勾选 prod点击刷新③ 构建项目并打包在本地Maven进行打包双击 package打包运行结果如果Test代码中有与环境配置相关的操作比如数据库相关的操作打包会失败点击下图①处的图标可以跳过测试然后点击clean-package准备好数据做好环境后此时就需要在本地打包出 Jar 包并将【该 Jar 包】上传到服务器中。④ 上传Jar包到服务器并运行1. 上传 Jar首先先更新一下软件包apt update安装lrzsz:apt-get install lrzsz然后直接拖动打好的jar包到xshell窗口即可完成文件的上传文件传输中通过 ls 查找文件发现 Jar包已经成功上传既然我们安装了 lrzsz也可使用lrzsz命令进行上传文件rz filename下载文件sz filename可以给 Jar包 重命名2. 运行程序java -jar blog.jar执行结果但是以上的命令是前台运行的程序程序已退出网页就无法访问因此我们使用以下这个命令nohup java -jar blog.jar nohup : 后台运行程序。用于在系统后台不挂断地运行命令退出终端不会影响程序的运行。让命令在后台执行终端退出后命令仍旧执行。开启后台运行其中ignoring input and appending output to nohup.out 表示的意思ignoring input忽略输入因为你加了 把程序放到了后台运行它已经脱离了当前的终端窗口。这意味着它不能再接收你键盘敲入的内容标准输入所以 nohup 直接把这个输入通道关闭了忽略。and appending output to nohup.out并将输出追加到 nohup.out 文件程序在运行时会吐出一大堆日志。因为你这次没有指定日志文件系统默认帮你在当前目录下创建了一个叫 nohup.out 的文件把所有的日志都写进了这里面。appending 意思是“追加”也就是说每次启动日志都会往后接着写不会清空以前的。我们可以通过 more nohup.out 查看文件内容可以看到我们运行后的所有日志信息解析以下这些日志的作用blog.jar你的程序本身。nohup.outnohup 命令默认捕获的输出日志。spring-blog.log当前正在写入的日志文件。 Spring Boot 程序正在往这里面不停地吐日志。spring-blog.log.2026-09-26.0.gz昨天的历史日志压缩包。在 SpringBoot中在 application.yml 里配置了 # name: spring-blog.log会把日志存放在这个日志文件中当开启新的一天时会把昨天写的日志 spring-blog.log 存档并自动用 gzip 压缩成了 .gz 文件然后新建了一个干净的 spring-blog.log 继续写今天的日志。为什么这里同时存在 nohup.out 和 spring-blog.log因为使用了命令 nohup java -jar blog.jar ;nohup.out 是 Linux 系统记录下来的程序输出包含启动画面和部分日志。spring-blog.log 是 Spring Boot 内部日志系统单独记录的日志只包含应用日志。结果一份日志可能被写了两遍一遍在 nohup.out一遍在 spring-blog.log。时间久了nohup.out 可能会变得非常大.我们可以使用这个命令nohup java -jar blog.jar blog.log 21 把标准输出重定向到指定文件 blog.log 中每次启动覆盖旧日志想保留历史改用 。21把标准错误2重定向到标准输出1去也就是让报错信息也一起写进 blog.log。使用上述的命令我们需要先将之前部署运行中的程序杀掉然后再使用关于如何杀掉进程继续往下看3. 开放端口如果外网需要访问该服务需要先服务器防火墙开放对应的端口号本着服务器安全的原则云服务器上的端口非必要不开启比如常见端口号数据库3306Redis6379尽可能避免开放而是采用其他方式来连接比如配置隧道的方式以阿里云为例1进入安全组页面然后点击安全组ID2添加规则端口号写需要开放的端⼝号, 多个端口号以逗号分割。这里添加一个8080端口4. 验证程序访问http://IP:Port/blog_login.htmlIP改为云服务器的公网IPPort改为 博客系统 项目的端口号即8080.访问成功后我们可以在XShell窗口查看错误日志5. 杀掉进程如果我们需要重启服务或者重新部署等都需要先停止之前的服务1查看当前服务的进程上图中的11339就是该服务的进程。2. 杀掉进程kill -9 PID(进程ID)————————继续之前的问题使用这个命令运行服务nohup java -jar blog.jar blog.log 21 首先先查看当前要杀掉的进程的ID即 11339杀掉该进程然后重新运行程序通过 ls 命令可以看到我们所指定的日志文件——————当需要修改Java源码代码的时候就需要修改完之后重新打Jar包然后上传到Linux上然后将之前运行的程序杀掉重新运行新的程序。
返回列表