您的位置 首页 java

管理Java依赖的最佳实践

为了加快开发速度,许多人使用框架和库来完成一些繁重的工作。

在研究现代 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  
管理Java依赖的最佳实践

IntelliJ IDEA

如果您正在使用IntelliJ IDEA,那么新版本会被提升出来。这对Maven和Gradle项目都适用。

管理Java依赖的最佳实践

2. 您使用的软件包还在维护吗?

明智的做法是重新访问 Git Hub 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依赖关系对于安全性至关重要。

通过创建一个清晰的策略,当高优先级的安全问题需要我们更新包时,我们可以防止意外发生。

文章来源:智云一二三科技

文章标题:管理Java依赖的最佳实践

文章地址:https://www.zhihuclub.com/177082.shtml

关于作者: 智云科技

热门文章

网站地图