使用龙目岛项目是否安全?

如果你不知道项目Lombok帮助解决了Java的一些烦恼,比如用注解来生成getter和setter,甚至像使用@Data生成简单的JavaBean 。 它可以真正帮助我,特别是在50个不同的事件对象,你有多达7个不同的领域,需要构build和隐藏与获取。 我可以用这个删除近千行代码。

不过,我担心从长远来看,这将是一个遗憾的决定。 当我提到它时,Flamewars会爆发,提供代码片段会混淆可能的帮助者, 人们会抱怨缺lessJavaDoc ,未来的commiters可能只是将其删除。 我真的很喜欢这个积极的东西,但是我担心这个消极的东西。

那么,在任何小型或大型项目上使用都可以安全吗? 这些积极的影响是否值得消极?

这听起来像你已经决定,龙目岛项目给你提出的新项目的重大技术优势。 (从一开始我就对龙目项目没有特别的看法,无论如何。)

在某些项目(开源或其他方式)使用Project Lombok(或任何其他改变游戏规则的技术)之前,您需要确保项目利益相关方同意这一点。 这包括开发者和任何重要的用户(例如正式或非正式的赞助商)。

你提到这些潜在的问题:

当我提到它时,Flamewars会在## Java Freenode频道中爆发,

简单。 忽略/不参加火焰大战,或者干脆不提龙目。

提供代码片段会混淆可能的帮手,

如果项目战略是使用龙目岛,那么可能的帮手将需要习惯它。

人们会抱怨缺lessJavaDoc,

这是他们的问题。 没有一个人在正确的思维中试图严格地将组织的源代码/文档规则应用到第三方开源软件。 项目组应该可以自由设置适用于所使用技术的项目源代码/文档标准。

FOLLOWUP – Lombok开发人员认识到,不为合成的getter和setter方法生成javadoc注释是一个问题。如果这是您的项目的主要问题,那么另一种方法是创build并提交一个Lombok补丁来解决这个问题。 )

未来的委托人可能只是将其全部删除。

那不是! 如果商定的项目策略是使用龙目,那么应该对那些无条件地解除龙目标的代码进行批评,如果有必要的话撤销其承诺权。

当然,这是假设你已经从包括开发者在内的利益相关者那里买入了。 它假定你准备争取你的事业,并妥善处理不可避免的反对声音。

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

如果您有一个用@Data注解的类,它将根据字段名称为您生成getter和setter。 如果你在另外一个类中使用了其中一个getter,那么就决定这个字段命名不好,它将不会find这些getter和setter的用法,并用新的名字replace旧的名字。

我想这将不得不通过一个IDE插件,而不是通过龙目岛。

更新(1月22'13)
使用龙目岛3个月后,我仍然推荐大部分项目。 但是,我确实发现了另一个类似于上面列出的缺点。

如果你有一个类,说MyCompoundObject.java有两个成员,都用@Delegate注释,说myWidgetsmyGadgets ,当你从另一个类调用myCompoundObject.getThingies() ,不可能知道它是委托给Widget还是Gadget因为你不能在IDE中跳转到源代码。

使用Eclipse“生成委托方法…”为您提供相同的function,同样快速并提供源代码跳转function。 不足之处在于,它会把样板放在重要的东西上。

更新2(13年2月26日)
5个月后,我们还在使用龙目岛,但我还有一些其他的烦恼。 当您尝试熟悉新代码时,缺less声明的getter&setter可能会变得烦人。

例如,如果我看到一个名为getDynamicCols()的方法,但是我不知道它是怎么回事,那么我有一些额外的障碍来跳转来确定这个方法的目的。 有些障碍是龙目岛,有些是缺乏龙目智能插件。 障碍包括:

  • 缺乏JavaDocs。 如果我是领域的话,我希望getter和setter可以通过Lombok编译步骤inheritancejavadoc。
  • 跳转到方法定义跳转到类,但不是生成的getter属性。 这是一个插件问题。
  • 显然,除非您生成或编写方法,否则您无法在getter / setter中设置断点。
  • 注意:这个参考search不是我首先想到的问题。 您确实需要使用启用“大纲”视图的透视图。 大多数开发人员不是问题。 我的问题是我使用Mylyn过滤我的Outline视图,所以我没有看到的方法。 缺less参考search。 如果我想查看谁在调用getDynamicCols(args...) ,我必须生成或编码设置器才能search引用。

更新3(13年3月7日)
学习如何在Eclipse中使用各种方式做事。 实际上你可以在一个Lombok生成的方法上设置一个条件断点(BP)。 使用“ Outline视图,可以右键单击该方法来Toggle Method Breakpoint 。 然后当你点击BP时,可以使用debuggingVariables视图来查看生成的方法命名参数(通常与字段名称相同),最后使用Breakpoints视图右键单击BP并selectBreakpoint Properties...添加一个条件。 尼斯。

更新4(8月16'13)
当你更新你的Maven pom中的Lombok依赖关系时,Netbeans不喜欢它。 该项目仍然编译,但文件被标记为有编译错误,因为它不能看到龙目岛正在创build的方法。 清除Netbeanscaching解决了这个问题。 不知道是否有像Eclipse中的“Clean Project”选项。 小问题,但想知道它。

更新5(2014年1月17日)
龙门并不总是和Groovy,或者至lessgroovy-eclipse-compiler打好关系。 您可能必须降级您的编译器版本。 Maven Groovy和Java + Lombok

更新6(14年6月26日)
一个警告的话。 龙目岛有点容易上瘾,如果你在某个项目上工作,因为某种原因你不能使用它,它会让你烦恼。 你可能会更好,永远不要使用它。

更新7(2014年7月23日)
这是一个有趣的更新,因为它直接解决了OP问及采用Lombok的安全性

从v1.14开始,@ @Delegate注释已经被降为实验状态。 细节logging在他们的网站上( Lombok Delegate Docs )。

事情是,如果你使用这个function,你的退出选项是有限的。 我看到的选项是:

  • 手动删除@Delegate注释并生成/手动委托代码。 如果您在注释中使用属性,这有点困难。
  • Delombok具有@Delegate注释的文件,并可能会添加到您需要的注释中。
  • 永远不要更新龙目岛或保持一个分叉。
  • Delombok你的整个项目,停止使用龙目岛。

据我所知, Delombok没有select删除一部分注释 ; 至less在单个文件的上下文中是全部或全部。 我打开了一张票,要求用Delombok标志来请求这个function ,但我不会期望在不久的将来。

更新8(2014年10月20日)
如果这是您的select,Groovy提供了与Lombok大部分相同的好处,另外还有一些其他function,包括@Delegate 。 如果你认为将这个想法卖给权力的话会很困难,那么看看@CompileStatic或者@TypeChecked注解来看看它是否有助于你的理由。 事实上, Groovy 2.0版本的主要重点是静态安全 。

更新9(15年9月1日)
龙目岛仍然在积极维护和提升 ,这对采用的安全水平有很好的预示作用。 @Builder注释是我最喜欢的新function之一。

更新10(15年11月17日)
这似乎与OP的问题没有直接关系,但值得分享。 如果您正在寻找可以减less您编写的样板代码数量的工具,则还可以查看Google Auto – 特别是AutoValue 。 如果你看他们的幻灯片 ,龙目岛列表作为他们正在试图解决的问题的一个可能的解决scheme。 他们列出的龙目岛的缺点是:

  • 插入的代码是不可见的(你不能“看到”它产生的方法)[编者注 – 实际上你可以,但它只需要一个反编译器]
  • 编译器黑客是非标准的和脆弱的
  • “我们认为,你的代码不再是真正的Java”

我不确定我有多赞同他们的评价。 鉴于幻灯片中logging的AutoValue的缺点,我会坚持使用Lombok(如果Groovy不是一个选项)。

更新11(16年2月8日)
我发现Spring Roo有一些类似的注释 。 我有点惊讶地发现Roo仍然是一件事,为注释find文档有点粗糙。 去除也不像去龙目岛那样容易。 龙目岛似乎是更安全的select。

更新12(16年2月17日)
在试图提出为什么在目前正在开发的项目中引入Lombok是安全的理由时,我发现了一个在v1.14 – configuration系统中添加的黄金! 这意味着您可以configuration一个项目来禁止某些您的团队认为不安全或不可取的function。 更好的是,它也可以用不同的设置创build目录特定的configuration。 这太棒了。

更新13(16年4月4日)
如果这种事情对你来说很重要的话, 奥利弗·吉尔克 ( Oliver Gierke)觉得把“龙目”添加到Spring Data Rest是安全的。

更新14(17年9月26日)
正如@gavenkoa在OP问题的评论中指出的那样, JDK9编译器支持尚不可用 。 这听起来也不像龙目岛队那么容易。

继续使用Lombok,你可以在必要的情况下使用“delombok”代码http://projectlombok.org/features/delombok.html

个人(因此主观)我发现使用Lombok使我的代码更加expression我想要实现什么时候相比,IDE /自己的复杂的方法,如hashcode等。

使用时

 @EqualsAndHashCode(callSuper = false, of = { "field1", "field2", "field3" }) 

保持Equals&HashCode一致并跟踪哪些字段被评估比任何IDE /自己的实现更容易。 当您仍然定期添加/删除字段时尤其如此。

@ToString注解及其参数也是@ToString ,它清楚地传递了关于包含/排除的字段,获取者的使用或字段访问以及是否调用super.toString()所需的行为。

再次通过使用@Getter@Setter(AccessLevel.NONE)注释整个类(并且可以重写任何发散的方法),立即清除哪些方法可用于字段。

好处继续下去..

在我看来,这不是要减less代码,而是要清楚地传达你想达到的目标,而不是从Javadoc或实现中解决问题。 简化的代码使得更容易find任何不同的方法实现。

我知道我迟到了,但我无法抗拒这种诱惑:任何喜欢龙目的人都应该看看斯卡拉。 你在龙目岛发现的许多好点子都是Scala语言的一部分。

在你的问题上:让你的开发人员尝试Lombok比Scala更容易。 尝试一下,如果他们喜欢它,试试斯卡拉。

就像一个免责声明:我也喜欢Java!

当我向我的团队展示这个项目时,他的热情很高,所以我认为你不应该害怕团队的回应。

  • 就投资回报率而言,整合起来很简单,不需要改变其基本forms的代码。 (只需添加一个注释到你的class级)

  • 最后,如果你改变了主意,你可以运行unlombok,或者让你的IDE创build这些setter,getters和ctors(我认为一旦他们看到你的pojo变得多么清晰,

还有长期的维护风险。 首先,我build议读一下Lombok实际上是如何工作的,例如这里的开发人员给出的答案。

官方网站还包含一个缺点列表 ,包括Reinier Zwitserloot的这句话:

这是一个彻头彻尾的黑客。 使用非公开的API。 放肆的投射(知道在javac中运行的注释处理器将得到一个JavacAnnotationProcessor的实例,这是AnnotationProcessor(一个接口)的内部实现,所以恰好有一些额外的方法用于实时的AST) 。

在eclipse上,它可以说是更糟糕的(但更强大) – 一个java代理被用来注入代码到eclipse语法和parsing器类,这当然是完全非公开的API,完全没有限制。

如果你可以做一下龙标准的API,我会这样做,但是你不能。 尽pipe如此,我还是开发了运行在java 1.6上的eclipse v3.5的eclipse插件,并且没有对eclipse v3.4在java 1.5上运行做任何改变,所以它不是完全脆弱的。

总而言之,虽然Lombok可能会为您节省一些开发时间,但是如果存在非向后兼容的javac更新(例如,减轻漏洞),Lombok可能会让您停留在旧版本的Java中,而开发人员则争相更新它们的使用内部API。 这是否是一个严重的风险显然取决于项目。

龙目岛很棒,但是…

Lombok打破了注解处理的规则,因为它不会生成新的源文件。 这意味着如果他们期望getter / setter或其他任何存在的话,它就不能用于另一个注释处理器。

注释处理运行在一系列循环中。 在每一轮中,每一轮都轮到运行。 如果在完成一轮之后发现任何新的java文件,则开始另一轮。 通过这种方式,注释处理器的顺序并不重要,只要它们生成新的文件即可。 由于lombok不会生成任何新文件,因此不会启动新的回合,因此某些依赖lombok代码的AP不能按预期运行。 这对我来说是一个巨大的痛苦来源,在使用mapstruct的时候,delombok-ing并不是一个有用的选项,因为它破坏了日志中的行数。

我最终破解了一个构build脚本来处理lombok和mapstruct。 但是,我想至less因为这个项目的原因而丢掉龙目岛。 我一直在用其他的东西来使用lombok。

我已经使用龙目几乎所有的项目一年,但不幸的是删除它。 一开始,这是一种非常干净的发展方式,但为新的团队成员build立发展环境并不是那么容易和直接。 当涉及到一个headeche我刚刚删除它。 但这是一个很好的工作,需要更简单的设置。

想要使用@ToString@ToString但很快在Intellij IDEA的项目重build上面临随机编译错误。 在增量编译可以成功完成之前,必须多次进行编译。

使用Intellij IDEA 12.1.6和13.0,在jdk 1.6.0_39和1.6.0_45下没有任何lombok插件的情况下,试用了lombok 1.12.2和0.9.3。

不得不从手动复制来源的方法复制生成的方法,并把龙目岛搁置,直到更好的时间。

更新

只有启用并行编译才会出现问题。

提交了一个问题: https : //github.com/rzwitserloot/lombok/issues/648

我遇到了龙卷风jacksonCSV的问题,当我将我的对象(java bean)编组到一个CSV文件,重复的列,然后我删除龙目标的@数据注释和编组工作正常。

我还没有尝试过使用Lombok – 它已经在我的清单上了,但是听起来好像Java 8已经给它造成了很大的问题,而且一周前的补救工作还在进行中。 我的来源是https://code.google.com/p/projectlombok/issues/detail?id=451

我不推荐它。 我曾经使用过它,但是当我使用NetBeans 7.4时,我的代码被搞乱了。 我必须在我的项目中的所有文件中删除lombok。 有delombok,但我怎么能确定它不会拧我的代码。 我必须花费几天时间才能移除lombok,回到普通的Java风格。 我太辣了