Genome-wide association studies in R

全基因组关联(GWA)研究扫描整个物种基因组,寻找多达数百万个SNPs与特定感兴趣特征之间的关联。值得注意的是,感兴趣的性状实际上可以是归因于群体的任何类型的表型,无论是定性的(例如疾病状态)还是定量的(例如身高)。本质上,给定p个SNP和n个样本或个体,GWA分析将拟合p个独立的单变量线性模型,每个模型基于n个样本,使用每个SNP的基因型作为感兴趣特征的预测因子。每个P检验中的关联显著性(P值)由相应SNP的系数估计确定(从技术上讲,关联的显著性为)。请注意,由于这些测试是独立的且数量众多,因此在设置并行GWA分析时有很大的计算优势(我们将很快进行)。非常合理的是,有必要使用多种假设检验方法,如Bonferroni、Benjamini Hochberg或错误发现率(FDR)来调整所得的P值。GWA研究现在在许多不同物种的遗传学中很常见。

读取数据

让我们首先从三个民族中的每一个导入PLINK转换的.ded、.fam和.bim Illumina文件。我们将使用snpStats包中的函数read.plink,并在本教程的其余部分中处理生成的对象。此函数读取.bed、.fam和.bim,并创建一个包含三个元素的列表——$genesis、$fam和$map。第一个包含从所有样本中确定的所有SNP,第二个包含关于谱系和性别的信息,第三个包含SNP的基因组坐标。目前,我们共有323人(110名中国人、105名印度人和108名马来人)和2527458个SNPs。接下来,我们将把$genetype中存储的Illumina SNP ID更改为更传统的rs ID,这将使我们能够在USCS基因组浏览器中放大候选SNP周围的基因组区域。我准备了一个表来建立两者之间的对应关系,这样我们就可以轻松地切换ID。

library(snpStats)
load("conversionTable.RData")

pathM <- paste("Genomics/108Malay_2527458snps", c(".bed", ".bim", ".fam"), sep = "")
SNP_M <- read.plink(pathM[1], pathM[2], pathM[3])

pathI <- paste("Genomics/105Indian_2527458snps", c(".bed", ".bim", ".fam"), sep = "")
SNP_I <- read.plink(pathI[1], pathI[2], pathI[3])

pathC <- paste("Genomics/110Chinese_2527458snps", c(".bed", ".bim", ".fam"), sep = "")
SNP_C <- read.plink(pathC[1], pathC[2], pathC[3])

# Merge the three SNP datasets
SNP <- rbind(SNP_M$genotypes, SNP_I$genotypes, SNP_C$genotypes)

# Take one bim map (all 3 maps are based on the same ordered set of SNPs)
map <- SNP_M$map
colnames(map) <- c("chr", "SNP", "gen.dist", "position", "A1", "A2")

# Rename SNPs present in the conversion table into rs IDs
mappedSNPs <- intersect(map$SNP, names(conversionTable))
newIDs <- conversionTable[match(map$SNP[map$SNP %in% mappedSNPs], names(conversionTable))]
map$SNP[rownames(map) %in% mappedSNPs] <- newIDs

接下来,我们导入并合并三个脂质数据集(存储为.txt),并确定SNP和脂质数据集中都存在哪些样本。在以下分析中,我们将使用两个平台中介绍的样本子集,共计319个。最后,我们创建一个列表genData,存储合并的SNP数据($SNP),这是三个$map中的一个,因为它们都是相同的($map)和合并的脂质数据($LIP)。最后,让我们为后续步骤保存RAM,并在将genData保存到之后删除所有文件。RData文件。

# Load lipid datasets & match SNP-Lipidomics samples
lipidsMalay <- read.delim("Lipidomic/117Malay_282lipids.txt", row.names = 1)
lipidsIndian <- read.delim("Lipidomic/120Indian_282lipids.txt", row.names = 1)
lipidsChinese <- read.delim("Lipidomic/122Chinese_282lipids.txt", row.names = 1)
all(Reduce(intersect, list(colnames(lipidsMalay),
colnames(lipidsIndian),
colnames(lipidsChinese))) == colnames(lipidsMalay)) # TRUE
lip <- rbind(lipidsMalay, lipidsIndian, lipidsChinese)

matchingSamples <- intersect(rownames(lip), rownames(SNP))
SNP <- SNP[matchingSamples,]
lip <- lip[matchingSamples,]

genData <- list(SNP = SNP, MAP = map, LIP = lip)
save(genData, file = "PhenoGenoMap.RData")

# Clear memory
rm(list = ls())

预处理

让我们重新加载genData并对其进行清理。简而言之,数据的预处理包括
丢弃呼叫率<1或MAF<0.1的SNPs丢弃呼叫率<100%、IBD亲缘系数>0.1或近交系数|F|>0.1的样本呼叫率是进行基因分型的SNPs(或样本)的比例。例如,特定SNP(样本)的呼叫率为0.95意味着丢失了5%的值。因为我们有这么多的SNP,我们可以通过对SNP和样本施加1的呼叫率阈值,在$SNP矩阵中绝对没有遗漏值。如果你想放宽门槛并容忍缺失的值,请记住,你需要运行一个完整的程序来对这些值进行指责。Reed等人,2015描述了一种基于PCA的插补方法,该方法利用1000基因组计划作为代理,以防您感兴趣。
次要等位基因频率(MAF)表示每个SNP的最不常见等位基因的比例。当然,很难检测出与罕见变异的关联,这就是为什么我们选择低MAF值。我读过的大多数GWA研究通常报告MAF阈值为0.05。在这里,我选择了更严格的0.1,因为我们有大量的数据,而且由于所有这些都是为了说明目的,我们希望进行快速的GWA分析。

library(snpStats)
library(doParallel)
library(SNPRelate)
library(GenABEL)
library(dplyr)
source("GWASfunction.R")
load("PhenoGenoMap.RData")

# Use SNP call rate of 100%, MAF of 0.1 (very stringent)
maf <- 0.1
callRate <- 1
SNPstats <- col.summary(genData$SNP)

maf_call <- with(SNPstats, MAF > maf & Call.rate == callRate)
genData$SNP <- genData$SNP[,maf_call]
genData$MAP <- genData$MAP[maf_call,]
SNPstats <- SNPstats[maf_call,]

接下来,我们需要考虑表现出过度杂合性的样本——从技术上讲,偏离Hardy-Weinberg平衡(HWE),

# Sample call rate & heterozygosity
callMat <- !is.na(genData$SNP)
Sampstats <- row.summary(genData$SNP)
hetExp <- callMat %*% (2 * SNPstats$MAF * (1 - SNPstats$MAF)) # Hardy-Weinberg heterozygosity (expected)
hetObs <- with(Sampstats, Heterozygosity * (ncol(genData$SNP)) * Call.rate)
Sampstats$hetF <- 1-(hetObs/hetExp)
# Use sample call rate of 100%, het threshold of 0.1 (very stringent)
het <- 0.1 # Set cutoff for inbreeding coefficient;
het_call <- with(Sampstats, abs(hetF) < het & Call.rate == 1)
genData$SNP <- genData$SNP[het_call,]
genData$LIP <- genData$LIP[het_call,]

最后,我们将使用基于血统认同的亲属系数(IBD)来研究样本之间的相关性。请注意,SNPRelate包中的这些函数需要GDS文件。出于这个原因,我们首先需要将来自三个群体的.bed、.fam和.bim文件聚合到convertGDS中。函数snpgdsBED2GDS2创建这部分分析所需的GDS。为了确定样本对之间的亲缘关系系数,我们将使用不相关SNPs的子集,以便进行无偏估计。为此,我们将使用连锁不平衡(LD)作为标记之间相关性的衡量标准。LD的范围从0到1,其值越高,两个SNP就越有可能共同分离并因此相关。在这里,我们将利用LD<0.2(p~12000)的SNPs子集来确定IBD亲缘系数。我用函数snpgdsLDpruning计算LD大约花了2个小时,所以要耐心。接下来,根据Reed等人,2015,我们将排除所有亲缘系数>0.1的样本。

 

# LD and kinship coeff
ld <- .2
kin <- .1
snpgdsBED2GDS(bed.fn = "convertGDS.bed", bim.fn = "convertGDS.bim",
fam.fn = "convertGDS.fam", out.gdsfn = "myGDS", cvt.chr = "char")
genofile <- snpgdsOpen("myGDS", readonly = F)
gds.ids <- read.gdsn(index.gdsn(genofile, "sample.id"))
gds.ids <- sub("-1", "", gds.ids)
add.gdsn(genofile, "sample.id", gds.ids, replace = T)
geno.sample.ids <- rownames(genData$SNP)
# First filter for LD
snpSUB <- snpgdsLDpruning(genofile, ld.threshold = ld,
sample.id = geno.sample.ids,
snp.id = colnames(genData$SNP))
snpset.ibd <- unlist(snpSUB, use.names = F)
# And now filter for MoM
ibd <- snpgdsIBDMoM(genofile, kinship = T,
sample.id = geno.sample.ids,
snp.id = snpset.ibd,
num.thread = 1)
ibdcoef <- snpgdsIBDSelection(ibd)
ibdcoef <- ibdcoef[ibdcoef$kinship >= kin,]

# Filter samples out
related.samples <- NULL
while (nrow(ibdcoef) > 0) {
# count the number of occurrences of each and take the top one
sample.counts <- arrange(count(c(ibdcoef$ID1, ibdcoef$ID2)), -freq)
rm.sample <- sample.counts[1, 'x']
cat("Removing sample", as.character(rm.sample), 'too closely related to', sample.counts[1, 'freq'],'other samples.\n')

# remove from ibdcoef and add to list
ibdcoef <- ibdcoef[ibdcoef$ID1 != rm.sample & ibdcoef$ID2 != rm.sample,]
related.samples <- c(as.character(rm.sample), related.samples)
}
genData$SNP <- genData$SNP[!(rownames(genData$SNP) %in% related.samples),]
genData$LIP <- genData$LIP[!(rownames(genData$LIP) %in% related.samples),]

预处理后,我们留下316个样本(110个中国人、100个印度人和106个马来人),其特征在于795668个SNP标记和282个脂质物种。请注意,由于LD修剪过程是随机的,因此您的样本量可能略有不同。

分析

主成分分析

既然我们已经完成了预处理,那么使用主成分分析(PCA)检查基因型数据中最大的变异源并找出异常值或聚类模式可能是个好主意。因为我们使用的是S4对象,所以我们将使用SNPRelate中的PCA函数snpgdsPCA。让我们绘制前两个主要组件(PC)。

# PCA
pca <- snpgdsPCA(genofile, sample.id = geno.sample.ids, snp.id = snpset.ibd, num.thread = 1)
pctab <- data.frame(sample.id = pca$sample.id,
PC1 = pca$eigenvect[,1],
PC2 = pca$eigenvect[,2],
stringsAsFactors = F)

origin <- read.delim("countryOrigin.txt", sep = "\t")
origin <- origin[match(pca$sample.id, origin$sample.id),]

pcaCol <- rep(rgb(0,0,0,.3), length(pca$sample.id)) # Set black for chinese
pcaCol[origin$Country == "I"] <- rgb(1,0,0,.3) # red for indian
pcaCol[origin$Country == "M"] <- rgb(0,.7,0,.3) # green for malay

png("PCApopulation.png", width = 500, height = 500)
plot(pctab$PC1, pctab$PC2, xlab = "PC1", ylab = "PC2", col = pcaCol, pch = 16)
abline(h = 0, v = 0, lty = 2, col = "grey")
legend("top", legend = c("Chinese", "Indian", "Malay"), col = 1:3, pch = 16, bty = "n")
dev.off()
不出所料,795668个SNP标记清楚地描绘了这三个群体。研究结果还表明,与印度人相比,中国人和马来人更接近彼此(这一观察结果可以通过分层聚类等方法更好地解决)。此外,前两个PC没有发现明显的异常值。一切都很好,可以继续进行GWA。

全基因组联合

最后,抵抗力。从282种脂质中,我选择了最熟悉的胆固醇作为感兴趣的特征之一。您可以完全自由地选择不同的脂质种类并继续操作。我们将使用Reed等人2015年提供的GWA函数,并进行一些小的修改。我建议您打开脚本GWAS函数。R,然后浏览一遍。这是一个优秀的、文档丰富的并行化实现。注意,glm函数用于确定每个SNP与感兴趣的性状之间的关联的显著性。如果你想知道,glm比lm更通用,因为它可以进行高斯、泊松、二项和多项回归/分类,这取决于你感兴趣的特征是如何分布的(表型文件中的所有脂质都是高斯的)。该GWA函数不会创建变量,而是编写一个.txt汇总表,列出每个SNP的系数估计\β,t和相应的P值,以及相应的基因组坐标。2012年年中,我使用MacBook Pro(8Gb,2.9 GHz英特尔酷睿i7)运行GWA功能花了大约1.5个小时。

# Choose trait for association analysis, use colnames(genData$LIP) for listing
# NOTE: Ignore the first column of genData$LIP (gender)
target <- "Cholesterol"

phenodata <- data.frame("id" = rownames(genData$LIP),
"phenotype" = scale(genData$LIP[,target]), stringsAsFactors = F)

# Conduct GWAS (will take a while)
start <- Sys.time()
GWAA(genodata = genData$SNP, phenodata = phenodata, filename = paste(target, ".txt", sep = ""))
Sys.time() - start # benchmark

一旦完成,我们可以使用所谓的曼哈顿图来可视化结果。我们所需要的只是加载在前一步中编写的.txt汇总表,添加一个带有-\log_{10}(P)的列,并根据所有SNP的基因组坐标绘制这些显著性估计。

# Manhattan plot
GWASout <- read.table(paste(target, ".txt", sep = ""), header = T, colClasses = c("character", rep("numeric",4)))
GWASout$type <- rep("typed", nrow(GWASout))
GWASout$Neg_logP <- -log10(GWASout$p.value)
GWASout <- merge(GWASout, genData$MAP[,c("SNP", "chr", "position")])
GWASout <- GWASout[order(GWASout$Neg_logP, decreasing = T),]

png(paste(target, ".png", sep = ""), height = 500,width = 1000)
GWAS_Manhattan(GWASout)
dev.off()

此外,一条完整的(分别为虚线)线表示1000000次(分别为10000次)测试中Bonferroni调整的\alpha=0.05的水平。

我们发现,共有四个SNP通过了“宽松”的Bonferroni阈值(没有一个通过“硬”阈值)。这些是SNPs rs7527051(Chr.1)、rs12140539(与第一个Chr.1共定位)、rs9509213(Chr.13)和rs2250402(Chr.15)。
在进行这四次点击之前,将所得P值的分布与偶然预期的分布进行对比是有帮助的,以确保没有混淆的系统性偏差。这很容易用分位数-分位数(Q-Q)图来解决。顾名思义,它根据分位数比较两种分布。在目前的情况下,我们想将我们的t统计数据的分布与偶然获得的分布进行对比。如果两个分布的形状相同,Q-Q图将显示一条x=y线。因此,来自可靠GWA分析的Q-Q图将显示一条x=y线,其中只有很少的偏差值表明存在关联。否则,如果线向上或向下移动,GWA分析可能会受到混杂因素的影响。我们将使用GenABEL包中的函数estlambda绘制Q-Q图。

# QQ plot using GenABEL estlambda function
png(paste(target, "_QQplot.png", sep = ""), width = 500, height = 500)
lambda <- estlambda(GWASout$t.value**2, plot = T, method = "median")
dev.off()

由此得到的Q-Q图清楚地描绘了一条与x=y(黑色)重叠的趋势线(λ=0.99,红色)和右尾部的轻微偏差,因此我们可以对我们的结果充满信心。

候选标记的功能

见解最后,我们将尝试使用USCS基因组浏览器(输入基因组浏览器,在文本框中插入SNP ID,输入并缩小),通过搜索其附近的基因来找到这四个候选SNP的功能相关性。我发现rs9509213(Chr.13)正好落在CRYL1(晶体λ1,内含子序列)上,使其成为后续研究的有趣候选者。

SNP rs9509213在图的底部显示为一个黑色文本框,其坐标由一条垂直的黄线突出显示。CRYL1基因模型显示在染色体模型(最上面)下方的顶部。
有趣的是,最近有一份出版物发现,“POE、HP和CRYL1都与阿尔茨海默病有关,阿尔茨海默病的病理学涉及脂质和胆固醇途径。”。
最后,我想谈谈对候选基因进行实验验证的必要性,以验证由此产生的SNP特征关联。在这种特殊的情况下,可以测试在小鼠的胆固醇水平中过表达或敲除CRYL1的直系同源物的效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式数据实现跨设备数据同步的N个秘密 | 分布式数据管理解析(二)

上期我们给大家带来分布式数据管理如何完成数据存储&#xff0c;数据同步&#xff0c;数据跨端访问&#xff0c;并保证整个过程中跨设备数据安全的解读。 这都得益于分布式数据管理平台抽象出的三大关键技术——分布式数据库&#xff0c;分布式文件系统和融合搜索。 那么这三…

Scrapy IP()类 编程指南(基础)

Scrapy IP()类 编程指南&#xff08;基础&#xff09; IP简介 工欲善其事&#xff0c;必先利其器&#xff0c;在聊Scapy IP类时&#xff0c;我们先要了解IP是什么。 IP指的是Internet Protocol&#xff08;互联网协议&#xff09;的数据包。Internet Protocol是互联网上用于在…

取消Vscode在输入符号时自动补全

取消Vscode在输入符号时自动补全 取消Vscode在输入符号时自动补全问题演示解决方法 取消Vscode在输入符号时自动补全 问题演示 在此状态下输入/会直接自动补全, 如下图 笔者想要达到的效果为可以正常输入/而不进行补全, 如下图 解决方法 在设置->文本编辑器->建议, 取消…

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程 和之前实现的YOLOv2一样&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv3的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv3检测器&#xff0c;来对YOLOv3有…

<蓝桥杯软件赛>零基础备赛20周--第19周--最短路

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

OpenCV-28 全局二值化

一、形态学概念 什么是形态学&#xff1f; 1&#xff09;指一系列处理图像型状特征的图像处理技术 2&#xff09;形态学的基本思想是利用一直特殊的结构元&#xff08;本质上是卷积核&#xff0c;且这个卷积核的值只有1和0&#xff09;来测量或提取输入图像中相应的型状或特…

17. Spring Boot Actuator

17. Spring Boot Actuator Spring Boot执行器(Actuator)提供安全端点&#xff0c;用于监视和管理Spring Boot应用程序。 默认情况下&#xff0c;所有执行器端点都是安全的。 在本章中&#xff0c;将详细了解如何为应用程序启用Spring Boot执行器。 启用Spring Boot Actuator …

CAD-autolisp(三)——文件、对话框

目录 一、文件操作1.1 写文件1.2 读文件 二、对话框DCL2.1 初识对话框2.2 常用对话框界面2.2.1 复选框、列表框2.2.2 下拉框2.2.3 文字输入框、单选点框 2.3 Lisp对dcl的驱动2.4 对话框按钮实现拾取2.5 对话框加载图片2.5.1 幻灯片图片制作2.5.1 代码部分 一、文件操作 1.1 写…

架构篇28:业务高可用的保障-异地多活架构

文章目录 应用场景架构模式小结无论是高可用计算架构,还是高可用存储架构,其本质的设计目的都是为了解决部分服务器故障的场景下,如何保证系统能够继续提供服务。但在一些极端场景下,有可能所有服务器都出现故障。例如,典型的有机房断电、机房火灾、地震、水灾……这些极端…

【阿里云服务器数据迁移】 同一个账号 不同区域服务器

前言 假如说一台云服务器要过期了,现在新买了一台,有的人会烦恼又要将重新在新的服务器上装环境,部署上线旧服务器上的网站项目, 但是不必烦恼,本文将介绍如何快速将就旧的服务器上的数据迁移到新的服务器上. 包括所有的环境和网站项目噢 ! 步骤 (1) 创建旧服务器自定义镜像…

AI作画工具 stable-diffusion-webui 一键安装工具(A1111-Web-UI-Installer)

安装 下载最新版本确保你的 NVIDIA 显卡驱动程序是最新的&#xff08;起码不能太老&#xff09;启动安装程序在欢迎屏幕上单击下一步在屏幕上&#xff0c;选择要安装的内容如果你已经安装了 Python 3.10 和 Git&#xff0c;那么可以取消选中如果你不知道这些是什么&#xff0c…

Spring boot + Azure OpenAI 服务 1.使用 GPT-35-Turbo

Azure OpenAI 服务使用 GPT-35-Turbo 先决条件 maven 注意 beta.6 版本 <dependency><groupId>com.azure</groupId><artifactId>azure-ai-openai</artifactId><version>1.0.0-beta.6</version></dependency>问答工具类 pack…

Django介绍

一、介绍 Django是Python语言中的一个Web框架,Python语言中主流的web框架有Django、Tornado、Flask 等多种 优势:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等功能,是一个全能型框架,拥有自己的Admin数据管理后台,第三方工具齐全,性能折中 缺点:…

【深度学习:t-SNE 】T 分布随机邻域嵌入

【深度学习&#xff1a;t-SNE 】T 分布随机邻域嵌入 降低数据维度的目标什么是PCA和t-SNE&#xff0c;两者有什么区别或相似之处&#xff1f;主成分分析&#xff08;PCA&#xff09;t-分布式随机邻域嵌入&#xff08;t-SNE&#xff09; 在 MNIST 数据集上实现 PCA 和 t-SNE结论…

Sentinel:微服务守护神的崛起

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Sentinel&#xff1a;微服务守护神的崛起 前言Sentinel简介&#xff1a;微服务流控的新宠Sentinel工作原理 前言 想象一下你正在主持一场盛大的马拉松比赛&#xff0c;参赛者如潮水般汇聚&#xff0c…

换个思维方式快速上手UML和 plantUML——类图

和大多数朋友一样&#xff0c;Jeffrey 在一开始的时候也十分的厌烦软件工程的一系列东西&#xff0c;对工程化工具十分厌恶&#xff0c;觉得它繁琐&#xff0c;需要记忆很多没有意思的东西。 但是之所以&#xff0c;肯定有是因为。对工程化工具的不理解和不认可主要是基于两个逻…

JVM篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、分代收集算法二、新生代与复制算法三、老年代与标记复制算法前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、分代…

数据结构(1)--> 顺序表

定义&#xff1a; 顺序表存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构&#xff0c;顺序表功能的实现借助于数组&#xff0c;通过对数组进行封装&#xff0c;从而实现增删查改的功能&#xff0c;严格意义上来说&#xff08;数组无法实现…

centos8源码安装python

前置条件&#xff0c;删除原来系统自带的python&#xff0c;如果系统自带的版本符合你的预期&#xff0c;就不用重新安装了。 yum remove python yum autoremove一、下载python 官网下载 这里是3.12.1版本 我的网盘下载 提取码&#xff1a;d8g1 文件名为Python-3.12.1.tgz 二…

Nginx进阶篇【五】

Nginx进阶篇【五】 八、Nginx实现服务器端集群搭建8.1.Nginx与Tomcat部署8.1.1.环境准备(Tomcat)8.1.1.1.浏览器访问:8.1.1.2.获取动态资源的链接地址:8.1.1.3.在Centos上准备一个Tomcat作为后台web服务器8.1.1.4.准备一个web项目&#xff0c;将其打包为war8.1.1.5.启动tomcat进…