我们目前正在从Java 8迁移到Java 11,但是,升级我们的服务并不像我们预期的那么痛苦。基本上,我们只需更改build.gradle文件中的版本号,服务就可以愉快地启动和运行。我们升级了使用这些库的库和(微)服务。到现在为止没有问题。
是否需要实际切换到模块?这将产生不必要的费用。如有任何建议或进一步阅读资料,将不胜感激。
为了澄清,如果不引入模块就使用了Java 9+代码,会有什么后果吗?它会与其他代码不兼容吗?
发布于 2020-07-17 17:28:57
不是的。
没有必要切换到模块。
从来没有必要切换到模块。
Java 9和更高版本通过未命名模块的概念支持传统类路径上的传统JAR文件,并且很可能会这样做,直到宇宙的热死。
是否开始使用模块完全取决于您。
如果您维护的大型遗留项目并没有很大的变化,那么它可能不值得付出这么大的努力。
如果您从事的是一个多年来难以维护的大型项目,那么模块化所带来的清晰性和纪律可能是有益的,但也可能是大量的工作,所以在开始之前要仔细考虑。
如果您正在启动一个新项目,那么我强烈建议您从模块开始,如果可以的话。到目前为止,许多流行的库都是upgraded to be modules,所以您所需要的所有依赖项都已经以模块化的形式可用了。
如果您维护一个库,那么如果您还没有这样做,并且如果您的库的所有依赖项都已被转换,那么我强烈建议您将它升级为一个模块。
所有这一切并不是说您在通过Java 8时不会遇到一些绊脚石,但是,您确实遇到的那些障碍可能与模块本身无关。自2017年发布Java9以来,我们所听到的最常见的迁移问题都与changes to the syntax of the version string和removal or encapsulation of internal APIs (例如sun.misc.Base64Decoder)有关,多年来,已经有了公共支持的替换。
发布于 2020-07-17 14:10:14
我只能告诉你我的组织对这件事的看法。我们正处于移动到模块的过程中,对于我们正在进行的每一个项目。我们正在建设的基本上是微型服务+一些客户库。对于微服务来说,向modules的转换在某种程度上是一个较低的优先级:那里的代码已经在docker容器中被隔离了,所以在其中“添加”模块对我们来说似乎不太重要。这项工作正在缓慢地进行,但它的优先级很低。
另一方面,客户端库是一个完全不同的故事。我不能告诉你我们有时有多乱。我将在jigsaw之前解释我讨厌的一点。您向客户端公开一个接口,供每个人使用。自动地,interface是public -暴露在世界上。通常,我所做的就是拥有一些使用该接口的package-private类,这些类没有公开给客户端。我不想让客户用它,这是内部的。听起来不错吧?不对。
第一个问题是,当这些package-private类增长,并且您需要更多的类时,将所有内容隐藏起来的唯一方法是在同一个包中创建类:
package abc:
-- /* non-public */ Usage.java
-- /* non-public */ HelperUsage.java
-- /* non-public */ FactoryUsage.java
....当它增长时(在我们的情况下),这些包太大了。搬到一个单独的包裹里?当然,但是HelperUsage和FactoryUsage将是public,我们从一开始就试图避免这种情况。
问题二:客户端的任何用户/调用者都可以创建相同的包名并扩展这些隐藏类。它已经在我们身上发生过几次了,有趣的时候。
modules以一种漂亮的方式解决了这个问题:public不再是真正的public;我可以通过exports to指令访问friend。这使得我们的代码生命周期和管理更加容易。我们就能逃出类路径地狱。当然,maven/gradle主要是为我们处理这个问题,但当出现问题时,疼痛将是非常真实的。还有很多其他的例子。
尽管如此,过渡(仍然)并不容易。首先,团队中的每个人都需要团结一致;第二,有障碍。我仍然看到的最大的两个是:您如何根据具体的内容将每个模块分开?我还没有确切的答案。第二个是split-packages,哦,漂亮的“同一个类由不同的模块导出”。如果这种情况发生在您的库中,则有减轻的方法;但如果这些是外部库.没那么容易。
如果您依赖于jarA和jarB (单独的模块),但它们都导出abc.def.Util,那么您将感到惊讶。不过,有办法解决这个问题。某种程度上是痛苦的但可以解决。
总的来说,自从我们迁移到模块(现在仍然如此)之后,我们的代码变得更干净了。如果你的公司是“代码第一”公司,这很重要。另一方面,我一直参与的公司如果这被视为“太贵”,“没有真正的好处”,由高级建筑师。
https://stackoverflow.com/questions/62950667
复制相似问题