V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
monetto
V2EX  ›  Java

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

  •  
  •   monetto · 2020-12-23 19:39:30 +08:00 · 10858 次点击
    这是一个创建于 1466 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在公司开发 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 以外...还是有内在区别的...不只是功能上的区别...有了解的大佬吗?

    61 条回复    2021-04-11 18:34:07 +08:00
    monetto
        1
    monetto  
    OP
       2020-12-23 19:41:29 +08:00
    查了下,个人版的应该是没有使用设备限制的吧...那就是买了个人版之后,家里的 Mac 和公司的 PC 都能用吧?没有设备数量限制吧(有大佬了解吗?)

    然后再弱弱的问一下哪里有旗舰版的优惠渠道...想搞一年然后获得---当前版本的---永久激活码....(订阅满 1 年可以一直不升级用当前版本)
    acrisliu
        2
    acrisliu  
       2020-12-23 19:51:59 +08:00 via Android   ❤️ 2
    个人版买了可以在公司和个人电脑上用,也能开发商业项目,只是不能共享给其他人使用,也不能让公司以任何方式报销你的购买费用。
    monetto
        3
    monetto  
    OP
       2020-12-23 19:55:19 +08:00
    @acrisliu 那就是说,就我个人而言,我买完之后如果没有升级诉求,我家里所有的电脑都可以安装,以后我自己用就再也不用付钱了?(不过他怎么知道是我自己用,还是我和同事一起用...)
    neoblackcap
        4
    neoblackcap  
       2020-12-23 19:57:40 +08:00   ❤️ 1
    @monetto 君子协议,不过话说他们是有中国区的销售的。你们公司大一点的话,通过遥感技术,应该会上面推销或者法务发邮件
    hantsy
        5
    hantsy  
       2020-12-23 20:24:55 +08:00
    一直用 CE 版本,商业版本太重。
    hantsy
        6
    hantsy  
       2020-12-23 20:27:22 +08:00
    你们公司真牛逼,Java6 用到现在。

    我的的维护观点,只要是公司项目还活着,一律更新到最新稳定版本。除了那个项目完全放弃了。
    monetto
        7
    monetto  
    OP
       2020-12-23 20:29:30 +08:00 via iPhone
    @hantsy 是的。主要是 CE 版完全开源。个人也非常喜欢....奈何治不了开发团队大...
    12101111
        8
    12101111  
       2020-12-23 20:30:02 +08:00
    你说的都是软件 bug, 并不是功能区别
    monetto
        9
    monetto  
    OP
       2020-12-23 20:31:43 +08:00 via iPhone
    @hantsy 成本太高。坐标某电商公司...升级出现问题,出现损失,谁也承担不起啊...
    monetto
        10
    monetto  
    OP
       2020-12-23 20:39:20 +08:00 via iPhone
    @12101111 确实...不过这么一想 IDEA 的社区版并没有想象的那么好了...
    TypeError
        11
    TypeError  
       2020-12-23 20:42:02 +08:00 via Android
    pycharm 社区版除了没有数据库和一些框架支持,没感觉有区别
    young1lin
        12
    young1lin  
       2020-12-23 20:52:00 +08:00   ❤️ 1
    真的不建议使用 Lombok,还有 AutoValue,都是血和泪的教训,内网开发。而且 Lombok 生成的 set/get 方法和 IDEA 手动生成不一样,有巨坑。
    monetto
        13
    monetto  
    OP
       2020-12-23 21:08:20 +08:00 via iPhone
    @TypeError 我在用 IDEA 社区版开发 SpringBoot+Java8 的新项目的时候也是这么想的...配合 Python 插件感觉简直无敌...直到去了现在的公司...
    monetto
        14
    monetto  
    OP
       2020-12-23 21:13:26 +08:00 via iPhone
    @young1lin 是的,我个人也很讨厌这个...说是神器不如说是自己图方便,侵入性太强,一个人用整个团队都要装插件......真想方便把所有变量设置为 Public 不是更方便?(狗头保命)。或者用 Python,Py 开发是真的快...只不过后期火葬场。个人感觉还是严谨点,约束性强点比较适合团队开发,更何况 IDEA 自动生成 getter 和 setter 就一键的事,同样很方便。
    echo1937
        15
    echo1937  
       2020-12-23 21:20:07 +08:00
    @young1lin #12 Lombok 生成的 set/get 方法和 IDEA 手动生成不一样,有巨坑。 -- 具体是指什么?
    chendy
        16
    chendy  
       2020-12-23 21:34:55 +08:00
    @echo1937 lombok 的 get/set 命名在一些特殊情况下不符合 java bean 的命名规范,印象里有“名字第二个字母是大写字母”的情况,总之不是很常见,但是最好知道。。。
    echo1937
        17
    echo1937  
       2020-12-23 22:04:47 +08:00   ❤️ 4
    @chendy #16 这个我知道,但是我不觉得这是 lombok 的问题。

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

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

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

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

    所以问题不是这些下游组件的坑,而是变量命名规范没有得到很好的遵守。
    FreeEx
        18
    FreeEx  
       2020-12-24 00:09:02 +08:00 via iPhone   ❤️ 3
    说 Lombok 有坑的就是自己菜怪工具…
    zmq175
        19
    zmq175  
       2020-12-24 01:19:59 +08:00
    公司得一个项目就是 lombok 版本只能搭配 1.8 使用,之前装的 13 就是不兼容。。。。
    w292614191
        20
    w292614191  
       2020-12-24 08:58:37 +08:00   ❤️ 2
    @echo1937 #17
    首字母大写?不出问题有鬼。
    kingfalse
        21
    kingfalse  
       2020-12-24 09:12:35 +08:00 via Android   ❤️ 1
    拒绝 lombok 是个好习惯
    tinyuu
        22
    tinyuu  
       2020-12-24 10:21:57 +08:00   ❤️ 1
    不拒绝 lombok 是个好习惯
    cjh1095358798
        23
    cjh1095358798  
       2020-12-24 10:33:25 +08:00
    java 就是麻烦
    hantsy
        24
    hantsy  
       2020-12-24 11:02:27 +08:00   ❤️ 2
    @chendy 不符合规范,就先去做规范问题。

    不能说上厕所的时侯,尿到裤子上了,最后你的归结的原因是那个尿池做得不行。
    young1lin
        25
    young1lin  
       2020-12-24 11:03:10 +08:00
    @echo1937 就是他说的这个问题,这是其一,其二是内网开发,不给你装 Lombok 插件。然后项目中有人用,项目是开始时是外网开发的,然后从外网传到内网,转到内网开发的。我得一个个删了 Lombok 的注解,然后再搞。其三,有些人不知道 @Log4j 和 @Slf4j 的区别,搞得打印日志也有问题(我是在东方证券那看到别人内网用 Lombok 这么搞的,我和他解释了两个的区别)。

    总之,Lombok 这个“糖”很甜,但小心甜掉牙了。
    hantsy
        26
    hantsy  
       2020-12-24 11:06:02 +08:00
    @monetto 如果积累下去,以后升级成本会更高。

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

    现在很难想像 Java 6 代码长什么样子。个人习惯上,特别是语法上我真不适应 Java 8 以前的啦。
    hantsy
        27
    hantsy  
       2020-12-24 11:07:54 +08:00
    @monetto 既然是电商,一般都是烧钱如流水,还在用 Java 6 的,应该已经持续了 10 年了,也不会缺少那么点钱去买 Jetbrains 全套商业协议吧。
    wr516516
        28
    wr516516  
       2020-12-24 11:13:43 +08:00
    @young1lin 拷贝个插件安装包离线装呗
    hantsy
        29
    hantsy  
       2020-12-24 11:14:34 +08:00
    Lombok 在 IDEA,Eclipse 下都是需要另外安装插件。NetBeans 不需要。

    Lombok 是利用 JavaC APT 特性而已,但是各 IDE 在 Java Compiler 上处理不一样,NetBeans 有专门的 Compiler 扩展,Eclipse 有自己 Compiler 。
    wr516516
        30
    wr516516  
       2020-12-24 11:15:01 +08:00   ❤️ 1
    最新版的 spring 和 idea 好像都默认集成 lombok 了
    Geekerstar
        31
    Geekerstar  
       2020-12-24 11:19:19 +08:00   ❤️ 1
    说 Lombok 有坑的就是自己菜怪工具…
    hantsy
        32
    hantsy  
       2020-12-24 11:22:34 +08:00
    @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
        33
    pushback  
       2020-12-24 11:25:11 +08:00
    为啥要一个个删注解呢?找同事导入 jar 插件不行?
    echo1937
        34
    echo1937  
       2020-12-24 11:26:06 +08:00
    @hantsy #29 2020.3 版本开始,lombok 内置了,不需要额外安装

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

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

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

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

    另外就像刚才说的,2020.3 版本开始,不需要额外安装 lombok 插件了。
    hantsy
        35
    hantsy  
       2020-12-24 11:34:23 +08:00
    @echo1937 我的 IDEA 好久没重新安装过了,两年了一直都是用 JetBrains Toolbox 管理自动更新。现在内置了 Lombok,这个真不清楚。
    hantsy
        36
    hantsy  
       2020-12-24 11:36:16 +08:00
    @echo1937 现在看到有一个 Edu 跟 CE 有什么差别,CE+那个 Edu 插件?
    libook
        37
    libook  
       2020-12-24 11:51:10 +08:00   ❤️ 1
    @monetto 任何疑问都可以问 JetBrains 的客服,可以给他们发邮件也可以去 Twitter 上艾特他们。

    我问过他们的客服:
    1. 个人版可以用于开发商业项目,但仅限于自己使用。
    2. 个人设备安装数量无限制,但是不能同时在多个设备上使用。我的设备超多,且一台 PC 可能都有三系统环境,都装了 IDEA 登录了账号,没出现过被封或不能用的情况。
    hantsy
        38
    hantsy  
       2020-12-24 11:57:32 +08:00
    @wr516516 Spring 内置?你是说 Spring Boot ?还是 Spring 核心框架? Spring 核心,我个人觉得可能性不大,Spring 一直在避免第三方依赖,Spring 5.0 重新写了一个日志抽象( spring-jcl )去掉了 Apache Commons Logging 依赖。

    据我知道,Spring Cloud 从一开始就添加了 Lombok 依赖。Spring Boot,没注意最新版本 2.4 的新特性有这个说明,之前是肯定没有 Lombok 依赖的,我一直都是手动添加了依赖。
    Hurriance
        39
    Hurriance  
       2020-12-24 12:06:17 +08:00 via iPhone
    用过 lombok,侵入性强,说 lombok 不坑的怕是没有因为这个出现过问题,出过问题你就知道多难排查这个坑
    hantsy
        40
    hantsy  
       2020-12-24 13:03:58 +08:00
    @Hurriance Lombok 是零入侵的。仅仅是编译时需要,运行时根本不需要。
    wbprime
        41
    wbprime  
       2020-12-24 15:38:26 +08:00
    Lombok 会在编译阶段修改类的字节码,导致字节码和 Java 源码不一致;开发的时候是面向字节码调用而不是面向源码;如果能接受这种方式,为什么不直接使用 Kotlin 或 Groovy 来与 Java 协同开发呢

    AutoValue 则不一样,遵循 APT 规范,只会生成字节码而不修改字节码;开发的时候还是遵循的 Java 的面向接口开发的传统。
    yazinnnn
        42
    yazinnnn  
       2020-12-24 15:53:26 +08:00
    不如拥抱 kotlin,拒绝 java
    RedBeanIce
        43
    RedBeanIce  
       2020-12-24 23:09:14 +08:00
    社区版本的 idea,好像无法运行 springboot 项目
    lishen226
        44
    lishen226  
       2020-12-25 04:38:12 +08:00
    @RedBeanIce 可以的
    jzmws
        45
    jzmws  
       2020-12-25 09:21:31 +08:00
    @young1lin 真的没必要去省个 get/set 方法, 怎么说把代码更多是给人看了 , 用法了 lombok 看不到 get/set 挺奇怪的.
    还有就是 lombok 是基于 ide 的这个就很坑了,其他人用就要安装插件.
    hangszhang
        46
    hangszhang  
       2020-12-25 10:20:53 +08:00
    老子就是要用 lombok, 老子就是喜欢
    hantsy
        47
    hantsy  
       2020-12-25 12:04:35 +08:00
    @jzmws 第一次听说 Lombok 基于 IDE 。上面都说,它是利用 JavaC APT,只要有 JavaC,脱离 IDE, 使用 Maven,Gradle 等就可以编译的。

    而只有 NetBeans IDE 一开始就是默认启用 APT (同时支持源码处理,Classes 处理),很长一段时间我都是 NetBeans 开发,所有基于 APT 的都是不关心的。比如 JPA Metamodels,QueryDSL models,Lombok 等全部支持。
    hantsy
        48
    hantsy  
       2020-12-25 12:11:41 +08:00
    @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
        49
    hantsy  
       2020-12-25 12:18:55 +08:00
    整个楼都是歪了。

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

    至于抱怨编译错误的,应该多找找自己的原因。如果一个团队,因为某个人没有安装 Lombok Plugin 等产生抱怨,多想想团队管理方面的问题。
    hantsy
        50
    hantsy  
       2020-12-25 12:20:36 +08:00
    @RedBeanIce 只要是个 Java IDE 都是可以运行 Java Application main 方法。VSCode Java pack 也可以轻松解决。
    另外 ,Command CLI,不管是 Maven 还是用 Gradle 人人都是会用。
    jzmws
        51
    jzmws  
       2020-12-25 16:03:22 +08:00
    @hantsy 如果用了 Lombok 其他人用 ide 修改时候就要要安装 Lombok 插件

    这个东西我在 18 年时候用过一次, 其他同事上没有 lombok 插件导致都是报错,然后就不用了 ,
    对了这个鬼东西在做代码静扫描也是出错的.
    jzmws
        52
    jzmws  
       2020-12-25 16:19:24 +08:00
    @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
        53
    jzmws  
       2020-12-25 16:23:51 +08:00
    @hantsy

    @Hurriance 说的入侵时值别人再编译这份代码的时候把
    wbprime
        54
    wbprime  
       2020-12-25 17:46:19 +08:00
    @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
        55
    hantsy  
       2020-12-25 20:13:52 +08:00
    @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
        56
    hantsy  
       2020-12-25 20:24:01 +08:00
    开始用这类工具的时候,做了很多对比,除了 AutoValue, 有好几个类似的,
    比如 Immutables,https://immutables.github.io/

    Lombok 功能最全。
    wbprime
        57
    wbprime  
       2020-12-28 10:14:01 +08:00
    @hantsy 我没有说 Lombok 不好用,人家开发者的技术比我高出了不知几万倍,全世界有很多人都在用它。

    我想表达的观点是这个东西干了什么你一定要清楚,它使用的是非 Java 的方式来提升了开发效率;如果想要代码写的爽,除了 Lombok 之外,使用其他的 JVM based Language 与 Java 混合开发是一个更好的选择,一是全能全面,一是标准化。如果不需要很复杂的语言层面增强,只需要 Getter Setter 之类的,我更加推荐 AutoValue 。

    以上。
    hantsy
        58
    hantsy  
       2020-12-28 11:00:19 +08:00
    @wbprime 看了上面这么多,难道这么多用 Lombok 或者不使用 Lombok 都是只认为它只是生成 setters/getters ?
    hantsy
        59
    hantsy  
       2020-12-28 11:11:41 +08:00
    那我说一下我的使用场景。

    1,项目中,我觉得最有意义的可能是 @RequiredArgsConstructor 。Spring4 开始支持在只一个 Constructuor 的组件中,其参数是自动 Inject 的,不需要额外的 @Inject 或者 Autowired 。如:
    https://github.com/hantsy/spring-reactive-jwt-sample/blob/master/src/main/java/com/example/demo/web/PostController.java#L26
    2,Sfl4j 的使用,Spring Boot 默认使用 Logback,包括了 Sfl4j 接口。Sfl4j 也是我在工作中使用了上十年的 Log API 。大大简化我的工作。
    3,@SneakyThrows 去掉 一些 Checkedexception 处理,Spring 不是从头到尾都是支持 Runtime Exception 吗?
    4, @Builder POJO 最简单操作方式,不管是写测试准备数据,还是在代码做数据填充,Builder 非常方便。

    至于 @Value,@Data @NoArgsConstructor 等,很多时候是满足规范需要,这些是所有的类似工具都是可以解决的问题。
    hantsy
        60
    hantsy  
       2020-12-28 11:14:23 +08:00
    @Geekerstar 说 Lombok 坑的,不是什么菜,说白了,懒,就是我常常说的一些公司的巨婴。
    cedoo22
        61
    cedoo22  
       2021-04-11 18:34:07 +08:00
    一直用 ce 版, 发现也够用。。。是不是说明公司项目不够深度??
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2693 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 08:14 · PVG 16:14 · LAX 00:14 · JFK 03:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.