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