maven编译报插件异常的栈溢出之谜

2021真的真的结束了,要免对现实。上班的日子又来了,节后这是第一篇分享,就分享一下这2天遇到的一个编译的坑吧。


一、场景

就是一个常量map,放的键值对特别多,总共700多吧。用的是google的guava包的ImmutableMap。一般的写法就是定义常量名,然后一直put,最后build对吧。

import com.google.common.collect.ImmutableMap;

import java.util.Map;

public interface CameraInfo {
    
    

    /** 摄像机 */
    Map<String, String> JIN_TOU_CAMERA = new ImmutableMap.Builder<String, String>().
    //每个项目的内外网穿透的代理程序的名字
    put("proxyName","jinTou").
    put("192.168.1.20","rtsp://name:[email protected]:300111").
    put("192.168.1.21","rtsp://name:[email protected]:300112").
    put("192.168.1.22","rtsp://name:[email protected]:300113").
    build();
}

这里省略more more的put

二、maven编译

报错:
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.9.0:compile (default-compile) on project transform: Fatal error compiling
在这里插入图片描述

打开maven编译的输出级别位debug,可以看到详细信息
在这里插入图片描述

2.解释

实际上出现这个意思就是编译过程中栈溢出了。
这里要保持清醒的头脑知道自己是用什么在编译,如果是maven,那你改idea的jvm就是没有意义的。有博友说改这里,增加xmm2048m等等。
在这里插入图片描述
其实这样说是需要考虑maven是用的自己安装的maven还是idea自带的,如果是用的idea自带的可以,自己安装的改这里是没有用的。
自己安装的需要找到自己的maven tomcat的bin目录,修改mvn.bat文件
在这里插入图片描述
在里面找个地方加jvm配置。但是这种方式不推荐,比较编码是一个团体活动,而且发版的自动构建maven不一定也配置了,运维不一定配合你。

3.解决

影响最小化解决方式:还是从我们的代码入手。分几步,后面也方便扩展增加:
1、定义常量变量
2、static处理
3、分块增加put
4、最后build

import com.google.common.collect.ImmutableMap;

import java.util.Map;

public class CameraInfo {
    
    

  public static Map<String, String> JIN_TOU_CAMERA;

  static {
    
    
    ImmutableMap.Builder builder = new ImmutableMap.Builder<String, String>();

    //每个项目的内外网穿透的代理程序的名字put("proxyName", "jinTou").
    builder.put("proxyName", "jinTou").
        put("223.75.167.139:30303c15","rtsp://name:[email protected]:30303/unicast/c15/s1/live");

    addLxgy(builder);

    addXcyp(builder);

    JIN_TOU_CAMERA = builder.build();
  }

  private static void  addLxgy( ImmutableMap.Builder builder) {
    
    
    builder.put("119.36.148.184:304003501","rtsp://name:[email protected]:30400/Streaming/Channels/A");
  }


  /**
   * 新增新城壹品监控设备信息
   *
   * @param builder
   */
  private static void addXcyp(ImmutableMap.Builder builder) {
    
    
    builder.put("172.20.16.48","rtsp://name:[email protected]:30503/cam/realmonitor?channel=A&subtype=1");
  }

}

各阶段都省略了more more的put。

这样处理后重新编译就过了,并且不需要改idea的设置、maven的设置等等。


总结

  1. 常量的设置建议这样模块化,后期方便扩展。
  2. 这种常量还是尽量不要这么多,这里是接手前同事的项目,但是为啥要这样原因咱也不深究了,没有意义。
  3. codeview还是很有必要的,早期做codeview不就可以避免这种大面积写死的常量了吗
  4. 找问题的思路有时要跳出来,当时我还一直怀疑maven的这个plug是有问题。打开详情看了才明了,然后跟同事一起看这个问题才恍然大悟
    就写到这里希望能帮到大家优雅避坑。

猜你喜欢

转载自blog.csdn.net/zwrlj527/article/details/122884486