You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Sonatype Lift漏洞扫描器在Maven发布时识别依赖覆盖?

问题描述

我正尝试通过Sonatype的Nexus OSS仓库管理器将Scala库play-hmac-signatures发布到Maven仓库。我的库依赖最新版Play Framework(com.typesafe.play:play_2.13:2.8.18),而该框架依赖旧版本的com.fasterxml.jackson(2.11.4)。我在构建配置中通过以下代码覆盖了依赖版本:

dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % "2.13.4"

我已经通过sbt依赖树插件和缓存文件验证,本地构建确实使用了正确的jackson-databind版本。但使用sbt-sonatype插件(3.9.14)发布到Maven时,Sonatype Lift漏洞扫描器因为检测到pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.11.4的漏洞而拒绝了我的发布——这个版本是我已经在构建中覆盖的旧版本。查看提交到Nexus的构建产物后发现,POM文件只列出了顶层依赖,Sonatype Lift似乎只依据这些顶层依赖遍历依赖图查找漏洞,完全忽略了我明确设置的依赖覆盖。请问有没有办法将依赖覆盖同步到POM文件中?

附上当前生成的POM文件:

<?xml version='1.0' encoding='UTF-8'?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mesonomics</groupId>
    <artifactId>play-hmac-signatures_2.13</artifactId>
    <packaging>jar</packaging>
    <description>play-hmac-signatures</description>
    <url>https://github.com/phelps-sg/play-hmac-signatures</url>
    <version>0.2.2</version>
    <licenses>
        <license>
            <name>Apache-2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
            <distribution>repo</distribution>
        </license>
    </licenses>
    <name>play-hmac-signatures</name>
    <organization>
        <name>com.mesonomics</name>
        <url>https://github.com/phelps-sg/play-hmac-signatures</url>
    </organization>
    <scm>
        <url>https://github.com/phelps-sg/play-hmac-signatures</url>
        <connection>git@github.com:phelps-sg/play-hmac-signatures.git</connection>
    </scm>
    <developers>
        <developer>
            <id>phelps-sg</id>
            <name>Steve Phelps</name>
            <url>https://github.com/usernamehttps://github.com/phelps-sg</url>
            <email>sphelps@sphelps.net</email>
        </developer>
    </developers>
    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.13.10</version>
        </dependency>
        <dependency>
            <groupId>com.typesafe.play</groupId>
            <artifactId>play_2.13</artifactId>
            <version>2.8.18</version>
        </dependency>
        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>5.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.scalactic</groupId>
            <artifactId>scalactic_2.13</artifactId>
            <version>3.2.14</version>
        </dependency>
        <dependency>
            <groupId>org.scalatest</groupId>
            <artifactId>scalatest_2.13</artifactId>
            <version>3.2.14</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.scalatestplus.play</groupId>
            <artifactId>scalatestplus-play_2.13</artifactId>
            <version>5.1.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

解决方案

sbt的dependencyOverrides是构建时的本地覆盖规则,默认不会写入生成的POM文件——因为Maven生态没有对应的机制,Sonatype Lift只会基于POM里的依赖关系扫描漏洞,所以必须把版本覆盖规则同步到POM中,有两种可靠方法:

方法一:显式添加依赖到libraryDependencies

直接将jackson-databind作为顶层依赖加入构建配置,生成的POM会包含该依赖,Maven解析时会优先使用这个版本,覆盖Play Framework传递的旧版本:

libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.13.4"

添加后可以保留dependencyOverrides确保本地构建一致性,不过显式依赖的优先级更高,也可以省略dependencyOverrides。

方法二:在POM中添加dependencyManagement节点

如果不想把jackson-databind作为顶层依赖暴露,可通过sbt的pomExtra配置在生成的POM中加入dependencyManagement块,强制指定版本:

pomExtra := {
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.4</version>
      </dependency>
      <!-- 建议同步覆盖jackson核心组件版本,保持一致性 -->
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.13.4</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.13.4</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
}

生成的POM会包含dependencyManagement部分,Sonatype Lift扫描时会遵循这个版本规则,不会再检测到旧版本漏洞。

验证修改效果

执行sbt makePom命令生成新的POM文件,检查是否包含对应的依赖或dependencyManagement节点,确认无误后再执行发布流程。


内容的提问来源于stack exchange,提问作者Peewee 733

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:20:54