跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • IDEA 社区版和旗舰版果然还是有-内在区别-的吧
未分類
9 12 月 2020

IDEA 社区版和旗舰版果然还是有-内在区别-的吧

IDEA 社区版和旗舰版果然还是有-内在区别-的吧

資深大佬 : monetto 12

在公司开发 Java6 的老项目,团队里有人用了 Lombok,版本是 1.16 。

主一直用的社区版+Smart Tomcat 插件开发。奈何动不动就抽风报错,提示找不到符号(1.16 的 Lombok 应该是无法与 IDEA 2020.1 以后的版本配合使用的)。这只是其中一个问题。

还有就是代码本身没问题,然后 IDEA 编译就报错,文件爆红了,结果打开文件,爆红自己一会消失了。无奈。

上面你这两个问题都可以通过使用 Maven 构建解决。但是今天碰到了个问题,SmartTomcat 插件配合 Tomcat8.5 启动一个项目,半天启动不起来,不是报没找到符号,就是报“实际参数列表和形式参数列表长度不同”,JAR 包版本什么都检查过了,最后启动起来了,IDEA 自己又报了个“ModuleUtilCore.findModuleForFile must not be null”,

也启动成功过几次,最后总结就是能不能启动完全看脸…真–迷惑。今天晚上实在启动不起来了,而且身边的同事一直都没这些问题(其他人一直用的旗舰版),遂主也试了下旗舰版,一次启动成功…非常轻松….真心跪了。

个人感觉 IDEA 社区版和旗舰版,除了支持 JavaEE 和 Spring 还有 JS 以外…还是有内在区别的…不只是功能上的区别…有了解的大佬吗?

大佬有話說 (56)

  • 主 資深大佬 : monetto

    查了下,个人版的应该是没有使用设备限制的吧…那就是买了个人版之后,家里的 Mac 和公司的 PC 都能用吧?没有设备数量限制吧(有大佬了解吗?)

    然后再弱弱的问一下哪里有旗舰版的优惠渠道…想搞一年然后获得—当前版本的—永久激活码….(订阅满 1 年可以一直不升级用当前版本)

  • 資深大佬 : acrisliu

    个人版买了可以在公司和个人电脑上用,也能开发商业项目,只是不能共享给其他人使用,也不能让公司以任何方式报销你的购买费用。

  • 主 資深大佬 : monetto

    @acrisliu 那就是说,就我个人而言,我买完之后如果没有升级诉求,我家里所有的电脑都可以安装,以后我自己用就再也不用付钱了?(不过他怎么知道是我自己用,还是我和同事一起用…)

  • 資深大佬 : neoblackcap

    @monetto 君子协议,不过话说他们是有中国区的销售的。你们公司大一点的话,通过遥感技术,应该会上面推销或者法务发邮件

  • 資深大佬 : hantsy

    一直用 CE 版本,商业版本太重。

  • 資深大佬 : hantsy

    你们公司真牛逼,Java6 用到现在。

    我的的维护观点,只要是公司项目还活着,一律更新到最新稳定版本。除了那个项目完全放弃了。

  • 主 資深大佬 : monetto

    @hantsy 是的。主要是 CE 版完全开源。个人也非常喜欢….奈何治不了开发团队大…

  • 資深大佬 : 12101111

    你说的都是软件 bug, 并不是功能区别

  • 主 資深大佬 : monetto

    @hantsy 成本太高。坐标某电商公司…升级出现问题,出现损失,谁也承担不起啊…

  • 主 資深大佬 : monetto

    @12101111 确实…不过这么一想 IDEA 的社区版并没有想象的那么好了…

  • 資深大佬 : TypeError

    pycharm 社区版除了没有数据库和一些框架支持,没感觉有区别

  • 資深大佬 : young1lin

    真的不建议使用 Lombok,还有 AutoValue,都是血和泪的教训,内网开发。而且 Lombok 生成的 set/get 方法和 IDEA 手动生成不一样,有巨坑。

  • 主 資深大佬 : monetto

    @TypeError 我在用 IDEA 社区版开发 SpringBoot+Java8 的新项目的时候也是这么想的…配合 Python 插件感觉简直无敌…直到去了现在的公司…

  • 主 資深大佬 : monetto

    @young1lin 是的,我个人也很讨厌这个…说是神器不如说是自己图方便,侵入性太强,一个人用整个团队都要装插件……真想方便把所有变量设置为 Public 不是更方便?(狗头保命)。或者用 Python,Py 开发是真的快…只不过后期火葬场。个人感觉还是严谨点,约束性强点比较适合团队开发,更何况 IDEA 自动生成 getter 和 setter 就一键的事,同样很方便。

  • 資深大佬 : echo1937

    @young1lin #12 Lombok 生成的 set/get 方法和 IDEA 手动生成不一样,有巨坑。 — 具体是指什么?

  • 資深大佬 : chendy

    @echo1937 lombok 的 get/set 命名在一些特殊情况下不符合 java bean 的命名规范,印象里有“名字第二个字母是大写字母”的情况,总之不是很常见,但是最好知道。。。

  • 資深大佬 : echo1937

    @chendy #16 这个我知道,但是我不觉得这是 lombok 的问题。

    比方说,类中有个成员变量 private String Uname,你手写的 getter 方法肯定还是 getUname(),

    此时使用 Jackson 进行序列化,你得到的默认结果必然是{“uname”:”xxxx”},而不是众所期待的{“Uname”:”xxxx”},

    也就是说,如果存在违反 java bean 命名规范的成员变量,

    下游一大堆的插件,包括且不仅限于 lombok/Jackson…,有一个算一个都会出问题,

    所以问题不是这些下游组件的坑,而是变量命名规范没有得到很好的遵守。

  • 資深大佬 : FreeEx

    说 Lombok 有坑的就是自己菜怪工具…

  • 資深大佬 : zmq175

    公司得一个项目就是 lombok 版本只能搭配 1.8 使用,之前装的 13 就是不兼容。。。。

  • 資深大佬 : w292614191

    @echo1937 #17
    首字母大写?不出问题有鬼。

  • 資深大佬 : kingfalse

    拒绝 lombok 是个好习惯

  • 資深大佬 : tinyuu

    不拒绝 lombok 是个好习惯

  • 資深大佬 : cjh1095358798

    java 就是麻烦

  • 資深大佬 : hantsy

    @chendy 不符合规范,就先去做规范问题。

    不能说上厕所的时侯,尿到裤子上了,最后你的归结的原因是那个尿池做得不行。

  • 資深大佬 : young1lin

    @echo1937 就是他说的这个问题,这是其一,其二是内网开发,不给你装 Lombok 插件。然后项目中有人用,项目是开始时是外网开发的,然后从外网传到内网,转到内网开发的。我得一个个删了 Lombok 的注解,然后再搞。其三,有些人不知道 @Log4j 和 @Slf4j 的区别,搞得打印日志也有问题(我是在东方证券那看到别人内网用 Lombok 这么搞的,我和他解释了两个的区别)。

    总之,Lombok 这个“糖”很甜,但小心甜掉牙了。

  • 資深大佬 : hantsy

    @monetto 如果积累下去,以后升级成本会更高。

    这个只要用了 CI/CD 的话,平时依赖环境升级不是什么难事,有时就是切换一下配置而已。

    现在很难想像 Java 6 代码长什么样子。个人习惯上,特别是语法上我真不适应 Java 8 以前的啦。

  • 資深大佬 : hantsy

    @monetto 既然是电商,一般都是烧钱如流水,还在用 Java 6 的,应该已经持续了 10 年了,也不会缺少那么点钱去买 Jetbrains 全套商业协议吧。

  • 資深大佬 : wr516516

    @young1lin 拷贝个插件安装包离线装呗

  • 資深大佬 : hantsy

    Lombok 在 IDEA,Eclipse 下都是需要另外安装插件。NetBeans 不需要。

    Lombok 是利用 JavaC APT 特性而已,但是各 IDE 在 Java Compiler 上处理不一样,NetBeans 有专门的 Compiler 扩展,Eclipse 有自己 Compiler 。

  • 資深大佬 : wr516516

    最新版的 spring 和 idea 好像都默认集成 lombok 了

  • 資深大佬 : Geekerstar

    说 Lombok 有坑的就是自己菜怪工具…

  • 資深大佬 : hantsy

    @young1lin

    生成的 Class 自己的反编译一下就知道,它干了什么东西,再来比较它的 Getter/Setter,难道你的 IDE 生成的垃圾 Getter 和 Setter 还能有什么花样?

    一般来讲,我用 Lombok 是非常喜欢用它生成的 Builder,Getter 和 Setter 从来没调用过。

    至于替代品,我建议更新 Java 版本用 record 。

    https://github.com/hantsy/spring-playground/blob/master/programming-models/webmvc-fn/src/main/java/com/example/demo/DemoApplication.java#L117

    或者直接使用 Kotlin 语言,data class 啥也不用写。

    https://github.com/hantsy/spring-playground/blob/master/programming-models/webflux-ktco-fn/src/main/kotlin/com/example/demo/DemoApplication.kt#L185

  • 資深大佬 : pushback

    为啥要一个个删注解呢?找同事导入 jar 插件不行?

  • 資深大佬 : echo1937

    @hantsy #29 2020.3 版本开始,lombok 内置了,不需要额外安装

    @young1lin #25 你这个问题,是环境问题,而非 lombok 问题,

    这好比我从 Maven 中央仓库引了一个包,到了内网的私服没这个包或者没有这个版本的,

    你照样需要去修改 /删除相关代码,这真不能怪这个包,

    JDK 版本 /项目环境 /甚至开发工具,这都属于工程管理问题。

    另外就像刚才说的,2020.3 版本开始,不需要额外安装 lombok 插件了。

  • 資深大佬 : hantsy

    @echo1937 我的 IDEA 好久没重新安装过了,两年了一直都是用 JetBrains Toolbox 管理自动更新。现在内置了 Lombok,这个真不清楚。

  • 資深大佬 : hantsy

    @echo1937 现在看到有一个 Edu 跟 CE 有什么差别,CE+那个 Edu 插件?

  • 資深大佬 : libook

    @monetto 任何疑问都可以问 JetBrains 的客服,可以给他们发邮件也可以去 Twitter 上艾特他们。

    我问过他们的客服:
    1. 个人版可以用于开发商业项目,但仅限于自己使用。
    2. 个人设备安装数量无限制,但是不能同时在多个设备上使用。我的设备超多,且一台 PC 可能都有三系统环境,都装了 IDEA 登录了账号,没出现过被封或不能用的情况。

  • 資深大佬 : hantsy

    @wr516516 Spring 内置?你是说 Spring Boot ?还是 Spring 核心框架? Spring 核心,我个人觉得可能性不大,Spring 一直在避免第三方依赖,Spring 5.0 重新写了一个日志抽象( spring-jcl )去掉了 Apache Commons Logging 依赖。

    据我知道,Spring Cloud 从一开始就添加了 Lombok 依赖。Spring Boot,没注意最新版本 2.4 的新特性有这个说明,之前是肯定没有 Lombok 依赖的,我一直都是手动添加了依赖。

  • 資深大佬 : Hurriance

    用过 lombok,侵入性强,说 lombok 不坑的怕是没有因为这个出现过问题,出过问题你就知道多难排查这个坑

  • 資深大佬 : hantsy

    @Hurriance Lombok 是零入侵的。仅仅是编译时需要,运行时根本不需要。

  • 資深大佬 : wbprime

    Lombok 会在编译阶段修改类的字节码,导致字节码和 Java 源码不一致;开发的时候是面向字节码调用而不是面向源码;如果能接受这种方式,为什么不直接使用 Kotlin 或 Groovy 来与 Java 协同开发呢

    AutoValue 则不一样,遵循 APT 规范,只会生成字节码而不修改字节码;开发的时候还是遵循的 Java 的面向接口开发的传统。

  • 資深大佬 : yazinnnn

    不如拥抱 kotlin,拒绝 java

  • 資深大佬 : RedBeanIce

    社区版本的 idea,好像无法运行 springboot 项目

  • 資深大佬 : lishen226

    @RedBeanIce 可以的

  • 資深大佬 : jzmws

    @young1lin 真的没必要去省个 get/set 方法, 怎么说把代码更多是给人看了 , 用法了 lombok 看不到 get/set 挺奇怪的.
    还有就是 lombok 是基于 ide 的这个就很坑了,其他人用就要安装插件.

  • 資深大佬 : hangszhang

    老子就是要用 lombok, 老子就是喜欢

  • 資深大佬 : hantsy

    @jzmws 第一次听说 Lombok 基于 IDE 。上面都说,它是利用 JavaC APT,只要有 JavaC,脱离 IDE, 使用 Maven,Gradle 等就可以编译的。

    而只有 NetBeans IDE 一开始就是默认启用 APT (同时支持源码处理,Classes 处理),很长一段时间我都是 NetBeans 开发,所有基于 APT 的都是不关心的。比如 JPA Metamodels,QueryDSL models,Lombok 等全部支持。

  • 資深大佬 : hantsy

    @wbprime Lombok 修改 Classes 这种方式太常见了。

    很早以前 AspectJ Compiler 也支持 Classes 层面的 Weaving, 在 Spring 中可以实现一些非 Spring 管理可以用注入(@Inject,@Autowired )。

    几乎所有的 JPA 实现,包括 Hibernate,EclipseLink 等,都是可以使用 ByteCode Enchancing 代替 Runtime Proxy,实现颗粒度更细的 Lazy 操作,比如 Hibernate 用 ByteCode Enchaner 可以实现 Property 级别的 Lazy 。

  • 資深大佬 : hantsy

    整个都是歪了。

    Lombok 可以带来开发上效率,让代码看起来更简洁,在没有使用 Record 或者切换到 Kotlin 之前,这是个非常不错的方案。

    至于抱怨编译错误的,应该多找找自己的原因。如果一个团队,因为某个人没有安装 Lombok Plugin 等产生抱怨,多想想团队管理方面的问题。

  • 資深大佬 : hantsy

    @RedBeanIce 只要是个 Java IDE 都是可以运行 Java Application main 方法。VSCode Java pack 也可以轻松解决。
    另外 ,Command CLI,不管是 Maven 还是用 Gradle 人人都是会用。

  • 資深大佬 : jzmws

    @hantsy 如果用了 Lombok 其他人用 ide 修改时候就要要安装 Lombok 插件

    这个东西我在 18 年时候用过一次, 其他同事上没有 lombok 插件导致都是报错,然后就不用了 ,
    对了这个鬼东西在做代码静扫描也是出错的.

  • 資深大佬 : jzmws

    @hantsy 歪了,lombok 这个东西是喜欢的人对他爱不释手,讨厌的人对它恨之入骨;

    首先 Lombok 做了什么事情 ,不用写 set/get/toStirng 方法(set/get 用的最多把,其他的功能用到的比较少把),还有就是日志,是解决了一大痛点. 所以有它存在的意义,少了 set/get 日常写的 bug 也清爽干净多了

    另外一个是 代码更多时候是给人看的,少了 get/set 修改时候不够直观(这个也算是自己能力不够) ,另外一个是别人要看带 Lombok 注解的代码 就要在 ide 上按照 Lombok 插件(上说 idea 2020.3 自带了,企业上用 一般不轻易升级 idea 的,如果用 eclipse 的呢?) 缺少了通用性 . 另外用 ide 上自动生成的 get/set 方法也是很方便.

    我的看法是 lombok 你可以用,但是不能用在工作项目上, 所有工作的要以稳为先, 新的技术也要大胆学习使用.

  • 資深大佬 : jzmws

    @hantsy

    @Hurriance 说的入侵时值别人再编译这份代码的时候把

  • 資深大佬 : wbprime

    @hantsy 感觉你在混淆概念。

    Lombok 是在编译期修改 AST 的方式修改字节码,这种行为是非预期的不具有可移植性的。而且由于 getter setter constructor logger 等都是在编译期生成的,导致的一个现象就是开发者在开发时面向想象编程的(就算在 IDE 插件的帮助下能自动提示)。正经的 APT 类的工具是生成新的类,使用的时候一般是通过接口或父类来使用,这个是符合 Java 开发实践的。

    而你所说的 weaving,是在运行期的。这个行为也是标准的,跨 JDK 兼容的。而且这种运行时也大部分是生成字节码而不是修改字节码,通过 DI 来 intercept 对象创建过程。少量的修改字节码的工具,一般用在测试中。

    我之所以不喜欢在 Java 项目中使用 Lombok,是因为其使用了非标准化的私有的 API,相当于自己实现了一个 JAVM based language 的编译器,导致代码不纯洁;至于 IDE 什么的倒是次要的。Lombok 想要解决的问题确实存在,但是也都有其他替代方案:Getter/Setter/Builder 考虑 AutoValue & FreeBuilder ; Log support 考虑使用 Google Flogger ; var 考虑 JDK 11 ;等等。

    以上 _^_^_。

    补充,lombok 不仅仅是使用了 APT 技术,APT 没有提供修改 AST 的方法,lombok 使用了 OpenJDK/Oracle JDK javac 私有的 API,而这些 API 不保证兼容性,see <https://notatube.blogspot.com/2010/11/project-lombok-trick-explained.html>。虽然当前的主流 JDK 都是 OpenJDK based,Lombok 也对 OpenJ9 做了适配,但是技术的发展是难以预计的,没准几年内有另外一个 Anti-OpenJDK 的新 JDK 发行版面世且获得了巨大成功呢(这并非不可能的,想想 GraalVM 。。。)

  • 資深大佬 : hantsy

    @wbprime AspectJ 编译时处理,这个我以前的用法,https://github.com/hantsy/angularjs-springmvc-sample/blob/master/pom.xml#L513

    这是运行时?

    以前 Spring 官方的 Spring Roo (强依赖 AspectJ 编译器),如果用过就知道什么叫编译时处理了。这种修改 Classes 的 Bytecode Enchaner 技术太常见了。比如,ByteMan,Javaassit 等项目。

    Lombok 内部使用了 APT,还做 ByteCode 修改,我一点也不关心,因为到现在为止,这么多年的使用,仅遇到一次兼容性问题(而且 Google 下,早就有答案)。对我的项目,我只关心代码简洁了很多。在你项目没上 Java 15 以上,没用上 Record 前,你还需要这类的辅助工具来清理代码。setter,getters 很多时候都是满足一些 JavaBean 规范的需要。而在开发我更多的是使用生成的 Builder,用 RequiredArgsConstructor 去掉 Constructor,生成静态工厂 of, Value 只读( Dto ) 等。它实实在在的简化我的代码。AutoValue 能高明一些?

  • 資深大佬 : hantsy

    开始用这类工具的时候,做了很多对比,除了 AutoValue, 有好几个类似的,
    比如 Immutables,https://immutables.github.io/

    Lombok 功能最全。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具