网站首页 > 技术文章 正文
为了加快开发速度,许多人使用框架和库来完成一些繁重的工作。
在研究现代Java应用程序时,几乎所有的应用程序都包含来自他人开发的库的依赖项。
依赖关系大约占二进制文件的80%到90%——因此,在创建Java项目时,我们应该注意它们。
在本文中,我将为您提供一些在项目中处理Java依赖项的建议和最佳实践。
- 为什么要更加注意Java依赖关系
- 管理Java依赖关系
- 在Java项目中包含依赖项
- 更新Java依赖项
- 从项目中删除Java依赖项
为什么要更加注意Java依赖关系
管理代码贡献时,在将新代码合并到我们自己控制的分支之前,通常会使用代码评审作为质量保证。
但是,我们对待依赖项的方式与我们对待自己代码的方式有很大的不同。在许多情况下,使用依赖关系时不需要任何形式的验证。在许多情况下,这些顶级依赖会引入传递依赖,而传递依赖可以深入到多个级别。例如,一个200行具有5个直接依赖项的Spring应用程序最终可能总共使用60个依赖项,这相当于将近50万行代码被交付到生产中。
在遗留项目中更新Java依赖项可能具有挑战性。如果它们过时了,就会导致兼容性问题的多米诺效应,更新单个库可能意味着由于bug或安全问题而更新多个库。如果这些Java依赖改变了它们的API,您将需要完全重写应用程序。
此外,在许多主要的企业应用程序中,依赖项保留在清单文件中,即使它们不再在代码中使用。这些未使用的依赖项在您的程序中仍然可用。
所有这些都会导致:
- 使用更多资源或启动时间的较大二进制文件。
- 添加新依赖项时,库中可能发生冲突。
- 过时的包含bug或安全问题库。
- 更新库时的兼容性问题。
- 更多其他问题。
管理Java依赖关系
使用存储库(如Maven Central)的最佳实践之一是设置自己的私服。这是内部开发和公共存储库之间的专用代理服务器——它不仅可以为您提供更快、更稳定的构建,还允许您为Java包设置策略。例如,您可以阻止某些版本,使它们不能在您的应用程序中下载和使用。
有关存储库管理器的更多信息和可能的产品列表,请参阅Maven文档。
在Java项目中包含新的依赖项
当引入一个新的依赖时,你应该考虑如下问题:
1. 它解决问题了吗?
导入软件包的主要原因是为了解决您的问题。问题是您选择的依赖项是否可以做到这一点。此外,它是否在不引入新挑战的情况下解决了整个问题?如果不是这样,也许还有更好的解决方案。
2. 我需要全家桶吗?
如果您只需要一个函数,那么导入具有许多函数和数据类型的大型依赖项是否值得?有时,自己编写该函数可能更容易,也更易于管理。例如,如果我只想使用Tuple数据类型,那么包含整个Eclipse Collections是否有意义?可能不会。
在mvnrepository.com上快速浏览一下,我发现这个包大约是10MB
此外,检查您已经拥有的依赖项是否可以为您完成这项工作。一些类似的函数或数据类型可能已经可用。反之,包含一个新的、广泛的库可以帮助您一次性解决多个问题——具体问题具体分析。
3.有多少贡献者?
如果您使用的Java依赖只有一个或几个维护者,那么总线因子就非常低。如果维护人员决定退出,或者没有时间修复bug,会发生什么?或者,你也可以选择自己为项目做贡献——让每个参与的人都更安全。
但是,在您的项目中包含任何依赖项之前,一定要检查核心存储库,看看有多少活动维护人员。
4. 它还在维护吗?
如果一个包不再被维护,您肯定不想依赖它。在集成一个包之前,检查GitHub存储库中是否有新的推送,并查看一个包的发布周期。这将使您了解包的维护情况。
5. 软件包的最新版本是什么?
代码示例可以帮助您深入了解特定的Java依赖关系。然而,这些示例可能已经过时,预期的包可能已经更新。考虑使用最新的稳定版本。对于Eclipse集合,我们在mvnpackage.com上看到最新的稳定版本是2022年7月5日的11.1.0。考虑使用该版本。
注意,11.1.0。M2也列在这张图中。这显然是一个预发布版本。除非绝对确定,否则应该只在生产应用程序中包含稳定的发布版本。根据经验,请不要使用包含如下限定符的版本,比如:
- alpha或α
- beta或b
- milestone或m
- rc或cr
- snapshot
如果一个Java依赖项具有限定符GA或final,您通常可以认为它是一个稳定的发布版本。
6. 是否存在安全漏洞?
在主动依赖Java包之前,请确保扫描它以查找已知的漏洞。
Snyk CLI是扫描Maven或Gradle文件的好工具。
如果您的库包含一个安全漏洞,您可能想要选择另一个包来依赖。
更新Java依赖项
1. 是否有更新的版本可用?
您不希望手动检查每个Java依赖项,以查看是否有更新的版本可用。幸运的是,有更简单的方法可以做到这一点。
通过在包管理器中使用插件,您可以在在每个构建中随时自动验证依赖项。
请注意,您的工具可能会指向beta或预发布版本。强烈建议您只使用库的稳定发布版本。
在Maven中,你可以使用如下官方自带的版本插件。不需要在pom.xml中增加任何特定的配置。
mvn versions:display-dependency-updates
对于Gradle,我们必须包含一个具有类似功能插件,比如来自ben-manes的versions插件。
plugins {
id "com.github.ben-manes.versions" version "0.42.0"
}
现在我们可以运行一个类似的命令来显示库的新版本。
gradle dependencyUpdates -Drevision=release
IntelliJ IDEA
如果您正在使用IntelliJ IDEA,那么新版本会被提升出来。这对Maven和Gradle项目都适用。
2. 您使用的软件包还在维护吗?
明智的做法是重新访问GitHub repo或mvnpackage.com,看看是否有最近的更新和提交。如果一个包看起来不再得到很好的维护,您可以选择自己维护它,或者迁移到另一个更新更好的库。
但是,如果您遇到了一个依赖项的问题,而这个依赖项对您的应用程序非常关键,那么可以考虑自己解决这个问题,并将这个解决方案贡献给开源项目。这将是非常值得赞赏的—而且通常比提交问题报告和推动维护者解决问题更快。
3.我的Java依赖关系有安全问题吗?
即使您的应用程序现在没有漏洞,也并不意味着它将永远保持这种状态。每天都有新的漏洞和漏洞被发现和披露。这意味着您需要定期重新扫描库,以确保它们没有漏洞。
Snyk为您提供多种方法在开发生命周期中集成依赖扫描。在您的本地机器上,您可以使用Snyk CLI,或集成IntelliJ, Eclipse或VS Code来扫描漏洞。
您也可以在构建周期中使用Maven和Gradle(非官方)插件进行扫描,或者选择一个CI管道集成。
或者,您可以将您的Git存储库添加到Snyk,这样我们可以扫描和更新您的项目为您的日常基础上。
从项目中删除Java依赖项
1. 这个包装还在使用吗?
对于不再使用Java依赖项,我们应该从清单文件中删除它。删除未使用的依赖项将使您的二进制文件更小——除了更好的安全性之外,还可以缩短启动和下载时间。最小化类路径上的依赖是防止反序列化小工具链攻击的关键。
包管理器可以帮助您识别这些未使用的Java依赖项。
Maven的例子
对于Maven,我可以使用依赖插件来分析我的依赖项。这个插件检查我声明的Java依赖项是否也在我的代码中使用。
在本例中,我不想被提供的或测试的依赖关系所困扰,所以我使用了ignoreNonCompile标志。
mvn dependency:analyze -DignoreNonCompile
Gradle例子
在Gradle中,我们需要添加另一个插件来分析依赖关系。在这种情况下,我们将使用星云。线头插件。这个Gradle linter可以分析包含的java依赖项,并查看是否有未使用的依赖项。
plugins {
id "nebula.lint" version "17.7.0"
}
必须相应地配置插件来设置gradleLint.rules。您可以在您的Gradle文件中执行此操作,或者作为命令行参数。在下面的例子中,我选择后者。查看插件文档,了解如何为您的应用程序配置这个插件的更多信息。
gradle lintGradle -PgradleLint.rules = unused-dependency
为Java应用程序创建可靠的依赖管理策略
在开发Java应用程序并使用库或框架等依赖项时,为如何处理它们创建一个策略是明智的。
了解如何从应用程序中选择、更新和删除Java依赖关系对于安全性至关重要。
通过创建一个清晰的策略,当高优先级的安全问题需要我们更新包时,我们可以防止意外发生。
https://foojay.io/today/best-practices-for-managing-java-dependencies/
- 上一篇: Java 依赖注入(DI) 依赖注入 js
- 下一篇: 面试必问:Spring循环依赖的三种方式
猜你喜欢
- 2024-10-18 MyBatisPlus又在搞事了!发布神器,一个依赖轻松搞定权限问题
- 2024-10-18 史上硬核!Jar 包依赖冲突排查思路和解决方法
- 2024-10-18 小白都能看懂的 Spring 源码揭秘之依赖注入(DI)源码分析
- 2024-10-18 Spring-bean的循环依赖以及解决方式
- 2024-10-18 Maven技术方案最全手册 maven详细教程
- 2024-10-18 JAVA编程规范之二方库依赖 java方法库
- 2024-10-18 Spring依赖注入原理分析 spring依赖注入作用
- 2024-10-18 简单2步实现maven打包java工程并将依赖jar输出到指定目录
- 2024-10-18 怎么进阶学好Java 如何用Spring解决循环依赖
- 2024-10-18 Spring 源码分析之 bean 依赖注入原理(注入属性)
你 发表评论:
欢迎- 11-19零基础学习!数据分析分类模型「支持向量机」
- 11-19机器学习 | 算法笔记(三)- 支持向量机算法以及代码实现
- 11-19我以前一直没有真正理解支持向量机,直到我画了一张图
- 11-19研一小姑娘分享机器学习之SVM支持向量机
- 11-19[机器学习] sklearn支持向量机
- 11-19支持向量机
- 11-19初探支持向量机:用大白话解释、原理详解、Python实现
- 11-19支持向量机的核函数
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)