nexus:3.13.01
nexus启动日志:
./nexus run (注意nexus start是看不到日志的)
问题:
nexus由于内存溢出挂掉,重新启动报错 Error injecting constructor, java.nio.file.FileAlreadyExistsException: /data/nexus/sonatype-work/nexus3/elasticsearch/nexus/nodes/0/__es__.tmp
问题分析:
查看nexus的ES版本;在ES的源码中通过关键字__es__.tmp找到了相关源码,如下所示:
ensureAtomicMoveSupported方法是在ES启动时初始化GatewayMetaState对象时调用的,从方法注释可以看出这个方法是为了测试ES运行环境中是否支原子性地移动一个文件。测试的方法就是,先创建一个名为__es__.tmp的文件,在将其移动到名为__es__.final的文件,如果这个操作成功,说明支持,如果报异常说明不支持。测试结束后会通过调用Files.deleteIfExists(src);Files.deleteIfExists(target);将__es__.tmp 与__es__.final这两个文件都删除。
在看我们的报错
显然报这个错是因为ensureAtomicMoveSupported方法方法试图创建__es__.tmp的时候他已经存在了。至于为什么存在这个文件,我的推测是,上次ES启动过程中在__es__.tmp创建到删除这段时间,ES进程被强制杀死导致__es__.tmp没有被删除。
解决方法
解决这个异常的方法很容易想到,那就是手动把__es__.tmp删除,再重启NEXUS即可。
另外,需要说明的是ES的开发者已经意识到这个缺陷,并且将其在5.x版本中修复。
参考连接:https://blog.csdn.net/qqqq0199181/article/details/87935519