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 / WSL2Windows 原生不推荐
我的建议: 如果有条件,尽量用 Linux 服务器。我在 macOS 上也跑过,但数据库存放路径的坑比 Linux 多。尤其如果你用的是 M1/M2 芯片的 Mac,记得确认你装的 Java 是 ARM 版本的。

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
踩过的大坑: 我曾经试图用 Java 8 跑一个全基因组 30× 的 WGS 数据,结果跑了 12 个小时还没跑完。换成 Java 11 后,时间直接掉到 6 小时。新版本的 JVM 在内存管理和 GC 上优化太多了。

4.4 数据库预处理:GRCh37 vs GRCh38 的选择

这是整个安装过程中最麻烦的一步,也是我见过的用户遇到问题最多的地方。

SnpEff 需要参考基因组数据库才能进行注释。这个数据库包含了基因组的位置信息、基因结构、转录本等。你如果直接运行 java -jar snpEff.jar GRCh37.75,它会自动下载数据库。

但是——我建议不要这样做。

为什么?因为在生产环境中,自动下载可能会因为网络问题中断,而且你无法控制数据库存放的具体路径。我个人习惯手动下载并配置。

4.4.1 确认你需要的参考基因组版本

SnpEff 使用内部编码来标识基因组。最常用的两个:

SnpEff 编码对应的参考基因组版本号适用场景
GRCh37.75hg19 / GRCh37Ensembl 75经典版本,很多旧工具仍使用
GRCh38.99hg38 / GRCh38Ensembl 99+最新版,推荐新项目使用
我踩过的坑: 有一次我以为 VCF 文件标注的是 GRCh38,但实际是 GRCh37。结果 SnpEff 跑完后,注释出来一大堆 "intergenic_region",因为数据库版本不匹配。切记!检查 VCF 的元数据(比如 ##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 versionJava 版本检查 java -version,升级到 Java 11+
SnpEff is not recognized没设置 alias使用完整路径:java -jar /path/to/snpEff.jar
SnpEff 安装与数据库预处理流程图 1. 系统准备 Java 11+ | 磁盘 ≥50GB 2. 下载 JAR 包 snpEff_latest_core.zip 3. 解压与配置 unzip → cd snpEff 选择参考基因组版本 GRCh37.75 Ensembl 75 版本 GRCh38.99 Ensembl 99+ 版本 下载数据库 下载数据库

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 的环境算是搭好了。你如果按我上面的步骤做,基本上不会遇到什么大问题。接下来的章节,我们会用这个环境跑真正的注释任务。