tomcat的tar包转换成rpm包的保姆级教程

环境说明 :centos 7

1. 安装打包工具:

yum install -y rpm-build rpmdevtools

2. 创建 RPM 打包环境:

rpmdev-setuptree

输入之后是下面的结果

~/rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

准备 Tomcat 源码包

 

重命名为规范格式:

mv apache-tomcat-8.0.33.tar.gz tomcat-8.0.33.tar.gz

放到 SOURCES 目录:

cp tomcat-8.0.33.tar.gz ~/rpmbuild/SOURCES/

编写 SPEC 文件

新建并编辑

vi ~/rpmbuild/SPECS/tomcat.spec

文件内容(下面是适用于tomcat8.0.33)

Name:           tomcat
Version:        8.0.33
Release:        1%{?dist}
Summary:        Apache Tomcat 8 - Java Web Server
​
License:        Apache
URL:            https://tomcat.apache.org/
Source0:        tomcat-%{version}.tar.gz
​
BuildArch:      noarch
Requires:       java-1.8.0-openjdk
​
%description
Apache Tomcat 8 is an open-source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.
​
%prep
%setup -q -n apache-tomcat-%{version}
​
%build
# No build steps required
​
%install
# 安装 Tomcat 到 /opt/tomcat
mkdir -p %{buildroot}/opt/tomcat
cp -a * %{buildroot}/opt/tomcat/
​
# 添加 systemd 服务文件
mkdir -p %{buildroot}/usr/lib/systemd/system
cat > %{buildroot}/usr/lib/systemd/system/tomcat.service <<'EOF'
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
​
[Service]
Type=forking
​
Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
​
User=root
Group=root
Restart=on-failure
​
[Install]
WantedBy=multi-user.target
EOF
​
%files
/opt/tomcat
/usr/lib/systemd/system/tomcat.service
​
%post
# 让 systemd 识别服务
/bin/systemctl daemon-reload
/bin/systemctl enable tomcat.service || :
​
%preun
if [ $1 = 0 ]; then/bin/systemctl stop tomcat.service || :/bin/systemctl disable tomcat.service || :
fi
​
%changelog
* Sun Jul 06 2025 李先生 <li@example.com> - 8.0.33-1
- Initial packaging of Apache Tomcat 8.0.33

 

开始打包

rpmbuild -ba ~/rpmbuild/SPECS/tomcat.spec

查看

ls /root/rpmbuild/RPMS/noarch/

安装

yum -y install tomcat-8.0.33-1.el7.noarch.rpm  

 

 

启动并查看状态

systemctl start tomcat
systemctl status tomcat

 

 

浏览器界面查看

 

ip地址:8080

例如:   192.168.72.148:8080

 

 

 

SPEC文件解释

 

顶部元信息(软件基本信息)  
Name:           tomcat              # 软件包名称
Version:        8.0.33              # 主版本号
Release:        1%{?dist}           # 发布号,“1”为首次发布,“%{?dist}”代表系统发行版宏(如.el7)
Summary:        Apache Tomcat 8 - Java Web Server  # 简要描述
​
许可证、主页和源码
License:        Apache              # 使用的许可证类型
URL:            https://tomcat.apache.org/   # 项目官网
Source0:        tomcat-%{version}.tar.gz     # 指定源代码 tar 包名称,对应 SOURCES 目录中的文件
Source0 指定了您打包用的原始源码包,比如 tomcat-8.0.33.tar.gz。
​
架构与依赖
BuildArch:      noarch                      # 表示平台无关(纯脚本或 Java)
Requires:       java-1.8.0-openjdk          # 指定依赖的运行环境,安装时会自动安装 JDK
​
软件说明(长描述)
%description
Apache Tomcat 8 is an open-source implementation...
#这是 RPM 安装包中的详细介绍内容,会出现在 rpm -qi tomcat 命令输出中。
​
源码解包阶段
%prep
%setup -q -n apache-tomcat-%{version}
#%prep 段用于准备源码。%setup 自动解压 Source0,并进入解压后的目录:
#-q 安静模式(不输出太多信息)
#-n apache-tomcat-%{version} 指定解压后目录名,比如 apache-tomcat-8.0.33
​
构建阶段(Java 无需编译)
%build
\# No build steps required
#Tomcat 是二进制发布版,无需编译,因此这一段空着。
​
安装阶段(关键部分)
%install
mkdir -p %{buildroot}/opt/tomcat
cp -a * %{buildroot}/opt/tomcat/
#将 Tomcat 所有文件复制到 RPM 的打包根目录 %{buildroot} 下的 /opt/tomcat。
​
添加 systemd 服务文件
mkdir -p %{buildroot}/usr/lib/systemd/system
cat > %{buildroot}/usr/lib/systemd/system/tomcat.service <<'EOF'
...
EOF
#创建并写入 systemd 服务文件,安装 RPM 后系统可使用 systemctl start tomcat 管理服务。
​
文件列表(RPM 安装时包含哪些内容)
%files
/opt/tomcat
/usr/lib/systemd/system/tomcat.service
#指定哪些文件会被包含进 .rpm 安装包中。这两项就是 Tomcat 目录和 systemd 服务。
​
安装后动作(%post)
%post
/bin/systemctl daemon-reload
/bin/systemctl enable tomcat.service || :
#安装 RPM 后自动执行的命令:
#重新加载 systemd 配置
#设置 tomcat 服务开机启动(忽略错误)
​
卸载前动作(%preun)
%preun
if [ $1 = 0 ]; then
•    /bin/systemctl stop tomcat.service || :
•    /bin/systemctl disable tomcat.service || :
fi
#如果是卸载(而不是升级),就停止并禁用 tomcat 服务。
#$1 = 0 表示当前是卸载操作
#$1 = 1 表示是升级操作,不会执行清理动作
​
​
更新日志(%changelog)
%changelog
* Sun Jul 06 2025 李先生 <li@example.com> - 8.0.33-1
- Initial packaging of Apache Tomcat 8.0.33
#写明每次构建 RPM 的变更历史,便于管理版本。

 

总结SPEC文件说明

tomcat.spec
├── Name / Version / Release / Summary 等元信息
├── Source0: 下载用源代码 tar 包
├── %description: 包的描述
├── %prep: 解压源码包
├── %build: (空)
├── %install: 把文件放进构建目录 + 写 systemd 文件
├── %files: 声明包含哪些文件
├── %post: 安装后自动执行的命令
├── %preun: 卸载前执行的命令
└── %changelog: 历史记录

 

 

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

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

相关文章

【牛客算法】小美的数组删除

文章目录 一、题目介绍二、解题思路三、解题算法实现四、算法分析4.1 代码逻辑4.2 逆向遍历求MEX的设计精妙之处4.2.1 逆向遍历:解决MEX更新的连续性4.2.2 利用MEX的单调性4.2.3 空间复用与状态压缩4.2.4 与问题特性的完美契合4.2.5 总结:为什么说这个设计“妙”?五、算法复…

MyBatisPlus-01-环境初始化及简单应用

文章目录【README】【1】springboot集成mybatis-plus配置【1.1】目录结构【相关说明】【1.2】代码示例【pom.xml】【application.properties】【MybatisPlusNoteController】【UserAppService】【UserMapper】【UserPO】【建表语句】【2】演示【README】 本文代码参见&#xf…

Web爬虫编程语言选择指南

刚学爬虫的小伙伴常常为选择那种语言来写爬虫而烦恼&#xff0c;今天我将总结几种语言的优劣势&#xff0c;然后选择适合编写 Web爬虫 的编程语言。这就需要我们考虑开发效率、生态库支持、并发性能等因素。以下是主流选择及特点跟着一起看看吧&#xff1a; 1. Python&#xff…

学习日志06 python

加油&#xff0c;今天的任务是学习面向对象编程&#xff0c;设计一个简单的宠物管理系统&#xff08;宠物类、猫 / 狗子类&#xff09;&#xff0c;先做5道题目开启学习状态吧&#xff01;1 setdefault()在 Python 中&#xff0c;setdefault() 是字典&#xff08;dict&#xff…

基于Java+springboot 的车险理赔信息管理系统

源码、数据库、包调试源码编号&#xff1a;S595源码名称&#xff1a;基于springboot 的车险理赔信息管理系统用户类型&#xff1a;多角色&#xff0c;用户、事故调查员、管理员数据库表数量&#xff1a;14 张表主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven运…

MyDockFinder 绿色便携版 | 一键仿Mac桌面,非常简单

如果你既不想升级到Win11&#xff0c;又想体验Mac桌面的高级感&#xff0c;那么MyDockFinder将是你的最佳选择。这是一款专为Windows系统设计的桌面美化工具&#xff0c;能够将你的桌面转变成MacOS的风格。它提供了类似Dock栏和Finder的功能&#xff0c;让你在不更换操作系统的…

Babylon.js 材质克隆与纹理共享:你可能遇到的问题及解决方案

在 Babylon.js 中&#xff0c;材质&#xff08;Material&#xff09;和纹理&#xff08;Texture&#xff09;的克隆行为可能会影响渲染性能和内存管理&#xff0c;尤其是在多个材质共享同一纹理的情况下。本文将探讨&#xff1a;PBRMetallicRoughnessMaterial 的克隆机制&#…

信息素养复赛模拟1和模拟2的编程题标程

信息素养复赛模拟 11&#xff1a;楼层编号 #include<bits/stdc.h> using namespace std; int main(){int n, t;cin >> n >> t;int res 0;for(int i 1; i < n; i ){int x i;bool ok true;while(x){if(x % 10 t){ok false;}x / 10;}res ok;} cout &l…

Hadoop高可用集群搭建

Hadoop高可用(HA)集群是企业级大数据平台的核心基础设施&#xff0c;通过多主节点冗余和自动故障转移机制&#xff0c;确保系统在单点故障时仍能正常运行。本文将详细介绍如何基于CentOS 7搭建Hadoop 3.X高可用集群&#xff0c;涵盖环境准备、组件配置、集群启动及管理的全流程…

Next.js 实战笔记 1.0:架构重构与 App Router 核心机制详解

Next.js 实战笔记 1.0&#xff1a;架构重构与 App Router 核心机制详解 上一次写 Next 相关的东西都是 3 年前的事情了&#xff0c;这 3 年里 Next 也经历了 2-3 次的大版本变化。当时写的时候 Next 是 12 还是 13 的&#xff0c;现在已经是 15 了&#xff0c;从 build 到实现…

Pillow 安装使用教程

一、Pillow 简介 Pillow 是 Python 图像处理库 PIL&#xff08;Python Imaging Library&#xff09;的友好分支&#xff0c;是图像处理的事实标准。它支持打开、编辑、转换、保存多种图像格式&#xff0c;常用于图像批量处理、验证码识别、缩略图生成等应用场景。 二、安装 Pi…

SQL Server从入门到项目实践(超值版)读书笔记 20

9.4 数据的嵌套查询所谓嵌套查询&#xff0c;就是在一个查询语句中&#xff0c;嵌套进另一个查询语句&#xff0c;即&#xff0c;查询语句中可以使用另一个查询语句中得到的查询结果&#xff0c;子查询可以基于一张表或者多张表。子查询中常用的操作符有ANY、SOME、ALL、IN、EX…

【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案

【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案 问题1&#xff1a;序列值不自动刷新问题 下面SQL只针对单库操作以及每个序列只绑定一张表的情况 -- 自动生成的序列&#xff0c;设置序列值 with sequences as (select *from (select table_schema,table_…

【Maven】Maven命令大全手册:28个核心指令使用场景

Maven命令大全手册&#xff1a;28个核心指令使用场景 Maven命令大全手册&#xff1a;28个核心指令深度解析一、构建生命周期核心命令1. mvn clean2. mvn compile3. mvn test4. mvn package5. mvn install6. mvn deploy二、依赖管理命令7. mvn dependency:tree8. mvn dependency…

大语言模型(LLM)按架构分类

大语言模型&#xff08;LLM&#xff09;按架构分类的深度解析 1. 仅编码器架构&#xff08;Encoder-Only&#xff09; 原理 双向注意力机制&#xff1a;通过Transformer编码器同时捕捉上下文所有位置的依赖关系# 伪代码示例&#xff1a;BERT的MLM任务 masked_input "Th…

MySQL(120)如何进行数据脱敏?

数据脱敏&#xff08;Data Masking&#xff09;是指通过某种方式对敏感数据进行变形&#xff0c;使其在使用过程中无法识别原始数据&#xff0c;从而保护数据隐私。数据脱敏通常应用在开发、测试和数据分析等场景中。下面我们详细介绍如何在Java应用程序中进行数据脱敏&#xf…

使用 Dockerfile 构建基于 .NET9 的跨平台基础镜像

官方基础镜像准备 微软官方 dotnet sdk 基础镜像&#xff1a; docker pull mcr.microsoft.com/dotnet/sdk:9.0拉取 ubuntu 镜像&#xff1a; docker pull ubuntu:24.04更多资源请参考&#xff1a; dotnet sdk images&#xff0c;https://mcr.microsoft.com/en-us/artifact/mar/…

C++ : 线程库

C : 线程库一、线程thread1.1 thread类1.1.1 thread对象构造函数1.1.2 thread类的成员函数1.1.3 线程函数的参数问题1.2 this_thread 命名空间域1.2.1 chrono二、mutex互斥量库2.1 mutex的四种类型2.1.1 mutex 互斥锁2.2.2 timed_mutex 时间锁2.2.3 recursive_muetx 递归锁2.2.…

idea的使用小技巧,个人向

idea的使用小技巧&#xff0c;个人向 一、前言二、过程1、显示内存的使用情况2、去掉xml文件中的黄色背景3、显示所有打开文件4、显示工具栏到菜单下面5、使用JDK8 一、前言 每次重装idea都需要重新设置一下&#xff0c;这里做个记录。 这些技巧只是个人感觉的好用 演示用的…

debian及衍生发行版apt包管理常见操作

好的&#xff0c;这是 Debian 及其衍生版&#xff08;如 Ubuntu&#xff09;使用的 apt 包管理器的常用命令速查表。 一点说明&#xff1a;apt 是新一代的命令行工具&#xff0c;整合了 apt-get 和 apt-cache 的常用功能&#xff0c;并提供了更友好的交互体验。本表主要使用现…