4. SnpEff 安装与环境配置:从 JAR 包到数据库预处理
好,咱们开始动手装 SnpEff。
说实话,我第一次装的时候觉得这玩意儿特简单——不就是个 java -jar 嘛。但后来发现,安装只是热身,真正的坑全在数据库配置上。你想想看,一个注释工具如果连参考基因组都找不到,那它怎么告诉你这个位点是 "missense" 还是 "synonymous"?
所以我个人的习惯是:先搭建好环境,再一次把数据库搞定。这样后面跑注释的时候,你基本只需要舒舒服服地敲命令行。
4.1 安装前的准备:你需要什么?
说白了,SnpEff 是一个基于 Java 的工具。它不需要编译,不需要装依赖(除了 Java),也不需要复杂的系统权限。
| 依赖项 | 版本要求 | 说明 |
|---|---|---|
| Java Runtime | ≥ 1.8 (推荐 11 或 17) | SnpEff 是纯 Java 应用 |
| 磁盘空间 | ≥ 50 GB(人类参考基因组) | 主要是数据库文件 |
| 内存 | ≥ 4 GB(建议 8 GB+) | 大型 VCF 注释很吃内存 |
| 操作系统 | Linux / macOS / WSL2 | Windows 原生不推荐 |
4.2 获取 JAR 包:一步到位
SnpEff 的安装包是预编译的。你不需要自己从源码构建,直接下载 JAR 文件就行。
我个人比较推荐用下面的方式获取最新版:
# 方法一:直接下载(推荐)
wget https://snpeff.blob.core.windows.net/versions/snpEff_latest_core.zip
# 方法二:如果你在服务器上没有 root 权限
# 可以用 curl 替代 wget
curl -O https://snpeff.blob.core.windows.net/versions/snpEff_latest_core.zip
下载后解压:
unzip snpEff_latest_core.zip
cd snpEff
解压后的目录结构大概是这样:
snpEff/
├── snpEff.jar # 主程序
├── SnpSift.jar # 配套的过滤/处理工具
├── config/ # 配置文件
├── data/ # 数据库目录(初始为空)
├── galton/ # 机器学习相关(不太常用)
└── examples/ # 示例文件
snpEff.jar 和 SnpSift.jar。其他的文件,比如 galton/ 下的那些,我们目前用不到。
4.3 配置 Java 环境:没有 Java 一切免谈
SnpEff 要求 Java 8 或更高版本。但说实话,Java 8 太老了,我在项目上已经全面转到 Java 11。
检查你的 Java 版本:
java -version
如果输出类似下面这样,说明环境 OK:
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10)
OpenJDK 64-Bit Server VM (build 11.0.18+10, mixed mode)
如果没装 Java,或者版本过低:
# Ubuntu/Debian
sudo apt update
sudo apt install openjdk-11-jdk
# CentOS/RHEL
sudo yum install java-11-openjdk-devel
# macOS (Homebrew)
brew install openjdk@11
4.4 数据库预处理:GRCh37 vs GRCh38 的选择
这是整个安装过程中最麻烦的一步,也是我见过的用户遇到问题最多的地方。
SnpEff 需要参考基因组数据库才能进行注释。这个数据库包含了基因组的位置信息、基因结构、转录本等。你如果直接运行 java -jar snpEff.jar GRCh37.75,它会自动下载数据库。
但是——我建议不要这样做。
为什么?因为在生产环境中,自动下载可能会因为网络问题中断,而且你无法控制数据库存放的具体路径。我个人习惯手动下载并配置。
4.4.1 确认你需要的参考基因组版本
SnpEff 使用内部编码来标识基因组。最常用的两个:
| SnpEff 编码 | 对应的参考基因组 | 版本号 | 适用场景 |
|---|---|---|---|
GRCh37.75 | hg19 / GRCh37 | Ensembl 75 | 经典版本,很多旧工具仍使用 |
GRCh38.99 | hg38 / GRCh38 | Ensembl 99+ | 最新版,推荐新项目使用 |
##reference= 行)确认基因组版本。
4.4.2 手动下载数据库(推荐)
这里有两种方式。如果你网速快,直接用 SnpEff 的下载命令:
# 下载 GRCh37.75
java -jar snpEff.jar download GRCh37.75
# 下载 GRCh38.99
java -jar snpEff.jar download GRCh38.99
网速慢的用户,可以用这个方式先下载压缩包:
# 手动下载 GRCh38.99
wget https://snpeff.blob.core.windows.net/databases/v5_0/snpEff_v5_0_GRCh38.99.zip
# 解压到 snpEff 安装目录下的 data/ 文件夹
unzip snpEff_v5_0_GRCh38.99.zip -d /path/to/snpEff/data/
4.4.3 验证数据库是否可用
下载完后,跑一条测试命令:
java -jar snpEff.jar databases | grep -E "GRCh37|GRCh38"
如果看到类似输出,说明数据库装好了:
GRCh37.75 | Genome assembly GRCh37 (Ensembl 75)
GRCh38.99 | Genome assembly GRCh38 (Ensembl 99)
你也可以跑一个简单测试:
echo -e "1\t1000\t.\tA\tT\t.\t.\t." | java -jar snpEff.jar GRCh37.75
只要不报 "Database not found" 错误,就算配置成功。
4.5 环境变量设置:让 SnpEff 在任何目录都能跑
每次都要输 java -jar /full/path/to/snpEff.jar 很麻烦。我建议像我一样,做一个别名:
在 ~/.bashrc 或 ~/.zshrc 里加上:
alias snpeff='java -Xmx8g -jar /path/to/snpEff/snpEff.jar'
alias snpsift='java -Xmx8g -jar /path/to/snpEff/SnpSift.jar'
然后刷新环境:
source ~/.bashrc
之后你就可以这样用了:
snpeff GRCh37.75 input.vcf > annotated.vcf
-Xmx8g 是分配 8 GB 内存给 Java 堆。如果你处理大规模数据(比如全基因组 1000 个样本的 VCF),我建议给到 -Xmx16g 甚至更多。我曾经试过用 4g 跑 100 个样本的联合基因分型 VCF,结果直接 OutOfMemoryError。
4.6 故障排查:你一定会遇到的一些问题
这里我把常见问题整理成一个表格,方便你快速定位:
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
Could not find database 'GRCh37.75' | 数据库没下载 或 路径不对 | 检查 data/ 下有没有对应目录;或手动指定 -dataDir |
OutOfMemoryError: Java heap space | 内存分配不足 | 增大 -Xmx 参数,如 -Xmx16g |
Unsupported major.minor version | Java 版本 | 检查 java -version,升级到 Java 11+ |
SnpEff is not recognized | 没设置 alias | 使用完整路径:java -jar /path/to/snpEff.jar |
4.7 最后的检查清单
完成以上步骤后,我建议你对着这个清单过一遍:
- Java 版本
≥ 11—— 用java -version确认。 - JAR 包存在 ——
snpEff.jar和SnpSift.jar都在snpEff/目录下。 - 数据库已下载 ——
ls data/GRCh37.75/或data/GRCh38.99/下应该有genes.gff等文件。 - 别名已设置 ——
alias snpeff能输出正确的内容。 - 试跑一条 —— 用上面给出的 echo 命令测一下,不报错就是胜利。
实用技巧: 如果你需要同时保留 GRCh37 和 GRCh38 两个数据库,在 data/ 目录下分别建两个子目录即可。SnpEff 会根据你敲的编码自动选择对应的数据库。我自己的做法就是:data/GRCh37.75/ 和 data/GRCh38.99/ 并存,方便切换。
好了,到了这一步,SnpEff 的环境算是搭好了。你如果按我上面的步骤做,基本上不会遇到什么大问题。接下来的章节,我们会用这个环境跑真正的注释任务。