使用龙目岛项目安全吗? [关闭]

2024-02-22

如果你不知道龙目岛计划 http://projectlombok.org帮助解决 Java 的一些烦恼,比如生成带注释的 getter 和 setter http://projectlombok.org/features/GetterSetter.html乃至使用 @Data 生成简单的 JavaBean 类 http://projectlombok.org/features/Data.html。它确实对我有帮助,特别是在 50 个不同的事件对象中,其中最多有 7 个不同的字段需要使用 getter 构建和隐藏。我可以用这个删除近千行代码。

但我担心,从长远来看,这将是一个令人遗憾的决定。烈火战将在##Java Freenode当我提到它时,提供代码片段会让可能的帮助者感到困惑,人们会抱怨缺少 JavaDoc http://groups.google.com/group/project-lombok/browse_thread/thread/9beea685c5e85529?tvc=2,未来的提交者可能会将其全部删除。我真的很喜欢积极的一面,但我担心消极的一面。

那么:在任何项目(无论大小)上使用 Lombok 是否安全?正面影响值得负面影响吗?


TL; DR:

是的,使用起来非常安全,我建议使用它。 (2022 年 5 月)


原答案

今天刚开始使用Lombok。到目前为止,我很喜欢它,但我没有看到提到的一个缺点是重构支持。

如果你有一个类注释为@Data,它会根据字段名称为您生成 getter 和 setter。如果您在另一个类中使用这些 getter 之一,那么确定该字段的命名不当,它将找不到这些 getter 和 setter 的用法,并用新名称替换旧名称。

我想这必须通过 IDE 插件而不是通过 Lombok 来完成。

更新(2013 年 1 月 22 日)
使用 Lombok 3 个月后,我仍然推荐它用于大多数项目。然而,我确实发现了另一个与上面列出的类似的缺点。

如果你有课,请说MyCompoundObject.java有 2 个成员,均注释为@Delegate, say myWidgets and myGadgets, 你打电话时myCompoundObject.getThingies()来自另一个类,不可能知道它是否委托给Widget or Gadget因为您无法再跳转到 IDE 中的源代码。

使用 Eclipse“生成委托方法...”为您提供相同的功能,速度同样快,并且提供源跳转。缺点是它会用样板代码扰乱您的源代码,从而使您无法集中精力关注重要的内容。

更新 2(2013 年 2 月 26 日)
5 个月后,我们仍在使用 Lombok,但我还有一些其他烦恼。当您试图熟悉新代码时,缺少声明的 getter 和 setter 有时会很烦人。

例如,如果我看到一个名为getDynamicCols()但我不知道它是关于什么的,我有一些额外的障碍需要跨越才能确定这个方法的目的。有些障碍是 Lombok,有些是缺乏 Lombok 智能插件。障碍包括:

  • 缺乏 JavaDocs。如果我对该字段进行 javadoc,我希望 getter 和 setter 能够通过 Lombok 编译步骤继承该 javadoc。
  • 跳转到方法定义会将我跳转到类,但不会跳转到生成 getter 的属性。这是一个插件问题。
  • 显然,除非生成或编写方法,否则无法在 getter/setter 中设置断点。
  • 注意:此参考搜索并不像我最初认为的那样是一个问题。不过,您确实需要使用启用大纲视图的透视图。对于大多数开发人员来说这不是问题。我的问题是我正在使用 Mylyn,它正在过滤我的Outlineview,所以我没有看到方法。缺乏参考文献搜索。如果我想看看谁打来的电话getDynamicCols(args...),我必须生成或编码设置器才能搜索引用。

更新 3(2013 年 3 月 7 日)
我想学习使用 Eclipse 中的各种做事方式。您实际上可以在 Lombok 生成的方法上设置条件断点 (BP)。使用Outline查看方法,可以右键单击该方法Toggle Method Breakpoint。然后打到BP的时候就可以使用调试了Variables查看生成的方法命名的参数(通常与字段名称相同),最后使用Breakpoints查看右键单击 BP 并选择Breakpoint Properties...添加一个条件。好的。

更新 4(2013 年 8 月 16 日)
Netbeans 不喜欢您在 Maven pom 中更新 Lombok 依赖项。该项目仍然可以编译,但文件会被标记为存在编译错误,因为它看不到 Lombok 正在创建的方法。清除 Netbeans 缓存可以解决该问题。不确定是否有像 Eclipse 中那样的“Clean Project”选项。小问题,但想让大家知道。

更新 5(2014 年 1 月 17 日)
Lombok 并不总是能与 Groovy 很好地配合,或者至少groovy-eclipse-compiler。您可能必须降级编译器的版本。Maven Groovy 和 Java + Lombok https://stackoverflow.com/questions/8524891/maven-groovy-and-java-lombok

更新 6(2014 年 6 月 26 日)
一句警告。 Lombok 有点容易让人上瘾,如果你从事的项目由于某种原因而无法使用它,它会让你恼火。您可能根本不使用它会更好。

更新 7(2014 年 7 月 23 日)
这是一个有趣的更新,因为它直接解决了safetyOP 询问的采用 Lombok 的问题。

从 v1.14 开始,@Delegate注释已降级为实验状态。详细信息记录在他们的网站上(Lombok 代表文档 http://projectlombok.org/features/experimental/Delegate.html).

问题是,如果您使用此功能,您的撤销选项将受到限制。我看到的选项是:

  • 手动删除@Delegate注释并生成/手动编码委托代码。如果您在注释中使用属性,这会有点困难。
  • Delombok 具有以下内容的文件@Delegate注释,也许可以添加回您想要的注释。
  • 切勿更新 Lombok 或维护分叉(或使用体验式功能)。
  • Delombok 整个项目并停止使用 Lombok。

据我所知,Delombok 没有删除注释子集的选项 https://github.com/rzwitserloot/lombok/blob/master/src/delombok/lombok/delombok/Delombok.java;至少对于单个文件的上下文来说,要么全部要么全无。我打开了请求此功能的票证 https://code.google.com/p/projectlombok/issues/detail?id=711带有 Delombok 标志,但我不希望在不久的将来出现这种情况。

更新 8(2014 年 10 月 20 日)
如果您可以选择,Groovy 提供了 Lombok 的大部分相同优点,以及大量其他功能,包括@代表 http://groovy.codehaus.org/Delegate+transformation。如果您认为很难将这个想法推销给当权者,请查看@CompileStatic or @TypeChecked注释看看是否可以帮助您的事业。实际上,Groovy 2.0 版本的主要关注点是静态安全 http://docs.codehaus.org/display/GROOVY/Groovy+2.0+release+notes#Groovy2.0releasenotes-A%E2%80%9Cstatictheme%E2%80%9Dforadynamiclanguage.

更新 9(2015 年 9 月 1 日)
龙目岛仍处于积极维护和增强 https://projectlombok.org/changelog.html,这预示着采用的安全水平。这@Builder https://projectlombok.org/features/Builder.html注释是我最喜欢的新功能之一。

更新 10(2015 年 11 月 17 日)
这似乎与OP的问题没有直接关系,但值得分享。如果您正在寻找工具来帮助您减少编写的样板代码量,您还可以查看谷歌汽车 https://github.com/google/auto- 尤其自动值 https://github.com/google/auto/tree/master/value。如果你看看他们的幻灯片 https://docs.google.com/presentation/d/14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE/edit#slide=id.g2a5e9c4a8_0104,将 Lombok 列为他们试图解决的问题的可能解决方案。他们列出的龙目岛缺点是:

  • 插入的代码是不可见的(您无法“看到”它生成的方法)[编者注 - 实际上您可以,但它只需要一个反编译器]
  • 编译器 hack 是非标准且脆弱的
  • “在我们看来,你的代码不再是真正的 Java”

我不确定我在多大程度上同意他们的评价。鉴于幻灯片中记录的 AutoValue 的缺点,我将坚持使用 Lombok(如果 Groovy 不是一个选项)。

更新 11(2016 年 2 月 8 日)
我发现春罗 http://projects.spring.io/spring-roo/有一些相似的注释 https://stackoverflow.com/search?q=RooEquals。我有点惊讶地发现 Roo 仍然是一个东西,而且查找注释文档有点粗糙。移除看起来也不像 de-lombok 那么容易。龙目岛似乎是更安全的选择。

更新 12(2016 年 2 月 17 日)
在试图找出为什么在我目前正在进行的项目中引入 Lombok 是安全的理由时,我发现了一块金子,其中添加了v1.14 - The 配置系统 https://projectlombok.org/features/configuration.html!这意味着您可以配置项目以禁止您的团队认为不安全或不需要的某些功能。更好的是,它还可以使用不同的设置创建特定于目录的配置。这太棒了。

更新 13(2016 年 10 月 4 日)
如果这种事情对你来说很重要奥利弗·吉尔克 https://stackoverflow.com/users/18122/oliver-gierke觉得很安全将 Lombok 添加到 Spring Data Rest https://github.com/spring-projects/spring-data-rest/blame/897bc88d6922e755038a6a8e34ca25ace6a27689/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/alps/RootResourceInformationToAlpsDescriptorConverter.java#L20.

更新 14(2017 年 9 月 26 日)
正如所指出的@gavenkoa https://stackoverflow.com/users/173149/gavenkoa在对OP问题的评论中,JDK9 编译器支持尚不可用 https://github.com/rzwitserloot/lombok/issues/985(问题#985)。听起来这对 Lombok 团队来说也不是一个容易解决的问题。

更新 15(2018 年 3 月 26 日)
Lombok 变更日志显示自 v1.16.20 起“现在可以在 JDK1.9 上编译 lombok https://projectlombok.org/changelog“ 虽然#985 https://github.com/rzwitserloot/lombok/issues/985仍然开放。

然而,为了适应 JDK9,需要进行一些重大更改;所有这些都与配置默认值的更改无关。有点令人担忧的是,他们引入了重大更改,但该版本仅增加了“增量”版本号(从 v1.16.18 到 v1.16.20)。由于这篇文章是关于安全的,如果您有yarn/npm就像自动升级到最新增量版本的构建系统一样,您可能会猛然醒悟。

更新 16(2019 年 1 月 9 日)

它似乎JDK9问题已经解决 https://projectlombok.org/changelog据我所知,Lombok 可以与 JDK10 配合使用,甚至可以与 JDK11 配合使用。

我注意到的一件事是,从安全方面来看,从 v1.18.2 到 v1.18.4 的更改日志列出了两项:BREAKING CHANGE!?我不确定 semver“补丁”更新中如何发生重大变化。如果您使用自动更新补丁版本的工具,则可能会出现问题。

更新 17(2021 年 3 月 17 日)

Lombok 开发人员和 OpenJDK 开发人员之间围绕 JDK 16 发生了一些戏剧性的事情。JDK 开发者争论 https://github.com/rzwitserloot/lombok/issues/2681#issuecomment-791452056Lombok 正在通过 JDK 团队想要关闭的漏洞利用未发布的 JDK 内部结构,但由于各种原因故意保持开放状态。

(关于龙目岛的安全)如下:

所有对内部的访问都将像以前一样可用,前提是 客户端应用程序明确允许它,并承认它是 故意承担任何维护(或安全)问题,这可能 需要。

虽然 Lombok 可能认为他们在欺骗 OpenJDK,但他们所做的一切 宣布他们的意图是欺骗自己的用户。

可能很快有一天,Lombok 将无法针对 JDK 的安全限制找到任何更具创意的解决方案。即使他们这样做,在项目中使用 Lombok 的安全性也可能会受到质疑。

更新 18(2022 年 5 月 11 日)

最近的评论要求总结,所以我把它放在顶部。

简而言之,它使用起来非常安全,如果我们编写 Java 代码,我强烈建议使用它。

鉴于对 JDK 17 的支持已经取消了一段时间,并且在 JDK 正式发布后不到一个月就发布了,Lombok 的安全性很高。如果需要,您可以随时 de-lombok。

作为一名顾问,我了解许多不同的公司如何编写代码。过去 5 年我遇到的每个客户都使用过 Lombok。这些都是财富1000强公司。它加快了开发速度并减少了出错的可能性。

也就是说,您仍然需要了解 JDK 的最新功能。考虑使用Javarecord关键字使您的对象不可变,而不是某些 Lombok 功能。在有意义的地方使用 Lombok。使用 Lombok 配置选项来防止以您不同意的方式使用它。

因此,除非发生重大事件,否则这可能是我对此答案的最后一次更新。感谢所有的投票。我很高兴它有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用龙目岛项目安全吗? [关闭] 的相关文章

随机推荐

  • 我们应该忽略Pycharm .idea/文件夹中的misc.xml和.iml吗?

    我的谷歌搜索给了我这个线程 https stackoverflow com a 11968647 248616这将引导我们访问 Pycharm 官方网站here https intellij support jetbrains com hc
  • 如何在 Twisted 中将 TCP Keepalive 与端点一起使用?

    扭曲确实支持TCP 保活 https twistedmatrix com documents 13 0 0 api twisted internet tcp Connection html setTcpKeepAlive 但我找不到一种简单
  • 读/写 NetworkX 图形对象

    我正在尝试处理具有数亿个节点的超大规模 NetworkX Graph 对象 我希望能够将其写入文件 以免消耗我所有的计算机内存 然而 我需要不断地搜索现有节点 更新边缘等 对此有好的解决办法吗 我不确定它如何与提供的任何文件格式一起使用ht
  • 带有剪辑路径的 SVG 直线路径在 Chrome 中不可见

    我相信我在 Chrome 的 SVG 渲染中发现了一个错误 但我想知道是否有任何解决方法 使用这样的代码
  • ASP.NET Core RC2 作为 Linux 守护进程

    我需要有关作为 Linux 守护进程托管 NET Core 控制台或 ASP NET 应用程序的信息 Microsoft Hosting WindowsService 已经支持将应用程序托管为 Windows 服务 但我需要类似的 Linu
  • 如何在 ui-router 状态转换之间调出“正在进行”的加载栏?

    我有一个使用 ui router 的 AngularJS 应用程序 有时 应用程序在从一种状态转移到另一种状态时以及解析仍在进行中时会等待 有没有人有 或他们见过 任何示例 说明如何在从一种状态解析到另一种状态期间在屏幕上呈现 正在进行的
  • Grepping 一个大文件(80GB)有什么方法可以加快速度吗?

    grep i A 5 B 5 db pd Clients eightygigsfile sql 它已经在一个相当强大的 Linux 服务器上运行了一个小时 否则不会过载 grep 有什么替代品吗 关于我的语法有什么可以改进的地方 egrep
  • sveltejs 中的响应式全宽画布

    我对 svelte 很陌生 我正在尝试使用 svelte 在全屏上渲染画布 听起来很容易做到 但我无法让它正常工作 我正在绑定一个width and height变量为clientWidth clientHeight父级并使用这些变量来设置
  • VB.NET 中 IsNumeric() 的错误结果

    我在 VB NET 中有一个函数 它循环遍历值并尝试将其转换为小数 如果IsNumeric是真的 Dim Value As String If IsNumeric Value True Then Rate CType Value Decim
  • 在 excepthook 中打印原始异常

    我正在设置系统异常钩子这样我就可以记录发生的每个异常 让我们使用以下示例 而不是写入日志 def excepthook self type value traceback print n print type print value pri
  • 无法在opencv中加载haarcascadeshaarcascade.xml

    我尝试在 android 中使用 opencv 进行人脸检测 但无法加载对象检测 xml 文件 代码如下 static CvHaarClassifierCascade cascade 0 CvMemStorage storage 0 LOG
  • Excel 删除 Python 插入的有效公式

    我正在尝试使用 Python 生成 Excel xlsx 报告openpyxl 但有一个问题 Excel 不断从我的工作表中删除公式在一些特定的细胞中 我打印了正在插入的内容 它似乎绝对有效 如果我将其从控制台粘贴到单元格 它会显示确切的结
  • 我该如何:Git 单向推送/不可编辑的工作目录?

    有没有办法拥有两台机器 假设A和B A 是我的本地计算机 我在其中开发代码并推送它 B 是一个服务器 永远不需要编辑代码 但需要一个工作目录 是否有可能做到这一点without做任何事git pull是来自 B 的什么吗 基本上 我只想以一
  • 为什么 tokio::spawn 即使使用 .clone() 也会抱怨生命周期?

    我试图编译以下看似简单的代码 但出现错误 use std io Error derive Debug struct NetworkConfig bind String node key file String async fn networ
  • 检测视图控制器何时进入后台并恢复

    我正在实现一个具有以下要求的 ViewController 如果用户在 15 分钟后返回应用程序 则视图应重新加载数据 我正在考虑使用viewDidDisappear当应用程序进入后台时保存时间戳viewDidAppear用于检查以前保存的
  • 更新复选框并从颤动对话框中返回值

    我正在尝试将一些城市列表添加到带有复选框的对话框中 以便我需要实现多次单击项目 我正在尝试做的事情如下所示 onPressed从按钮调用 Rest Service 并在成功结果时我只显示一个对话框 void showCityDialog B
  • 其余 api 设计和上传图像的工作流程。

    我想设计一个API 允许客户端上传图像 然后应用程序创建图像的不同变体 例如调整大小或更改图像格式 最后应用程序将每个变体的图像信息存储在数据库中 当我尝试确定执行此任务的正确策略时 就会出现问题 以下是我能想到的一些不同策略 策略一 发送
  • 让实体框架使用 Contains 而不是 Like 并解释“ESCAPE ~”

    我在 EF 中使用了一行 LINQ 它基本上是在做myTable Where c gt c Contains mystring 这是生成的代码 SELECT TOP 300 Extent1 ID AS ID Extent1 FKFishEn
  • Zend Framework 2 的注释命名空间未加载 DoctrineMongoODMModule

    我已经加载了 zf2 的 Doctrine MongoODM 模块 我的控制器中有文档管理器 一切都很顺利 直到我尝试保留文档 它因以下错误而失败 语义错误 SdsCore Document User 类中的注释 Document 从未导入
  • 使用龙目岛项目安全吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如果你不知道龙目岛计划 http projectlombok org帮助解决 Java 的一些烦恼 比如生成带注释的 getter 和 sett