芝法酱学习笔记(0.1)——Ubuntu下,Java开发环境的基本搭建

devtools/2024/9/20 1:28:57/ 标签: ubuntu, openresty, nginx, mysql, maven, lua

一、本章目标

书接上回,服务器已经安装完成,下面我们需要安装基本的开发环境。本次学习打算以Java后端开发为中心进行拓展,目前先安装Java开发、部署必备的一些软件。

基础部分

  • gcc
    gcc是c++的编译软件,一些软件的安装包需要源码编译,故预先安装
  • JDK
    搞Java研发,自然离不开JDK。打算安装几个经典版本,JDK8,JDK11,JDK17,JDK(最新)
    在环境变量设置上,增加一个默认版本的变量,方便shell脚本自动设置
  • maven
    毫无疑问,maven也是必须安装的。现在很少有人手动编译Java工程了吧
  • mysql
    关系型数据库先搞个mysql,打算装8.x版本
  • redis
    一般作为缓存,属于现代Java开发必备中间件
  • nginx/openresty
    用于网关和前端部署。我一般习惯安装openresty版本的,方便做lua拓展
  • tomcat
    一些老项目还是使用Spring框架做的,还是有必要稍微研究一下。

拓展安装

但这些远远不够,我们还需要设计出一套方便CI,CD的流程,故需要安装如下软件

  • docker
  • harbor
  • nexus
  • jenkins
    K8S相关的暂时先不安装,等搞到那个地方的时候再安装。由于篇幅限制,这些每样单独开一篇文章。

二、gcc等基础软件安装

2.1 gcc安装

这些基础软件,我们使用Ubuntu的apt-get命令安装

apt update
apt install gcc
apt install g++
apt install build-essential

更新一下Ubuntu

do-release-upgrade

ubuntu_39">三、ubuntu文件夹规划

在做一些安装前,我们需要对Ubuntu的文件夹做一些规划,方便日后管理。初步规划如图:
先在根目录创建一个WORK的文件夹,在该文件夹下创建如下子文件夹内

mkdir DOWNLOADS DOCUMENTS SDK MIDDLEWARE SOFTWARE APP

其中:

  • DOWNLOADS作为下载文件夹
  • DOCUMENTS存放文档
  • SDK 存放类似JDK的代码库
  • MIDDLEWARE 放诸如mysql redis tomcat的中间件
  • SOFTWARE 放普通软件
  • APP 放部署的项目

四、JDK安装

4.1 下载与解压

JDK的安装包可以去Oracle官网下载
这里要注意,我们要下载的是Linux版的,并且是X64,不要下成arm64了。
JDK8和JDK11,可以直接从我提供的链接下载,注意,这里的链接需要注册一下Oracle账号。
下载好的tar包,拖到DOWNLOADS下

mkdir /WORK/SDK/JAVA
cd /WORK/DOWNLOADS
tar -xzvf jdk-8u411-linux-x64.tar.gz -C /WORK/SDK/JAVA
tar -xzvf jdk-11.0.23_linux-x64_bin.tar.gz -C /WORK/SDK/JAVA
tar -xzvf jdk-17_linux-x64_bin.tar.gz -C /WORK/SDK/JAVA
tar -xzvf jdk-21_linux-x64_bin.tar.gz -C /WORK/SDK/JAVA
cd /WORK/SDK/JAVA
mv jdk1.8.0_411 8
mv jdk-11.0.23 11
mv jdk-17.0.12 17
mv jdk-21.0.4 21

4.2 配置环境变量

linux系统下的环境变量脚本,通常放在/etc/profile中,阅读该脚本代码,我们可以大概猜出,该脚本的意思就是遍历profile.d文件夹下的所有脚本,并执行他。所以,我更推荐在这个文件夹下配置环境变量的脚本。

cd /etc/profile.d
vim java.sh
export JAVA_DEFAULT_VERSION=17
JAVA_HOME=/WORK/SDK/JAVA
export JAVA_HOME_8=$JAVA_HOME/8
export JAVA_HOME_11=$JAVA_HOME/11
export JAVA_HOME_17=$JAVA_HOME/17
export JAVA_HOME_22=$JAVA_HOME/22
export JAVA_HOME=$JAVA_HOME/$JAVA_DEFAULT_VERSION
export PATH=$JAVA_HOME/bin:$PATH
```bash
chmod +x java.sh
source /etc/profile
java --version

如果展示出Java的版本,说明配置成功

maven_94">五、安装maven

我写这篇帖子的时候,maven的版本是3.9.8,我就按这个版本配置了

5.1 安装解压

首先从官网下载安装包

tar -xzvf apache-maven-3.9.8-bin.tar.gz -C /WORK/SOFTWARE/maven/
mv apache-maven-3.9.8 3.9

5.2 配置config文件

maven的配置文件放在conf/settings.xml中,我们在搭建nexus时会再次修改这个文件,本次只配置Java的Jar包下载位置即可。

<localRepository>/WORK/SDK/JAVA/reposity</localRepository>

5.3 配置环境变量

vim /etc/profile.d/meven.sh
MAVEN_VERSION=3.9
export MAVEN_HOME=/WORK/SOFTWARE/maven/$MAVEN_VERSION
export PATH=$PATH:$MAVEN_HOME/bin
source /etc/profile
mvn --version

如果出现maven版本,则说明安装成功

mysql_125">六、安装mysql

6.1 下载安装

首先去官网下载dpkg包,放到/WORK/DOWNLOADS下

dpkg -i /WORK/DOWNLOADS/mysql-apt-config_0.8.32-1_all.deb
apt-get update
apt-get install mysql-server
systemctl status mysql

6.2 配置账号

我们先搞2个mysql账号,一个是app,用于Java连接mysql;一个是dbMgr,用于管理mysql

mysql> create role role_dbMgr;
mysql> create role role_app;
mysql> GRANT ALL ON *.* to role_dbMgr;
mysql> GRANT SELECT,UPDATE,INSERT,DELETE ON *.* to role_app;
mysql> select user,authentication_string,plugin,host from user;
mysql> CREATE USER 'dbMgr'@'%' IDENTIFIED WITH caching_sha2_password by '??@7' DEFAULT ROLE role_dbMgr COMMENT 'database manager';
mysql> CREATE USER 'app'@'%' IDENTIFIED WITH caching_sha2_password by 'Ilv0404@1314' DEFAULT ROLE role_app COMMENT 'app user';
mysql> flush privileges;

七、安装redis

7.1 下载安装

cd /WORK/DOWNLOADS
wget https://download.redis.io/redis-stable.tar.gz
mkdir /WORK/SOFTWARE/redis
mkdir /WORK/MIDDLEWARE/redis
mkdir /WORK/MIDDLEWARE/redis/current
tar -xzvf redis-stable.tar.gz -C /WORK/SOFTWARE/redis
cd /WORK/SOFTWARE/redis
mv redis-stable current
cd current
apt-get install pkg-config
make
make install

编译后的可执行文件会放到src下
默认会把redis的工具装到/usr/local/bin下

7.2 配置

使用vim编辑redis.conf修改以下配置

requirepass ilv0404@1314  #连接密码
daemonize yes					 #用守护进程启动
logfile log/redis.log     #log文件存放位置
dir /WORK/MIDDLEWARE/redis/current  #指定dump.rdb路径
pidfile /WORK/MIDDLEWARE/redis/current/run/redis_6379.pid #pid位置
dbfilename dump.rdb

7.3 redis自启动

mkdir /etc/redis
cp redis.conf /etc/redis/redis.conf
cd /etc/systemd/system
vim redis.service

做如下编辑

[Unit]
Description=Redis Server
After=network.target[Service]
Type=falk
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStartPost=/bin/sleep 1  #这是黄金一笔
ExecStop=/usr/local/bin/redis-cli -a ???@1314 shutdown
Restart=always
User=redis
Group=redis
PIDFile=/WORK/MIDDLEWARE/redis/current/run/redis_6379.pid
RuntimeDirectory=/WORK/MIDDLEWARE/redis/run
RuntimeDirectoryMode=2755[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable redis

7.4 遇到的问题

当出现如下警告时:

WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. 
Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. 
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

则需要修改/etc/sysctl.conf文件,添加

vm.overcommit_memory = 1

注意我/etc/systemd/system/redis.service中的那个黄金一笔。由于我们使用传统的守护进程,系统在启动时可能没来得及生成守护进程的pid文件,然而ubuntu找不到对应的文件,以为redis挂了,所以就没有后面的事情了。
当出现用命令行启动redis没问题,但使用systemctl启动redis没有pid时,就要注意这个问题。
还有一种用系统管理pid的方法,supervised systemd,暂时不想研究了。
参考帖子

openresty_232">八、安装openresty

8.1 下载安装

openresty的安装,可以参考官网的说明进行
查看一下系统的版本

lsb_release -a

由于先前,我进行过ubuntu的升级,我现在的版本是22.x的,故采用相应的办法安装

apt install apt-transport-https
apt install ca-certificates
apt-get -y install --no-install-recommends wget gnupg ca-certificates lsb-release
wget -O - https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openresty.gpgecho "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/package/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/openresty.list > /dev/null
apt-get update
sudo apt-get -y install openresty

8.2 设置环境变量

为了方便日后操作,我们把openrestynginx设置环境变量
默认openresty安装在/usr/local/openresty目录下

cd /etc/profile.d
vim openresty.sh
...
chmod +x openresty.sh
cd ..
source profile
which nginx
nginx -v

shell 脚本内容

PATH=/usr/local/openresty/bin:$PATH
PATH=/usr/local/openresty/nginx/sbin:$PATH
export PATH

8.3 创建工作目录

首先,我打算把所有部署的服务放在工作目录/WORK/APP中

cd /WORK
mkdir APP
cd APP
mkdir nginx
cd nginx
mkdir html conf logs lua
#把nginx自带的一些文件拷过来
cd /usr/local/openresty/nginx
cp -r html /WORK/APP/nginx
cp -r conf /WORK/APP/nginx

html 文件夹下,放置静态页面。我们首先在这个文件夹下,放一个测试页面,写上hello openresty
conf 文件夹下,放置nginx的配置
logs 文件夹下,放置日志
lua 文件夹下,放置lua脚本

nginx_292">8.4 启动nginx

cd /WORK/APP/nginx
nginx -s stop
nginx -p `pwd`/ -c conf/nginx.conf

通过ip访问服务器,查看是否能访问到我们刚才编写的hello openresty
在这里插入图片描述

lua_300">8.5 测试lua

lua文件夹下,创建一个init.lua的文件,创建一个斐波那契额数列的函数,lua文件如下:

lua">_G.zhifa_math = {}_G.zhifa_math.fabMemo = {}
_G.zhifa_math.fabMemo[1] = 1
_G.zhifa_math.fabMemo[2] = 1_G.zhifa_math.fab = function (n)if type(n) ~= "number" or n < 1 thenreturn nilendn = math.floor(n)if _G.zhifa_math.fabMemo[n] ~= nil thenreturn _G.zhifa_math.fabMemo[n]endlocal res = _G.zhifa_math.fab(n-1) + _G.zhifa_math.fab(n-2)_G.zhifa_math.fabMemo[n] = resreturn res
end

配置conf/nginx.conf

nginx">#服务器启动,加载lua文件
init_worker_by_lua_block{package.path = "/WORK/APP/nginx/lua/?.lua;" .. package.pathdofile "lua/init.lua"return}server {listen		80;...location /fab {default_type text/plain;content_by_lua_block {local args = ngx.req.get_uri_args()if nil == args.n thenngx.say('the integer n is required which indicate the index of fabArr')endlocal n = tonumber(args.n)if n < 2 thenngx.say('n must be an integer larger than 2')endlocal res = zhifa_math.fab(n)ngx.say("result is : "..res)}}}

重新加载文件

nginx -p `pwd`/ -c conf/nginx.conf -s reload

在这里插入图片描述


http://www.ppmy.cn/devtools/111487.html

相关文章

CORS跨域详解

目录 前言 快速说明 详细解释 Access-Control-Allow-Origin Access-Control-Allow-Credentials Access-Control-Allow-Headers Access-Control-Expose-Headers Access-Control-Allow-Methods Access-Control-Max-Age 前言 假设你已经了解服务端处理CORS跨域问题时,会…

Flink快速上手

Flink快速上手 批处理Maven配置pom文件java编写wordcount代码 有界流处理无界流处理 批处理 Maven配置pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://ww…

数据结构(6)哈希表和算法

一、哈希表 哈希表的基本概念 哈希函数&#xff1a; 哈希函数是将输入&#xff08;键&#xff09;转换为固定大小的输出&#xff08;哈希值&#xff09;的函数。这个输出通常是一个整数&#xff0c;表示在哈希表中的索引位置。理想的哈希函数应该能够均匀分布输入&#xff0c;…

华普微特殊“射频芯片”-隔离芯片品质卓越

HOPERF隔离器技术含量“超标”&#xff01; 作为信号链芯片中的重要一环&#xff0c;隔离芯片的主要作用就是在电力配电系统、工业自动化、医疗设备、可再生能源系统以及通信与数据传输等存在弱电控制强电的场景中实现电气隔离、信号传输与安全防护。 在弱电控制强电的过程中…

SprinBoot+Vue民宿预约微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

springboot 的共享session方案?

问&#xff1a;springboot 的共享session方案&#xff1f; 参考&#xff1a; https://juejin.cn/post/7195227930077691963分布式之session共享问题 4种解决方案及spring session的使用_分布式session共享方案-CSDN博客 什么是 Session &#xff1f; 答&#xff1a;因为Http协…

基于开源WQ装备数据的知识图谱全流程构建

随着大数据和人工智能技术的快速发展&#xff0c;构建领域特定的知识图谱已成为信息管理和决策支持的重要手段。武器装备知识图谱不仅能够对复杂的武器系统进行结构化展示&#xff0c;还可以通过关系推理揭示武器与装备之间的潜在联系。 1、技术路线 本文将详细介绍如何基于开…

数据库系列之GaussDB数据库中逻辑对象关系简析

初次接触openGauss或GaussDB数据库的逻辑对象&#xff0c;被其中的表空间、数据库、schema和用户之间的关系&#xff0c;以及授权管理困惑住了&#xff0c;与熟悉的MySQL数据库的逻辑对象又有明显的不同。本文旨在简要梳理下GaussDB数据库逻辑对象之间的关系&#xff0c;以加深…

python 函数 封装

封装 函数的参数是&#xff1a;变量 def 函数(参数):print(参数)if __name__ __main__:函数(参数)函数(参数2)函数的参数是&#xff1a; 字典 import requests# 定义一个字典 data {} 地址 "https://webdriveruniversity.com/" 请求方法 getdata["url"…

测试-Gatling 与性能测试

Gatling 与性能测试详解 一、什么是性能测试&#xff1f; 性能测试是一种软件测试类型&#xff0c;旨在评估系统在负载下的响应时间、吞吐量和资源利用率等性能指标。通过性能测试&#xff0c;开发者和运维团队能够识别出系统的瓶颈、优化系统性能&#xff0c;并确保其在实际…

JSON报文根据正则过滤消息

有时候业务系统在接收外部传过来的JSON报文&#xff0c;可能需要根据某个标识来判断是否是自己系统的消息&#xff0c;不是需要过滤。正常我们可能是先将JSON反序列化为具体实体类(例: A a JSON.parseObject(body,A.class))&#xff0c;然后获取具体字段来判断。此方法面对接收…

从0开始学习RocketMQ:领域模型

队列是先进先出&#xff08;FIFO&#xff09;的线性表&#xff0c;通常用链表或者数组来实现。队列只允许在后端&#xff08;称为 rear&#xff09;进行插入操作&#xff0c;在前端&#xff08;称为 front&#xff09;进行删除操作。 主流的消息中间件的传输模型主要为队列模型…

ARCGIS PRO DSK MapTool

MapTool用于自定义地图操作工具&#xff0c;使用户能够在ArcGIS Pro中执行特定的地图交互操作。添加 打开MapTool1.vb文件&#xff0c;可以看到系统已经放出MapTool1类&#xff1a; Public Sub New()将 IsSketchTool 设置为 true 以使此属性生效IsSketchTool TrueSketchTyp…

MySQL中的约束

约束概述 1.1 为什么需要约束 数据完整性&#xff08;Data Integrity&#xff09;是指数据的精确性&#xff08;Accuracy&#xff09;和可靠性&#xff08;Reliability&#xff09;。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信…

Python自带日志库实现springboot彩色效果

整体目标 涉及的库均为Python3自带库实现 loggingsysenum 终端显示彩色基本原理参考&#x1f449;Terminal里的颜色的那些事 Python打印日志可以直接借用logging自带的库实现&#xff0c;但是默认的打印实在太丑了&#xff0c;长下面这样 这只是一条日志看着还好比较清爽&…

elementUI中el-form 嵌套el-from 如何进行表单校验?

在el-form中嵌套另一个el-form进行表单校验和添加规则&#xff0c;首先&#xff0c;需要确保每个嵌套的el-form都有自己的model、rules和ref。 以下是一个简化的示例&#xff1a; <template><el-form :model"parentForm" :rules"parentRules" r…

Tomcat目录及测试

Tomcat目录及测试 C:\Program4java\apache-tomcat-10.1.7 这个目录下直接包含Tomcat的bin目录&#xff0c;conf目录等&#xff0c;我们称之为Tomcat的安装目录或根目录。 bin&#xff1a;该目录下存放的是二进制可执行文件&#xff0c;如果是安装版&#xff0c;那么这个目录下会…

Zabbix企业级应用案列

随着业务的越发复杂&#xff0c;对软件系统的要求越来越高&#xff0c;这意味着我们需要随时掌控系统的运行情况。因此&#xff0c;对系统的实时监控以及可视化展示&#xff0c;就成了基础架构的必须能力。 一、zabbix可视化 1.Grafana 简介 Grafana 是一个开源的指标量监测和…

Java XML

1、XML文件介绍 配置文件&#xff1a;用来保存设置的一些东西。 拿IDEA来举例&#xff0c;比如设置的背景图片&#xff0c;字体信息&#xff0c;字号信息和主题信息等等。 &#xff08;1&#xff09;以前是用txt保存的&#xff0c;没有任何优点&#xff0c;而且不利于阅读&a…

burp suite professional 产品介绍

Burp Suite Professional 是一款强大的网络安全工具&#xff0c;专为渗透测试和 Web 应用程序安全测试而设计。它由 PortSwigger 开发&#xff0c;并广泛应用于安全专家、开发人员和网络安全从业者。Burp Suite 提供了多种功能来帮助发现和修复 Web 应用程序中的漏洞&#xff0…