CentOS Linux release 7.9.2009 (Core)中安装配置Tomcat

news2024/10/6 6:48:58

一、安装JDK

部分内容可以参考我这篇文章:Windows11与CentOS7下配置与检测JDK与Maven环境变量 中的 2.2 安装jdk-8u371-linux-x64.tar.gz和配置环境变量/etc/profile

//1、安装redhat-lsb
yum install -y redhat-lsb

//2、查看系统版本信息
lsb_release -a 

//3、查看系统位数
getconf LONG_BIT

cat /etc/redhat-release

参考我这篇文章:查看CentOS版本及系统位数与设置CentOS 7.9 2009 防火墙配置放开端口的命令与过程
在这里插入图片描述

//查看yum源中JDK版本
yum list java*

//使用yum安装JDK1.8.0
yum -y install java-1.8.0-openjdk*

//检查Java版本,查看是否安装成功
java -version

//配置环境变量
//查看JDK安装的路径
find /usr/lib/jvm -name 'java-1.8.0-openjdk-1.8.0*'

//编辑配置文件/etc/profile
//按i进入编辑模式
vim /etc/profile


//添加以下信息
//按下Esc键,输入:wq并回车以保存并关闭文件。
#2023-9-2 23:28:12  djc配置JDK环境变量
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME CLASSPATH PATH



--------------------注意-----------------------
//在本文目录5.1 NO such file or directory 中需要在tomcat脚本文件(即Tomcat-init脚本文件)中,
//需要配置使用JAVA_HOME
//之前执行了移动并重命名Tomcat-init的命令:mv Tomcat-init /etc/init.d/tomcat
//详情见  本文目录5.1 NO such file or directory 中
#Location of JAVA_HOME (bin files)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64

//tomcat脚本文件(即Tomcat-init脚本文件)中的PATH的值,
//是该项目作者默认配置成这样了export PATH=$JAVA_HOME/bin:$PATH
//,与JDK环境变量中的PATH=$PATH:$JAVA_HOME/bin 就是顺序颠倒了,作用应该是一样的
#Add Java binary files to PATH
export PATH=$JAVA_HOME/bin:$PATH
-------------------------------------------


//最后刷新环境变量
source /etc/profile
修改环境变量后,可能会导致执行其他命令时,出现类似-bash: chmod: command not found这样的问题,
执行export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin即可。

查看yum源中JDK版本:yum list java*
在这里插入图片描述
使用yum安装JDK1.8.0:yum -y install java-1.8.0-openjdk*
在这里插入图片描述
在这里插入图片描述
检查Java版本,查看是否安装成功java -version

[root@freedom ~]# java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (build 1.8.0_382-b05)
OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)
[root@freedom ~]# 

查看JDK安装的路径:find /usr/lib/jvm -name 'java-1.8.0-openjdk-1.8.0*'

[root@freedom ~]# find /usr/lib/jvm -name 'java-1.8.0-openjdk-1.8.0*'
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
[root@freedom ~]# 

在这里插入图片描述
编辑配置文件/etc/profile
在这里插入图片描述
在这里插入图片描述
添加以下JDK环境变量信息:

#2023-9-2 23:28:12  djc配置JDK环境变量
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME CLASSPATH PATH

添加完JDK环境变量信息的/etc/profile

[root@freedom ~]# cat /etc/profile
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}


if [ -x /usr/bin/id ]; then
    if [ -z "$EUID" ]; then
        # ksh workaround
        EUID=`/usr/bin/id -u`
        UID=`/usr/bin/id -ru`
    fi
    USER="`/usr/bin/id -un`"
    LOGNAME=$USER
    MAIL="/var/spool/mail/$USER"
fi

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
else
    pathmunge /usr/local/sbin after
    pathmunge /usr/sbin after
fi

HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
    export HISTCONTROL=ignoreboth
else
    export HISTCONTROL=ignoredups
fi

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi

for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then 
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

unset i
unset -f pathmunge


#2023-9-2 23:28:12  djc配置JDK环境变量
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME CLASSPATH PATH

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
刷新环境变量source /etc/profile
在这里插入图片描述
修改环境变量后,可能会导致执行其他命令时,出现类似-bash: chmod: command not found这样的问题,执行export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin即可。
在这里插入图片描述

二、下载Tomcat

2.1 下载Tomcat

Tomcat官网
点击左侧的Download中的Tomcat 8:
在这里插入图片描述
选中右击后点击-复制链接地址
在这里插入图片描述
然后再服务器中使用wget命令,下载Tomcat包:

//链接修改成需要的版本
wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.96/bin/apache-tomcat-8.5.93.tar.gz

或者直接在浏览器中点击下载链接,下载完成后再将apache-tomcat-8.5.93.tar.gz,利用xftp等工具上传到服务器中

2.2 解压并移动

//解压 apache-tomcat-8.5.93.tar.gz
tar -zxvf apache-tomcat-8.5.93.tar.gz

//移动并改名到Tomcat目录
mv apache-tomcat-8.5.93 /usr/local/tomcat/

在这里插入图片描述
在这里插入图片描述
移动并改名到Tomcat目录
/usr/local/tomcat/目录下:
bin:存放Tomcat的一些脚本文件,包含启动和关闭Tomcat服务脚本。
conf:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml。
webapps:Tomcat的主要Web发布目录,默认情况下把Web应用文件放于此目录。
logs:存放Tomcat执行时的日志文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 创建一般用户

为保证系统安全性,建议创建一般用户运行Tomcat

//创建一般用户djc
useradd djc

//运行命令,将文件的所属用户设置为djc
chown -R djc.djc /usr/local/tomcat/

在这里插入图片描述

三、配置server.xml文件

//运行命令,切换到/usr/local/tomcat/conf/目录。
cd /usr/local/tomcat/conf/

//运行以下命令,重命名server.xml文件
//server.xml_bk相当于把server.xml初始文件的备份
mv server.xml server.xml_bk

//新建一个server.xml文件
//会创建并打开一个server.xml文件
//i键编辑,ESC键退出,:wq保存并退出
vi server.xml

server.xml的内容

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8006" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<Listener className="org.apache.catalina.core.AprLifecycleListener"/>
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
 type="org.apache.catalina.UserDatabase"
 description="User database that can be updated and saved"
 factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
 pathname="conf/tomcat-users.xml"/>
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080"
 protocol="HTTP/1.1"
 connectionTimeout="20000"
 redirectPort="8443"
 maxThreads="1000"
 minSpareThreads="20"
 acceptCount="1000"
 maxHttpHeaderSize="65536"
 debug="0"
 disableUploadTimeout="true"
 useBodyEncodingForURI="true"
 enableLookups="false"
 URIEncoding="UTF-8"/>
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="/data/wwwroot/default" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/data/wwwroot/default" debug="0" reloadable="false" crossContext="true"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>
</Server>

在这里插入图片描述
i键编辑,ESC键退出,:wq保存并退出
在这里插入图片描述
在这里插入图片描述
cat server.xml
/usr/local/tomcat/conf/server.xml
在这里插入图片描述
在这里插入图片描述

#四、设置JVM内存参数

//运行命令,创建并打开/usr/local/tomcat/bin/setenv.sh文件。
//i键编辑,ESC键退出,:wq保存并退出
vi /usr/local/tomcat/bin/setenv.sh

//setenv.sh的内容
//指定JAVA_OPTS参数,用于设置JVM的内存信息以及编码格式。
JAVA_OPTS='-Djava.security.egd=file:/dev/./urandom -server -Xms256m -Xmx496m -Dfile.encoding=UTF-8'

在这里插入图片描述
在这里插入图片描述
cat setenv.sh:
在这里插入图片描述

四、设置Tomcat自启动脚本-Tomcat-init脚本

Tomcat-init

//获取Tomcat自启动脚本 Tomcat-init
//或者使用git clone(从Windows里clone完成后再上传到linux服务器)
//也可以在服务器中直接wget
wet https://github.com/oneinstack/oneinstack/blob/main/init.d/Tomcat-init

//移动并重命名Tomcat-init
mv Tomcat-init /etc/init.d/tomcat

//为/etc/init.d/tomcat添加可执行权限
chmod +x /etc/init.d/tomcat

//设置启动脚本JAVA_HOME
//重要:脚本中JDK的版本信息必须与您安装的JDK版本信息一致,否则Tomcat会启动失败。
sed -i 's@^export JAVA_HOME=.*@export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.342.b07-1.el7_9.x86_64@' /etc/init.d/tomcat

Tomcat-init脚本的内容:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          tomcat
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: tomcat-server daemon
# Description:       tomcat-server daemon
### END INIT INFO
#
# chkconfig: - 95 15
# description: Tomcat start/stop/status script

#Location of JAVA_HOME (bin files)
export JAVA_HOME=

#Add Java binary files to PATH
export PATH=$JAVA_HOME/bin:$PATH

#CATALINA_HOME is the location of the configuration files of this instance of Tomcat
CATALINA_HOME=/usr/local/tomcat

#TOMCAT_USER is the default user of tomcat
TOMCAT_USER=www

#TOMCAT_USAGE is the message if this script is called without any options
TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}"

#SHUTDOWN_WAIT is wait time in seconds for java proccess to stop
SHUTDOWN_WAIT=20

tomcat_pid() {
  echo `ps -ef | grep java | grep $CATALINA_HOME/ | grep -v grep | tr -s " "|cut -d" " -f2`
}

start() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m"
  else
    echo -e "\e[00;32mStarting tomcat\e[00m"
    if [ `user_exists $TOMCAT_USER` = "1" ]; then
      su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
    else
      $CATALINA_HOME/bin/startup.sh
    fi
    status
  fi
  return 0
}

status() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m"
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi
}

stop() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mStoping Tomcat\e[00m"
    $CATALINA_HOME/bin/shutdown.sh

    let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n";
      sleep 1
      let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
      echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m"
      kill -9 $pid
    fi
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi

  return 0
}

user_exists() {
  if id -u $1 >/dev/null 2>&1; then
	islogin=`cat /etc/passwd | grep ^${TOMCAT_USER}: | grep nologin$`
	if [ "${islogin: -7}" = "nologin" ]; then
      echo "0"
    else
      echo "1"	
    fi
  else
    echo "0"
  fi
}

case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    status
    ;;
  *)
    echo -e $TOMCAT_USAGE
    ;;
esac
exit 0

在这里插入图片描述
上传自启动脚本Tomcat-init
在这里插入图片描述
注意这里的etc的init.d文件夹是个快捷方式链接:
在这里插入图片描述
在这里插入图片描述
也就是说init.d实际指向rc.d下的init.d文件夹 里面有刚刚使用mv命令移动并重命名的Tomcat-init脚本文件,即tomcat脚本文件
在这里插入图片描述
设置启动脚本JAVA_HOME:
为/etc/init.d/tomcat添加可执行权限 (chmod +x /etc/init.d/tomcat),字体变色变粗(可以用来识别命令是否生效)
在这里插入图片描述

五、启动Tomcat

//设置Tomcat开机自启动
chkconfig --add tomcat
chkconfig tomcat on

//启动Tomcat
service tomcat start

5.1 NO such file or directory

启动Tomcat:
报错:tomcat-NO such file or directory:
这是因为Tomcat-init脚本文件,也就是/etc/init.d/tomcat脚本文件 (之前执行了移动并重命名Tomcat-init脚本文件的命令mv Tomcat-init /etc/init.d/tomcat)这个文件中需要配置参数JAVA_HOMETOMCAT_USER=www 修改为TOMCAT_USER=djc (TOMCAT_USER is the default user of tomcat),

所以此处的tomcat实际上是一个脚本文件的名称,即Tomcat-init脚本文件。
在这里插入图片描述
在这里插入图片描述
cat tomcat脚本文件(即Tomcat-init脚本文件)
在这里插入图片描述
在这里插入图片描述

#Location of JAVA_HOME (bin files)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64的值:

在这里插入图片描述
#CATALINA_HOME is the location of the configuration files of this instance of Tomcat
CATALINA_HOME=/usr/local/tomcat 的值:
在这里插入图片描述
修改后的tomcat脚本(即原来的Tomcat-init脚本,mv Tomcat-init /etc/init.d/tomcat):

#H<H<H<H<H<H<H<i!/bin/bash
### BEGIN INIT INFO
# Provides:          tomcat
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: tomcat-server daemon
# Description:       tomcat-server daemon
### END INIT INFO
#
# chkconfig: - 95 15
# description: Tomcat start/stop/status script

#Location of JAVA_HOME (bin files)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64

#Add Java binary files to PATH
export PATH=$JAVA_HOME/bin:$PATH

#CATALINA_HOME is the location of the configuration files of this instance of Tomcat
CATALINA_HOME=/usr/local/tomcat

#TOMCAT_USER is the default user of tomcat
TOMCAT_USER=djc

#TOMCAT_USAGE is the message if this script is called without any options
TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}"

#SHUTDOWN_WAIT is wait time in seconds for java proccess to stop
SHUTDOWN_WAIT=20

tomcat_pid() {
  echo `ps -ef | grep java | grep $CATALINA_HOME/ | grep -v grep | tr -s " "|cut -d" " -f2`
}

start() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m"
  else
    echo -e "\e[00;32mStarting tomcat\e[00m"
    if [ `user_exists $TOMCAT_USER` = "1" ]; then
      su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
    else
      $CATALINA_HOME/bin/startup.sh
    fi
    status
  fi
  return 0
}

status() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m"
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi
}

stop() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mStoping Tomcat\e[00m"
    $CATALINA_HOME/bin/shutdown.sh

    let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n";
      sleep 1
      let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
      echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m"
      kill -9 $pid
    fi
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi

  return 0
}

user_exists() {
  if id -u $1 >/dev/null 2>&1; then
	islogin=`cat /etc/passwd | grep ^${TOMCAT_USER}: | grep nologin$`
	if [ "${islogin: -7}" = "nologin" ]; then
      echo "0"
    else
      echo "1"	
    fi
  else
    echo "0"
  fi
}

case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    status
    ;;
  *)
    echo -e $TOMCAT_USAGE
    ;;
esac
exit 0

5.2 service tomcat start-command not found

在这里插入图片描述
原因:shell脚本是在Windows下编写,通过工具软件传输到CentOS中。而Windows下行结尾符号为\r\nlinux下行结尾时\n,两者不同,所以无法识别,需要转换一下
参考我这篇文章:CentOS: $‘\r‘: command not found

Tomcat-init脚本文件,也就是/etc/init.d/tomcat脚本文件 (之前执行了移动并重命名Tomcat-init脚本文件的命令mv Tomcat-init /etc/init.d/tomcat)

所以此处的tomcat实际上是一个脚本文件的名称,即Tomcat-init脚本文件,内容见5.1 NO such file or directory 中的【修改后的tomcat脚本(即原来的Tomcat-init脚本,mv Tomcat-init /etc/init.d/tomcat):

//执行sh  deploy.sh base,报错$'\r': command not found
//sh  deploy.sh base
//这里修改为service tomcat start
service tomcat start

//1、dos2unix 脚本名,此处是dos2unix deploy.sh
//如果执行dos2unix deploy.sh报-bash:dos2unix:command not found,就使用yum install -y dos2unix 安装dos2unix
//如果执行成功,会报一个dos2unix: converting file deploy.sh to Unix format ...
//dos2unix deploy.sh  
//这里改为dos2unix tomcat 
dos2unix tomcat 

//2、安装dos2unix
yum install -y dos2unix

//3、再次执行dos2unix deploy.sh命令
//如果dos2unix deploy.sh执行成功,会报一个dos2unix: converting file deploy.sh to Unix format ...
//如果dos2unix deploy.sh执行成功后,再次执行sh  deploy.sh base还不行,依旧报 $'\r': command not found,就执行下面的sed命令
//这里改为再次执行dos2unix tomcat 
dos2unix tomcat 

//4、sed -i 's/\r//' 脚本名
//sed -i 's/\r//' deploy.sh
//这里改为sed -i 's/\r//' tomcat
sed -i 's/\r//' tomcat

//5、再次执行sh  deploy.sh base
//sh  deploy.sh base
//这里改为 service tomcat start
service tomcat start

在这里插入图片描述
启动成功
在这里插入图片描述

[root@freedom init.d]# service tomcat start
Starting tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
Tomcat is running with pid: 852

在这里插入图片描述

六、参考

【ECS生长万物之开源】手动部署Java Web环境(CentOS 7)
Tomcat官网
Windows11与CentOS7下配置与检测JDK与Maven环境变量
CentOS: $‘\r‘: command not found

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1222613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏5(附项目源码,完结)

文章目录 最终效果前言简单绘制一下环境显示当前波数生成不同的敌人控制游戏运行速度游戏结束最终效果扩展源码完结最终效果 前言 本期是本项目的最后一篇,主要内容是配置环境、生成不同敌人、结束重开。 简单绘制一下环境 环境可以按自己喜好,去找一些瓦片,想怎么配置怎…

ExoPlayer架构详解与源码分析(9)——TsExtractor

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

智能驾驶汽车虚拟仿真视频数据理解(一)

赛题官网 datawhale 赛题介绍 跑通demo paddle 跑通demo torch 提交的障碍物取最主要的那个&#xff1f;不考虑多物体提交。障碍物&#xff0c;尽可能选择状态发生变化的物体。如果没有明显变化的&#xff0c;则考虑周边的物体。车的状态最后趋于减速、停止&#xff0c;时序…

python→函数曲线

CSDN中公式一栏&#xff0c;亦可以插入Latex函数。 以函数 为例 也可以用Latex写如下代码&#xff1a; \documentclass{article} \usepackage{amsmath} \begin{document} \[ y \frac{n}{n30} \] \end{document} 如下&#xff1a; 那么&#xff0c;该函数图像如何呢&#xf…

vue+element实现多级表头加树结构

标题两种展示方式 方式一 完整代码: <template><div class"box"><el-tableref"areaPointTable":data"tableData"border:span-method"objectSpanMethod":header-cell-style"tableHeaderMerge"><el-ta…

数据库编程sqlite3库安装及使用

数据库编程 数据库的概念 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据库是存放数据的仓库。它的存储空间很大&#xff0c;可以存放百万条、千万条、上亿条数据。但是数据库并不是…

一起学docker系列之五docker的常用命令--操作容器的命令

目录 前言1 启动容器2 查看容器3 退出容器4 启动已经停止的容器5 重启容器6 停止容器7 删除已经停止的容器8 启动容器说明和举例9 查看容器日志10 查看容器内运行的进程11 查看容器内部细节12 进入正在运行的容器并进行交互13 导入和导出容器结语 前言 当涉及到容器化技术&…

Java学习之路 —— 网络通信

文章目录 1. InetAddress2. UDP3. TCP4. 总结 1. InetAddress InetAddress的常用方法如下&#xff1a; public class InetAddressDemo {public static void main(String[] args) throws Exception{// 1. 获取本机IP地址对象InetAddress ip1 InetAddress.getLocalHost();Sys…

飞熊领鲜参加「第十届中国产业数字化大会」获创新企业数字化百强

11月16日至17日&#xff0c;托比网“第十届中国&#xff08;南京&#xff09;产业数字化大会”在南京举行。作为“中国&#xff08;南京&#xff09;电子商务大会”的一部分&#xff0c;本次会议由江苏省商务厅、南京市人民政府指导&#xff0c;南京市商务局、南京市鼓楼区人民…

Windows安装Java环境(OracleJDK)

在下载之前&#xff0c;我们先了解一下java的前世今生 1991年&#xff1a;Java 的前身 Oak 由 James Gosling 和他的团队在 Sun Microsystems 公司开发。1995年&#xff1a;Oak 更名为 Java&#xff0c;并在同年发布。Java 1.0 版本正式推出。1996年&#xff1a;Sun Microsyst…

wpf devexpress 添加GanttControl到项目

这个教程示范如何添加GanttControl 到你的项目使用内置GanttControl数据类。 要求 添加 Devexpress.Wpf.Gantt Nuget包到你的项目使用GanttControl. 数据模型 GanttControl携带和内置数据对象&#xff0c;可以使用创建视图模型&#xff1a; GanttTask 呈现甘特图任务 Gan…

web服务器练习---配置nginx三种虚拟主机

在做实验之前&#xff0c;大家先安装nginx服务&#xff0c;有两种安装方法&#xff1a; 1、rpm包安装&#xff08;安装过程简单&#xff0c;适用于学习阶段&#xff0c;方便测试&#xff09; 2、源码安装&#xff08;安装过程较为复杂&#xff0c;适用于生产环境&#xff09;…

每天一点python——day69

#字符串的比较操作使用的符号&#xff1a; >[大于]&#xff0c;>[大于等于]&#xff0c;<[小于]&#xff0c;<[小于等于]&#xff0c;[等于]&#xff0c;![不等于]#如图&#xff1a; #例子&#xff1a;比较原理释义&#xff1a;每个字符在计算机里面都有一个原始值…

如何解決開機後出現BitLocker修復畫面/取得BitLocker金鑰

[Notebook/Desktop/AIO] 疑難排解 - 如何解決開機後出現BitLocker修復畫面/取得BitLocker金鑰 如果您遇到開機進入系統後出現BitLocker修復畫面&#xff0c;這表示您電腦的硬碟已受BitLocker保護(硬碟被鎖住)。當系統在維修以及其他因素下做過硬體變動或BIOS更新設置變動&…

【大模型应用开发教程】动手学大模型应用开发,一起探索LLM Universe

动手学大模型应用开发 01 开源初心02 教程内容03 学习指南04 文章最后 原文链接-奇想星球 LLM 正逐步成为信息世界的新革命力量&#xff0c;其通过强大的自然语言理解、自然语言生成能力&#xff0c;为开发者提供了新的、更强大的应用开发选择。随着国内外井喷式的 LLM API 服…

【云服务器选型指南:五大关键】

云服务器选型指南 写在前面 在云计算时代&#xff0c;云服务器&#xff08;Elastic Compute Service, ECS&#xff09;凭借其简单高效、安全可靠、处理能力可弹性伸缩等特点&#xff0c;成为构建稳定、安全应用的首选。相比物理服务器&#xff0c;云服务器的管理方式更为简单…

盘点52个Python各行各业管理系统源码Python爱好者不容错过

盘点52个Python各行各业管理系统源码Python爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 源码下载链接&#xff1a;https://pan.baidu.com/s/1pcP-94UY_57sAd2oDB3i6Q?pwd8888 提取码&#xff1a;8888 项目名…

Flume学习笔记(1)—— Flume入门

Flume 概述 Flume 是 Cloudera 提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统 Flume 基于流式架构&#xff0c;灵活简单 Flume最主要的作用就是&#xff0c;实时读取服务器本地磁盘的数据&#xff0c;将数据写入到HDFS 基础架…

【SAP-QUERY】QUERY报表的创建

SQ03&#xff1a;创建用户组 环境-》查询区域-》选择标准区域 创建用户组和用户组描述 可选分配权限&#xff08;授权当前用户组下人员可以修改该query报表&#xff09; SQ02&#xff1a;创建信息集 确认区域是否为标准区域 选择创建的用户组 创建信息集&#xff1a;输入描述&a…

Nacos 配置中心底层原理(1.X版本)

前言 Nacos 1.X版本 是长轮询 Nacos 2.X版本 是GRPC 长轮询 概念 客户端会轮询向服务端发出一个长连接请求&#xff0c;这个长连接最多30s就会超时&#xff0c;服务端收到客户端的请求会先判断当前是否有配置更新&#xff0c;有则立即返回&#xff0c;如果没有服务端会将这个…