如何避免在新版本发布时大量更改 Maven 项目
How to avoid heavily changing Maven projects when new versions come out
具体背景
我刚从 spring data neo4j 4.1.3 切换到 5.0.0
自从我更改了 pom 文件后就出现了这个问题。
Maven 安装失败,因为 "cannot find symbol ... class GraphRepository"
我是 Java Maven 项目的新手
宽泛的问题:
如果我将给定项目的 Maven 依赖项从一个版本更新到另一个版本,并且我现在大量使用的 class 会给出大约 100 个错误代码,说明整个 class 现在是失踪...我怎么没有发生这种情况。
具体我认为我在什么地方
我将不得不删除对 "GraphRepository" 的所有引用并将其更改为 Neo4jRepository,因为 "Also note that GraphRepository is deprecated and replaced by Neo4jRepository" -
但是,这似乎不对。我真的必须经历整个项目并更改所有代码才能更新吗?
一整行错误:
[ERROR] /.../service/SupportModelServiceImpl.java:[10,49] cannot find symbol
symbol: class GraphRepository
location: package org.springframework.data.neo4j.repository
这不是 maven 特有的,无论您使用什么构建系统,您都会遇到这个问题。
但我不明白你为什么想要这个,主要版本更改(例如 4.xx 到 5.xx)意味着某些东西会被破坏,你将不得不对你的代码。
您无法阻止外部依赖项引入重大更改。但是,您可以编写代码,以便花费最少的精力来更新外部依赖项。
我观察到在实践中并没有像依赖是免费的那样给予太多关注。最初它们和免费一样好,但是一旦你开始堆叠你的依赖关系并且具有冲突的传递依赖关系或者你升级到具有重大更改的新版本,就会产生维护成本。我见过一些项目,其中的依赖关系网络非常复杂,以至于应该从头开始完全重写,如果不是因为管理层不理解技术债务的概念,生活在维护现有(坏)软件版本更便宜的幻想中比写一个新的。
防止外部依赖的唯一选择是以一种或另一种方式封装它们。这可能涉及一些样板代码,但如果此样板代码最少,则值得付出努力。
因为我看到项目有可怕的依赖关系,所以我想了想如何防止这种依赖关系混乱并制作了下图:
您无法控制的外部代码为红色。如果您不考虑构建代码,您的代码(橙色)将直接依赖于外部代码,并面临外部更改的风险。您可以尝试编写不依赖于外部代码的代码(绿色)。实现此目的的方法是在自己的界面中定义所需的外部功能。然后您有一些代码(橙色)实现这些接口并具有外部依赖性。您通过依赖注入框架注入带有外部依赖的代码。
这种方法将外部更改的影响仅限于橙色代码。但是,与在代码中的任何地方直接使用依赖项相比,它需要更多的计划。而且因为更多的计划意味着更多的努力,所以往往没有付诸实践。
具体背景
我刚从 spring data neo4j 4.1.3 切换到 5.0.0 自从我更改了 pom 文件后就出现了这个问题。
Maven 安装失败,因为 "cannot find symbol ... class GraphRepository"
我是 Java Maven 项目的新手
宽泛的问题:
如果我将给定项目的 Maven 依赖项从一个版本更新到另一个版本,并且我现在大量使用的 class 会给出大约 100 个错误代码,说明整个 class 现在是失踪...我怎么没有发生这种情况。
具体我认为我在什么地方
我将不得不删除对 "GraphRepository" 的所有引用并将其更改为 Neo4jRepository,因为 "Also note that GraphRepository is deprecated and replaced by Neo4jRepository" -
但是,这似乎不对。我真的必须经历整个项目并更改所有代码才能更新吗?
一整行错误:
[ERROR] /.../service/SupportModelServiceImpl.java:[10,49] cannot find symbol
symbol: class GraphRepository
location: package org.springframework.data.neo4j.repository
这不是 maven 特有的,无论您使用什么构建系统,您都会遇到这个问题。
但我不明白你为什么想要这个,主要版本更改(例如 4.xx 到 5.xx)意味着某些东西会被破坏,你将不得不对你的代码。
您无法阻止外部依赖项引入重大更改。但是,您可以编写代码,以便花费最少的精力来更新外部依赖项。
我观察到在实践中并没有像依赖是免费的那样给予太多关注。最初它们和免费一样好,但是一旦你开始堆叠你的依赖关系并且具有冲突的传递依赖关系或者你升级到具有重大更改的新版本,就会产生维护成本。我见过一些项目,其中的依赖关系网络非常复杂,以至于应该从头开始完全重写,如果不是因为管理层不理解技术债务的概念,生活在维护现有(坏)软件版本更便宜的幻想中比写一个新的。
防止外部依赖的唯一选择是以一种或另一种方式封装它们。这可能涉及一些样板代码,但如果此样板代码最少,则值得付出努力。
因为我看到项目有可怕的依赖关系,所以我想了想如何防止这种依赖关系混乱并制作了下图:
您无法控制的外部代码为红色。如果您不考虑构建代码,您的代码(橙色)将直接依赖于外部代码,并面临外部更改的风险。您可以尝试编写不依赖于外部代码的代码(绿色)。实现此目的的方法是在自己的界面中定义所需的外部功能。然后您有一些代码(橙色)实现这些接口并具有外部依赖性。您通过依赖注入框架注入带有外部依赖的代码。
这种方法将外部更改的影响仅限于橙色代码。但是,与在代码中的任何地方直接使用依赖项相比,它需要更多的计划。而且因为更多的计划意味着更多的努力,所以往往没有付诸实践。