一个自动配置 opengrok 多项目的脚本
前段时间在服务器上配置 opengrok 阅读代码,项目有很多个,一个一个手动配置比较繁琐。
我从搭建 tomcat 和 opengrok,到配置和索引完 5 个 Android 项目,用了差不多一整天。
要是再让我手动配置几个项目,估计真要崩溃了,看到好多人都有配置 opengrok 多项目的需求,于是写了这个自动配置多项目的脚本。
1. 脚本源码
/public/opengrok$ cat setup-opengrok-projects.sh
#!/bin/bash
#
# Copyright (C) 2023, guyongqiangx All Rights Reserved.
#
# File Name: setup-opengrok-projects.sh
# Author: guyongqiangx
# Blog: https://blog.csdn.net/guyongqiangx
# Date: 2023-02-11
# Info: 批量配置 opengrok 项目
## opengrok 安装目录
OPENGROK_APP_DIR=/opt/opengrok/dist/opengrok-1.7.42
# tomcat 安装目录
TOMCAT_APP_DIR=/opt/tomcat/apache-tomcat-10.0.27
# 代码项目根目录
PROJECT_ROOT_DIR=/public/opengrok
# 服务器访问地址
SERVER_URL=http://localhost:8000# sudo 方式下用普通用户执行命令: "sudo -u username command"
USER="sudo -u guyongqiangx"# 带一个参数,当前项目
setup_opengrok_project() {PROJECT=$1DATA_DIR=${PROJECT_ROOT_DIR}/data/${PROJECT}ETC_DIR=${PROJECT_ROOT_DIR}/etc/${PROJECT}SRC_DIR=${PROJECT_ROOT_DIR}/src/${PROJECT}LOG_DIR=${PROJECT_ROOT_DIR}/log/${PROJECT}# 1. 准备项目的 data, etc 和 log 目录${USER} mkdir -p ${DATA_DIR} ${ETC_DIR} ${LOG_DIR}# 2. 准备项目的 logging.properties 文件${USER} cp ${OPENGROK_APP_DIR}/doc/logging.properties ${ETC_DIR}# 3. 更新项目的 logging.properties 文件PATTERN="java.util.logging.FileHandler.pattern =.*"REPLACE="java.util.logging.FileHandler.pattern = ${LOG_DIR}/opengrok%g.%u.log"# TODAY=$(date +%F)# AUTHOR=guyongqiangx# COMMENTS="$TODAY $AUTHOR - Set logging file location to ${PROJECT} etc dir"# sed -i "s!^${PATTERN}!# &\n# ${COMMENTS}\n${REPLACE}!" ${ETC_DIR}/logging.properties${USER} sed -i "s!^${PATTERN}!# &\n${REPLACE}!" ${ETC_DIR}/logging.properties# 4. 复制模板 source.war 到 tomcat 的 webapps 目录sudo cp ${OPENGROK_APP_DIR}/lib/source.war ${TOMCAT_APP_DIR}/webapps/${PROJECT}.war # 5. 更新项目的 tomcat 配置文件 web.xmlsudo opengrok-deploy -c ${ETC_DIR}/configuration.xml ${OPENGROK_APP_DIR}/lib/source.war ${TOMCAT_APP_DIR}/webapps/${PROJECT}.war# 6. 索引项目数据${USER} java \-Djava.util.logging.config.file=${ETC_DIR}/logging.properties \-jar ${OPENGROK_APP_DIR}/lib/opengrok.jar \-c /usr/local/bin/ctags \-s ${SRC_DIR} \-d ${DATA_DIR} \-P -S -G -W ${ETC_DIR}/configuration.xml \-U ${SERVER_URL}/${PROJECT} &> ${LOG_DIR}/index.log &${USER} echo "index project ${PROJECT} in background..."
}# for project in uboot-v2009.01 uboot-v2013.01 uboot-v2014.01 uboot-v2015.01
for project in $(ls ${PROJECT_ROOT_DIR}/src)
doecho "setup project ${project}..."setup_opengrok_project ${project}
donewhile [ $(ps -ef | grep -c opengrok.jar) -ne 1 ]
do${USER} echo -n .sleep 2
done# sudo service tomcat restart
sudo systemctl restart tomcat.service
echo "done!"
2. 如何使用?
2.1 配置脚本
使用前需要先安装好 tomcat 和 opengrok,关于如何安装请自行搜索解决。
然后在脚本文件中做以下配置:
# opengrok 安装目录
OPENGROK_APP_DIR=/opt/opengrok/dist/opengrok-1.7.42
# tomcat 安装目录
TOMCAT_APP_DIR=/opt/tomcat/apache-tomcat-10.0.27
# 项目根目录
PROJECT_ROOT_DIR=/public/opengrok
# 服务器访问地址
SERVER_URL=http://localhost:8000# 使用普通用户执行 sudo 命令: "sudo -u username command"
USER="sudo -u guyongqiangx"
其中最后一项是用 sudo 来执行普通用户操作,所以需要提供普通用户的用户名。
2.2 准备项目代码
然后将所有项目相关的代码放在项目根目录(PROJECT_ROOT_DIR
)的 src
子目录下,类似如下:
/public/opengrok$ tree . -L 2
.
├── setup-opengrok-projects.sh
└── src├── uboot-v2009.01├── uboot-v2013.01├── uboot-v2014.01├── uboot-v2015.01├── uboot-v2016.01├── uboot-v2017.01├── uboot-v2018.01├── uboot-v2019.01├── uboot-v2020.01├── uboot-v2021.01├── uboot-v2022.01└── uboot-v2023.0113 directories, 1 file
默认情况下,脚本会扫描根目录的 src
子目录下的所有文件夹,并以该文件夹的名字创建相应的项目。
如果只想对某几个指定的文件夹操作,可以修改脚本设置项目列表,类似如下:
for project in uboot-v2009.01 uboot-v2013.01 uboot-v2014.01 uboot-v2015.01
# for project in $(ls ${PROJECT_ROOT_DIR}/src)
doecho "setup project ${project}..."setup_opengrok_project ${project}
done
2.3 执行脚本配置所有项目
代码准备好以后,在项目根目录下用 sudo 权限执行脚本,如下:
/public/opengrok$ sudo bash setup-opengrok-projects.sh
[sudo] password for guyongqiangx:
setup project uboot-v2009.01...
index project uboot-v2009.01 in background...
setup project uboot-v2013.01...
index project uboot-v2013.01 in background...
...
setup project uboot-v2022.01...
index project uboot-v2022.01 in background...
setup project uboot-v2023.01...
index project uboot-v2023.01 in background...
..............done!
运行脚本后就是漫长的等待,直到脚本输出打印 “done!”
必须要用 sudo 方式执行脚本,因为部分操作需要 sudo 权限去修改 tomcat 安装目录下的文件。
其中,索引项目数据的日志重定向到 log 目录的 index.log
文件中了,例如:
/public/opengrok$ ls -lh log/uboot-v2009.01/
total 16M
-rw-r--r-- 1 root root 138K Feb 11 23:55 index.log
-rw-r--r-- 1 guyongqiangx users 16M Feb 11 23:55 opengrok0.0.log
2.4 项目的目录结构
项目配置好后的目录结构如下:
/public/opengrok$ tree . -L 2
.
├── data
│ ├── uboot-v2009.01
│ ...
│ └── uboot-v2023.01
├── etc
│ ├── uboot-v2009.01
│ ...
│ └── uboot-v2023.01
├── log
│ ├── uboot-v2009.01
│ ...
│ └── uboot-v2023.01
├── setup-opengrok-projects.sh
└── src├── uboot-v2009.01├── ...└── uboot-v2023.0152 directories, 1 file
其中,
- src 为各个 project 的代码
- data 为各个 project 索引后的数据
- etc 为各个 project 相应的配置文件
- log 为各个 project 索引操作和解析的日志
3. 问题
目前这种方式创建的多项目可以工作,但浏览时在项目之间切换比较麻烦。
我希望能够以比较简单的方式在不同项目的同一个文件之间切换,例如下面这种下拉列表方式:
点击下拉列表的项目,就可以查看对应项目中的同一个文件 /build/envsetup.sh
,在查看多个版本的同一文件时非常方便,知道如何配置的麻烦告知下,非常感谢~
相关文章:
一个自动配置 opengrok 多项目的脚本
前段时间在服务器上配置 opengrok 阅读代码,项目有很多个,一个一个手动配置比较繁琐。 我从搭建 tomcat 和 opengrok,到配置和索引完 5 个 Android 项目,用了差不多一整天。 要是再让我手动配置几个项目,估计真要崩溃…...
JAVA同步代码块 同步方法
JAVA同步代码块 & 同步方法 为了解决多线程操作共享数据时产生的安全问题 例如以下代码 if (ticket < 0) {// 卖完了break; } else {ticket--;System.out.println(Thread.currentThread().getName() "在卖票,还剩下" ticket "张")…...
分享111个助理类简历模板,总有一款适合您
分享111个助理类简历模板,总有一款适合您 111个助理类简历模板下载链接:https://pan.baidu.com/s/1JafYuLPQMmq37K4V0wiqWA?pwd8y54 提取码:8y54 Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj 设计师助理…...
Allegro如何更改临时高亮的颜色设置操作指导
Allegro如何更改临时高亮的颜色设置操作指导 在用Allegro做PCB设计的时候,当移动或者高亮某个对象之前,会被临时高亮一个颜色,方便查看,类似下图 运行高亮命令的时候,器件被临时高亮成了白色 软件默认的是白色,如何更改成其它颜色? 具体操作如下 点击Display选择Color…...
知识图谱嵌入技术研究综述
作者 张天成 1 , * 田 雪 1 , * 孙相会 1 , * 于明鹤 2 , * 孙艳红 1 , * 于 戈 摘要 知识图谱 是一种用图模型来描述知识和建模事物之间的关联关系的技术。 知识图谱嵌入 作为一种被广泛采用的知识表示方法。 主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中…...
Scratch少儿编程案例-水果忍者-超完整
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...
练 习
1.判断三个中最重的//依次输入相应的人的体重double people1, people2, people3;cout << "请输入第一个人体重" << endl;cin >> people1;cout << "请输入第二个人体重" << endl;cin >> people2;cout << "请…...
Urho3D整体结构
Urho3D引擎编译成一个库。从概念上讲,它由几个代表不同子系统或功能的“子库”组成。其中每个都位于Source/Urho3D目录下的子目录中: 容器:提供STL替换类和共享指针。数学:提供相交测试中使用的矢量、四元数和矩阵类型以及几何形状。Core:提供执行上下文…...
大数据技术之Hudi
Hudi概述 1.1 Hudi简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发&a…...
libxlsxwriter条件格式
今天来看一个libxlsxwriter的高级用法:一个条件格式的示例。 说它“高级”,也是基于非Excel专家的小白们的视角。对,没错,本小白正是这样的小白。 1 一个简单的问题 来看我们今天的场景问题:有一列数据,有…...
nodejs+vue+elementui在线求助系统vscode
目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 前端技术:nodejsvueelementui,视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进…...
电子技术——BJT差分输入对
电子技术——BJT差分输入对 本节我们来讨论BJT差分输入对。 共模输入 下图是BJT差分输入对的基本原理图: 首先我们考虑两端输入共模信号 VCMV_{CM}VCM : 此时 vB1vB2VCMv_{B1} v_{B2} V_{CM}vB1vB2VCM 因为电路的对称结构,所以 i…...
[MySQL教程②] - MySQL介绍和发展史
目录 ❤ MySQL介绍 ❤ 什么是数据库 ❤ 什么是数据 ❤ 数据库管理系统 ❤ NoSQL特性总览 ❤ NoSQL的分类、特点、典型产品 ❤ 常见的数据库产品有哪些? ❤ Oracle公司产品介绍 Oracle数据库版本介绍 Oracle的市场应用 MySQL数据库版本介绍 MyS…...
多表查询--实例
1 创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下: CREATE TABLE score ( id INT…...
Differentially Private Grids for Geospatial Data
文章目录abstractintroabstract 在本文中,我们解决了为二维数据集(如地理空间数据集)构建差异私有概要的问题。目前最先进的方法通过执行数据域的递归二进制分区和构造分区的层次结构来工作。我们表明,基于分区的概要方法的关键挑战在于选择正确的分区粒…...
Java学习记录day8
类与对象 继承例题 https://www.bilibili.com/video/BV1PU4y1E7nX?p55&vd_source8f80327daa664c039f5c342a25bcbbae(B站千峰马剑威Java基础入门视频第P55,记录的重要学习内容之一) final关键字 作用: 声明一个常量&…...
Solon2 开发之容器,三、注入或手动获取 Bean
1、如何注入Bean? 先了解一下Bean生命周期的简化版: 运行构建函数尝试字段注入(有时同步注入,没时订阅注入。不会有相互依赖而卡住的问题)Init 函数(是在容器初始化完成后才执行)…释放&#…...
微信小程序_调用openAi搭建虚拟伙伴聊天
微信小程序_调用openAi搭建虚拟伙伴聊天背景效果关于账号注册接口实现8行python搞定小程序实现页面结构数据逻辑结速背景 从2022年的年底,网上都是chagpt的传说,个人理解这个chatgpt是模型优化训练,我们在用chatgpt的时候就在优化这个模型&a…...
硬件工程师入门基础知识(一)基础元器件认识(一)
硬件工程师入门基础知识 (一)基础元器件认识(一) 今天水一篇hhh。介绍点基础但是实用的东西。 tips:学习资料和数据来自《硬件工程师炼成之路》、百度百科、网上资料。 1.贴片电阻 2.电容 3.电感 4.磁珠 1.贴片电…...
TCP的运输连接管理
TCP的运输连接管理 文章目录TCP的运输连接管理TCP报文格式简介首部各个字段的含义控制位(flags)TCP的连接建立抓包验证一些细节及解答TCP连接释放抓包验证一些细节及解答参考TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放时每一次面向连接的通信…...
地级市用电、用水、用气数据指标
用电用水量和煤气及液化石油气供应及利用情况可以反映出城市基础设施的建设情况!之前我们基于历年的《中国城市统计年鉴》整理了1999—2020年的人口数量数据指标、人口变动数据指标、用地相关数据指标、污染物排放和环境治理相关数据指标、地区生产总值及一二三产构…...
安装deepinlinuxV20.8配置docker和vscode开发c语言
# 重装的原因 某个开发任务时,发现需要glibc2.25,本机版本比较低,就下载源码configure make makeinstall,结果失败了, 看来与系统用的glibc有冲突,造成部分库版本不一致,打开终端出现段错误&#x…...
java08-面向对象3
一:static 关键字:静态的 1.可以用来修饰的结构:主要用来修饰类的内部结构 属性、方法、代码块、内部类 2. static 修饰属性:静态变量(或类变量) 2.1 属性,是否使用static修饰,又分为静态属…...
【Spark分布式内存计算框架——Spark Core】8. 共享变量
第七章 共享变量 在默认情况下,当Spark在集群的多个不同节点的多个任务上并行运行一个函数时,它会把函数中涉及到的每个变量,在每个任务上都生成一个副本。但是,有时候需要在多个任务之间共享变量,或者在任务(Task)和…...
C++多态常见面试题
1.什么是多态 简单点说,就是多种形态,具体就是完成某个行为,当不同的对象去完成时产生的不同形态。多态分为静态多态和动态多态,静态多态一般指的是函数重载,在编译阶段通过函数名修饰规则,不同类型调用不同…...
字母板上的路径 题解,力扣官方出来挨打(小声)
字母板上的路径 我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。 我们可以按下面的指令规则行动:…...
代码随想录算法训练营第二十六天 | 39. 组合总和,40.组合总和II,131.分割回文串
一、参考资料组合总和题目链接/文章讲解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html 视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ 组合总和II题目链接/文章讲解:https://programmercarl.com/004…...
vueday01-脚手架安装详细
一、vue脚手架安装命令npm i -g vue/cli 或 yarn global add vue/cli安装上面的工具,安装后运行 vue --version ,如果看到版本号,说明安装成功或 vue -V工具安装好之后,就可以安装带有webpack配置的vue项目了。创建项目之前&#…...
初识cesium3d(一)
使用ViteVue3.2Cesium。Vite需要Node.js版本14.18及以上版本。Vite命令创建的工程会自动生成vite.config.js文件,来配置一些相关的参数。 1、使用Vite创建vue3项目 # npm npm init vitelatest cesium-app -- --template vue # yarn yarn create vite cesium-app…...
点云转3D网格【Python】
推荐:使用 NSDT场景设计器 快速搭建 3D场景。 在本文中,我将介绍我的 3D 表面重建过程,以便使用 Python 从点云快速创建网格。 你将能够导出、可视化结果并将结果集成到您最喜欢的 3D 软件中,而无需任何编码经验。 此外࿰…...
深圳做网站推广的公司哪家好/徐州百度推广公司
在树的模块中,讲解树的结构化特性。会以MySQL语法树为例,看树是如何在 Amazon AWS 中以超大型数据库查询起到中流砥柱的作用的,后半部分则会拆解 LSM 树在 Apache 项目中的应用。 树和图最大的区别就是有没有环。树是没有环的图。因为没有遍历…...
阿甘网站建设/广告投放公司
git传送门 转载于:https://www.cnblogs.com/syaoyao/p/5463924.html...
wordpress评论表单/互联网项目
public static void register(BeanDefinitionRegistry registry, String… packageNames) { // 如果已经存在该 BEAN ,则修改其包(package)属性 // BEAN 就是 AutoConfigurationPackages,用于存储自动配置包以供稍后引用 if (regi…...
版本设计网站/北京全网营销推广
数据倾斜是怎么发生的? 数据倾斜:shuffle过程数据分布不均匀。 shuffle:洗牌。 分步式计算,相同key的数据会到一个节点去处理。 举个例子:某宝想统计各个商家的一年销售额,有的商家卖了很多产品࿰…...
青浦专业做网站/百度一下就知道百度首页
MySQL字符集与排序规则MySQL支持的字符集字符集与排序规则排序规则的命名使用字符集与排序规则服务器级别的字符集数据库级别的字符集表级别的字符集列级别的字符集字符串级别的字符集National字符集字符集(character set)可以理解为符号(sym…...
学php到做网站要多久/盐城seo优化
CineBench R15测试:考验CPUGPU能力CineBench使用的是针对电影电视行业开发的Cinema 4D特效软件引擎,是很有说服力的一套CPU和显卡测试系统。考虑到惠普ZBook Studio G3搭配的是Windows 10 Pro 64操作系统,所以我们也选择了支持64位操作系统的…...