ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vespa container-dependencies-enforcer:为第三方容器项目提供的依赖白名单强制校验机制

Vespa container-dependencies-enforcer:为第三方容器项目提供的依赖白名单强制校验机制 后端搜索引擎人工智能大数据【免费下载链接】vespaThe AI search platform项目地址https://gitcode.com/gh_mirrors/ve/vespa点击查看免费下载本文以 container-dependencies-enforcer 模块为核心讲解 VespaThe AI search platform如何通过 Maven Enforcer 插件强制第三方容器项目3rd party container projects在编译期只能看到被白名单允许的依赖从而保证最终运行环境JDisc 容器的类路径classpath稳定、无版本冲突、无意外依赖泄漏。一、这个模块解决什么问题在 Vespa 生态中用户开发的容器插件如 application、searcher、docproc、handler 等最终会被打包并部署到 JDisc 容器中运行。容器运行时已经内置了一大批第三方库与 Vespa 自身的库这些库是由容器运行时以 provided 方式提供的。如果第三方项目在自己的 pom 里直接依赖了某些库并打包进应用就可能出现同一 JAR 在容器 classpath 中出现两个不同版本版本冲突应用打包了容器内部实现类如 Guava 内部类、jaxb 实现部署后与容器自带版本行为不一致引用了容器并不提供的依赖导致运行时 NoClassDefFoundError。container-dependencies-enforcer 模块的作用正是通过 maven-enforcer-plugin 的规则强制校验第三方项目在 provided classpath 上能看到的依赖必须全部来自白名单且白名单只允许包含 JDisc 容器运行时确实会提供的构件artifacts。这一机制与同仓库的 vespa-dependencies-enforcer 形成互补后者基于AllowedDependencies规则负责校验 Vespa 仓库内部各模块的依赖必须与allowed-maven-dependencies.txt清单一致而前者基于EnforceDependencies规则面向仓库外的第三方容器项目。二、模块结构与运行方式该模块位于 container-dependencies-enforcer/pom.xml是一个packagingpom的纯校验模块自身不产出任何 JAR只负责在构建时执行 enforcer 校验parent groupIdcom.yahoo.vespa/groupId artifactIdparent/artifactId version8-SNAPSHOT/version relativePath../parent/pom.xml/relativePath /parent artifactIdcontainer-dependencies-enforcer/artifactId version8-SNAPSHOT/version packagingpom/packaging模块的关键设计点见 pom.xml测试期依赖container-test用于覆盖第三方项目在测试环境可见依赖的场景以provided作用域依赖container与container-test的声明顺序刻意相反pom 注释中说明这是为了覆盖两种依赖声明顺序的情况避免校验规则对声明顺序敏感通过maven-enforcer-plugin的dependencies引入本仓库编译好的vespa-enforcer-extensions从而使用自定义规则类配置了default-cliexecutiongoal 为enforce目的是允许从命令行直接运行mvn enforcer:enforce单独触发该校验。由于是 pom 打包的独立模块它通常作为其他第三方项目构建链路中的一个校验步骤被引用或在命令行中被显式触发。三、核心规则EnforceDependencies白名单校验逻辑由自定义 Enforcer 规则EnforceDependencies实现源码位于 vespa-enforcer-extensions/src/main/java/com/yahoo/vespa/maven/plugin/enforcer/EnforceDependencies.javapublic class EnforceDependencies implements EnforcerRule { private ListString allowedDependencies List.of(); private boolean failOnUnmatched true; Override public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { validateDependencies(getAllDependencies(helper), Set.copyOf(allowedDependencies), failOnUnmatched); helper.getLog().info(The enforceDependencies validation completed successfully); } }其工作流程validateDependencies见同文件 L50-L81从MavenSession与MavenProject出发通过DependencyGraphBuilder构建当前项目的完整依赖树getAllDependencies递归收集依赖树中所有节点的构件getAllRecursive包含传递依赖对每一个真实依赖依次与白名单中的每一条规则做匹配matches命中即记录该规则已匹配校验结束后存在未匹配任何规则的依赖unmatchedArtifacts或failOnUnmatched为 true 且存在未匹配任何依赖的规则unmatchedRules即白名单里有冗余条目 都会抛出EnforcerRuleException并在错误信息中分别列出两类问题见 EnforceDependencies.java#L69-L80。这一点是它与 Maven 内置bannedDependencies规则的关键差异类注释中也有说明默认对白名单中没有任何依赖命中的规则也报错从而保证白名单始终与实际依赖一一对应不会出现写了规则却根本不起作用的僵尸条目。规则类还提供了setFailOnUnmatchedRule/isFailOnUnmatchedRule属性对L156-L159可在 pom 中配置为 false 以只拦截多余依赖而放过多余规则。四、白名单规则的匹配语法规则匹配逻辑实现于matches方法EnforceDependencies.java#L109-L132规则格式与DefaultArtifact#toString()的输出结构一致支持三种写法groupId:artifactId:version:scope groupId:artifactId:type:version:scope groupId:artifactId:type:classifier:version:scope各段位支持*任意序列与?单字符通配符由segmentMatchesL134-L141将通配符翻译为正则后做全匹配Pattern.matches。版本段除通配符外还支持 Maven 版本区间语法[...]/(...)由versionMatchesL143-L154调用VersionRange.createFromVersionSpec解析后判断版本是否落在区间内。结合单元测试 EnforceDependenciesTest.java 可以验证以下行为场景规则示例结果对应测试依赖与规则全部匹配com.yahoo.vespa:container-disc:jar:*:providedcom.yahoo.vespa:*:jar:*:test通过succeeds_when_all_dependencies_and_rules_match存在白名单外依赖只声明com.yahoo.vespa:*:jar:*:test实际还有 provided 依赖失败列出未匹配依赖fails_on_unmatched_dependency白名单有冗余规则规则多于实际依赖失败列出未匹配规则fails_on_unmatched_rule版本不匹配规则版本7.0.0实际8.0.0失败双向列出fails_on_version_mismatchscope 不匹配规则:provided实际:test失败fails_on_scope_mismatch省略 type 段g:a:8.0.0:test与g:a:jar:8.0.0:test等价通过matches_shorter_rule_variant_without_type带 classifier 的构件com.google.inject:guice:jar:no_aop:4.2.3:provided通过六段式用四段式guice:4.2.3:provided则失败matches_artifact_with_classifier版本区间命中[1.0,2)匹配1.2.3通过matches_on_version_in_allowed_range版本区间外[1.0,2)对2失败fails_on_version_outside_allowed_range从源码细节看classifier 的处理是双向的规则含六段时要求构件必须有 classifier 且匹配规则少于六段时要求构件必须没有classifierL122-L129这是防止依赖伪装成带 classifier 的变体绕过白名单。五、白名单的完整内容与分类模块 pom 中通过enforceDependencies implementationcom.yahoo.vespa.maven.plugin.enforcer.EnforceDependencies的allowed列表配置白名单见 container-dependencies-enforcer/pom.xml#L62-L226按类别可分为四组5.1 第三方 provided 依赖JDisc 容器运行时提供这一组是白名单的核心——容器运行时已经内置第三方项目只能以provided方式引用依赖注入与 JSONaopalliance:aopalliance、javax.inject:javax.inject、com.google.inject:guicejar 类型、Jackson 全家桶jackson-annotations、jackson-core、jackson-databind、jackson-datatype-jdk8、jackson-datatype-jsr310Guava 及其内部依赖com.google.guava:guava、com.google.errorprone:error_prone_annotations:[2.21.1, 3)、com.google.guava:failureaccess:[1.0.1, 2)、com.google.j2objc:j2objc-annotations:[3.0.0, 4)——注意 Guava 的几个伴生构件使用版本区间规则允许小版本浮动但限制大版本JAXB 与激活com.sun.activation:javax.activation:[1.2.0, 2)、com.sun.xml.bind:jaxb-core、com.sun.xml.bind:jaxb-impl、javax.xml.bind:jaxb-apiServlet / JAX-RSjavax.servlet:javax.servlet-api、javax.ws.rs:javax.ws.rs-api日志门面org.slf4j:slf4j-api、slf4j-jdk14、jcl-over-slf4j、log4j-over-slf4j。版本大多引用父 pom 中统一定义的属性如${guava.vespa.version}、${jackson2.vespa.version}保证与容器实际打包版本严格一致。5.2 Vespa 自身的 provided 依赖第三方项目可以依赖的 Vespa 公开 API 构件全部以com.yahoo.vespa:*:provided形式放行版本用*覆盖annotations、component、config、config-bundle、config-lib、configdefinitions、configgen、container、container-dev、container-disc、container-documentapi、container-messagebus、container-onnxruntime、container-search、container-search-and-docproc、defaults、docproc、document、documentapi、fileacquirer、fsa、hosted-zone-api、jdisc_core、jrt、linguistics、messagebus、metrics、model-evaluation、opennlp-linguistics、predicate-search-core、provided-dependencies、searchcore、searchlib、security-utils、vdslib、vespa-3party-bundlespom 类型、vespajlib、vespalog。5.3 Vespa 自身的 test 依赖仅供测试环境使用scope 为test包括application、config-model、config-model-api、config-provisioning、config-application-package、container-test、container-apache-http-client-bundle、container-opentelemetry、http-utils、indexinglanguage、logd、metrics-proxy、model-integration、searchsummary、standalone-container、storage、vespaclient-container-plugin、vespaclient-core、vsm等。5.4 第三方 test 依赖测试期允许的第三方库覆盖面很广典型代表junit:junit、org.hamcrest:*、com.google.protobuf:protobuf-java、org.apache.felix:*OSGi 框架、Jetty 全家桶org.eclipse.jetty:*、org.eclipse.jetty.http2:*、org.eclipse.jetty:jetty-alpn-*、Apache HttpClient 5 / HttpComponents、BouncyCastlebcprov-jdk18on、bcpkix-jdk18on、bcutil-jdk18on、OpenNLP、onnxruntime、org.apache.commons:commons-lang3、commons-codec、Micrometer、Prometheussimpleclient系列、Kotlin 标准库、OpenTelemetryopentelemetry-api、opentelemetry-common、opentelemetry-context、org.json:jsonpom 注释标注TODO: Remove on Vespa 9即该条目将在 Vespa 9 移除等。从白名单的结构可以清晰看出设计意图provided 集合 运行时真正提供的test 集合 仅测试需要、绝不进入部署产物的。任何不在这些列表中的依赖构建都会直接失败从而从源头杜绝第三方应用把容器内部库或多余版本带进部署包。六、失败时的表现与排查建议当校验失败时EnforceDependencies抛出的EnforcerRuleException错误信息会明确分类例如测试 fails_on_version_mismatch 断言的消息格式Vespa dependency enforcer failed: Dependencies not matching any rule: - com.yahoo.vespa:testutils:jar:8.0.0:test Rules not matching any dependency: - com.yahoo.vespa:testutils:jar:7.0.0:test排查时对照上文第四节的两类失败含义Dependencies not matching any rule项目引入了白名单外的依赖或版本/scope/classifier 与规则不符。处理方式若是容器确实提供的库修正为匹配的 provided 规则若容器不提供则应移除该依赖或将其移到正确的 scopeRules not matching any dependency白名单存在冗余条目通常发生在依赖升级或移除后未同步清理。处理方式删除该规则条目保持白名单与真实依赖一一对应。由于该 execution 绑定了default-cli可在命令行单独触发mvn enforcer:enforce见 pom.xml#L53-L59 注释便于在完整构建前快速迭代校验。七、与仓库内其他 enforcer 模块的关系vespa-enforcer-extensions提供两个规则类的实际实现见 vespa-enforcer-extensions/src/main/java/com/yahoo/vespa/maven/plugin/enforcer。其中EnforceDependencies用于第三方容器项目本文主题AllowedDependencies用于 Vespa 仓库内部vespa-dependencies-enforcer在仓库根 pom.xml 中作为模块注册通过AllowedDependencies规则以 allowed-maven-dependencies.txt 为清单校验 Vespa 各模块自身的第三方依赖版本统一性其配置vespa-dependencies-enforcer/pom.xml包含rootProjectId、specFile、ignored对com.yahoo.vespa:*等内部构件放行等参数并支持在依赖变更时通过mvn validate -DdependencyEnforcer.writeSpec自动更新清单两者都依赖父 pomparent/pom.xml集中管理的版本属性确保同一第三方库在容器 provided 集合与Vespa 内部依赖清单中版本一致。八、适用前提与局限该机制是编译期/构建期校验约束的是第三方项目在 provided classpath 上能看到的依赖集合并不能替代运行时 classpath 的实际检查白名单以**当前仓库版本8-SNAPSHOT**为准规则中的版本区间、TODO: Remove on Vespa 9等条目会随版本演进变化使用时应以对应发布版本的 pom 为准规则默认开启failOnUnmatched冗余规则也报错若确需放宽可显式配置failOnUnmatchedRulefalse/failOnUnmatchedRule但会失去对白名单自洁性的保障。总结container-dependencies-enforcer用一份结构化白名单 一个自定义 Enforcer 规则为 Vespa 的第三方容器项目构建了可靠的依赖边界provided 集合严格对齐 JDisc 容器运行时test 集合仅服务测试任何越界依赖与任何冗余规则都会在构建期被明确拦截。理解其规则匹配语法通配符、版本区间、scope/classifier 语义与双向失败报告机制可以帮助你在开发 Vespa 容器插件时快速定位依赖问题并保证部署产物与容器运行时的 classpath 完全兼容。赞分享后端搜索引擎人工智能大数据【免费下载链接】vespaThe AI search platform项目地址https://gitcode.com/gh_mirrors/ve/vespa点击查看免费下载相关推荐Logstash 第三方依赖许可审计工具 dependencies-report 深度解析从源码看许可证合规校验机制Logstash 第三方依赖许可审计工具 dependencies report 深度解析从源码看许可证合规校验机制 本文聚焦 Logstash 仓库中负责数据工程后端如何用direnv打造多语言开发环境Python、Ruby、Node.js集成完整指南如何用direnv打造多语言开发环境Python、Ruby、Node.js集成完整指南 direnv 是一款 Shell 环境管理工具口号是 unclut后端搜索引擎人工智能大数据Awesome Lit核心组件库深度解析打造现代化Web界面的终极武器Awesome Lit核心组件库深度解析打造现代化Web界面的终极武器 Lit是一个用于构建快速、轻量级Web组件的简单库其核心是一个消除样板代码的组件基类上一篇OpenEuler Conch安全隔离方案构建企业级Agent服务的7个最佳实践 下一篇如何在鲲鹏平台部署Hi-FHE超详细安装与配置教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表