经过前篇对阿里云服务器java环境的基本设置,已经可以保证打包为jar包的springboot项目可以启动了。但后续还有一些依赖问题需要解决
1. Font 依赖
阿里云提供的cento os7可能存在Font依赖缺失的问题,在我的demo里面表现的问题为验证码无法显示。经过面向stackoverflow 编程,发现可以通过如下方法解决:
1)通过命令 fc-list 查看已经安装的font-config,我这里暂时是没有的。于是乎发现了报错的原因
2)根据cento社区的讨论发现是需要安装一下依赖的: https://forums.centos.org/viewtopic.php?t=59951
可执行如下命令:yum install urw-fonts
3)完成安装,重启demo,发现问题已经解决
2. 远程调试设置(为第三方API准备)
由于使用的是IntelliJ,而且是打成JAR包部署的,所以远程调试也非常方便。在Edit Configuration里添加一个远程debug的config,填上自己的ECS公网地址和想要用于调试的接口(一般是5005),这里需要在阿里云的控制台开放新的端口用于调试。由于是本地Ideal对远程的监听,所以控制台设置安全规则的时候需要设置规则方向为入方向。
在远程服务器上运行代码(要与本地代码保持一致):
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar o2o-0.0.1-SNAPSHOT.jar --server.port={your port}
以上命令划线的部分就是我踩的坑了,网上有很多的教程,但是因为JDK版本不一样,所以这里的指令也是不一样,千万不要直接从网上直接粘贴复制,不然很可能就和我一样连了半天连不上。所以最简单的办法其实IntelliJ已经帮我们准备好了,就是从IntelliJ的配置窗口中直接复制(我这个是JDK9 or later的),具体的位置就在刚刚设置远程服务器公网地址的下方 ”Command Line arguments for Remote JVM"。同理,server.port后面的参数也要和自己tomcat设置的server.port一致。
然后本地运行刚刚添加的远程debug(不是run,是debug),看到terminal里出现connected即说明已经连接上了。
这里再记录几个小问题:
1)什么是jdwp:
“JDWP 是 Java Debug Wire Protocol 的缩写,它定义了调试器(debugger)和目标虚拟机(target vm)之间的通信协议。Target vm 中运行着我们要调试的 Java 程序,它与一般运行的 JVM 没有什么区别,只是在启动时加载了 JDWP Agent 从而具备了调试功能。而 debugger 就是我们本地的调试器,它向运行中的 target vm 发送指令来获取 target vm 运行时的状态和控制远程 Java 程序的执行。Debugger 和 target vm 分别在各自的进程中运行,他们之间通过 JDWP 通信协议进行通信。”
2)怎么解决断点无法进入的问题:
a. 别问,问就是重新build一下本地的代码(前提是你不能修改你的代码,否则出现和远程服务器上的代码不一致,当然也是不可以正常进入断点的)
b. 可能是你做了pause或者是stop的操作,这样也有可能无法继续进入下一个断点,这种情况就要重启远端代码了。详情参考这个IDEA远程debug中断后无法再次进入断点的问题_thekenofDIS的专栏-CSDN博客_idea 远程debug 不生效
c. 多人协作情况下,断点冲突。需要设置断点的作用范围,具体可以参看这个链接多人同时远程Debug冲突解决方案-阿里云开发者社区
这一点非常实用,你永远不知道你的队友在搞什么飞机,而且你一个人是搞不定这么多模块的。为了让你的队友和组员能愉快的写bug,请务必通知他们要设置断点作用范围,请务必通知他们要设置断点作用范围,请务必通知他们要设置断点作用范围(重要的事情说三遍,不要问我怎么知道的)
最后,为了保障服务器的安全,不要让远程debug接口长时间处于开放状态,可以在找到bug原因并写好更多的bug之后(狗头)去控制台将debug端口的授权设置为拒绝。