如何自定义构建NiFi 1.8.0以升级Log4j至安全版本
NiFi 1.8.0 升级Log4j版本方案
1. 根pom.xml强制指定安全版本
NiFi的NAR依赖分散在各子模块,需在根目录pom.xml的<dependencyManagement>节点中添加Log4j安全版本配置,强制覆盖所有子模块的旧依赖:
<dependencyManagement> <dependencies> <!-- 强制Log4j 2.x核心组件版本为2.17.0 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.0</version> </dependency> <!-- 适配SLF4J的桥接包,注意SLF4J版本需和该包兼容,建议将org.slf4j.version改回1.7.36(安全兼容版),避免2.0.x版本的冲突问题 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.17.0</version> </dependency> <!-- 替换Log4j 1.x,用桥接包兼容旧代码调用 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId> <version>2.17.0</version> </dependency> </dependencies> </dependencyManagement>
2. 排除子模块的旧版依赖
针对明确依赖旧Log4j的模块(比如nifi-elasticsearch-client-service-nar),在其模块pom.xml的依赖中排除旧版Log4j,避免依赖传递:
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version><!-- 保持原版本 --></version> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> </exclusion> </exclusions> </dependency>
3. 构建后验证
执行mvn clean install -DskipTests构建完成后,解压目标NAR包,检查NAR-INF/bundled-dependencies/目录,确认:
- log4j-core、log4j-api等核心包版本为2.17.0
- 无log4j-1.x系列jar包(已被log4j-1.2-api-2.17.0替代)
4. 临时应急方案(构建受阻时)
若重新构建有困难,可直接修改已部署的NAR包:
- 找到
/nifi/work/nar/extensions/下的目标NAR解压目录 - 删除旧版log4j-core-2.8.2.jar、log4j-core-2.9.1.jar及所有log4j-1.x.jar
- 放入log4j-core-2.17.0.jar、log4j-api-2.17.0.jar、log4j-1.2-api-2.17.0.jar
- 重启NiFi生效
注意:此方式需确保版本兼容,且NiFi重启后若NAR被重新解压,需重复操作,仅作为临时应急用。
内容的提问来源于stack exchange,提问作者Jin Ma
相关产品推荐
相关产品推荐

