因为在多模块项目中引入了spring security,消费方(控制层)的工程有两个包,一个controller,一个config。引入之前消费方工程的application.properties中spring.dubbo.scan=com.***.***.controller没有问题,引入之后由于config包下面的一个文件也要调用提供方(服务层)的服务,所以改为spring.dubbo.scan=com.***.***,即config包和controller包的上级目录。启动项目时报错java.net.BindException: Address already in use: bind,意思推测为端口占用。检查消费方工程和提供方工程的application.properties,发现两个都是spring.dubbo.protocol.port=20880。改掉其中一个,项目正常启动,且config和controller两个包都可以被dubbo扫描到。
这里就产生了一个问题,既然之前消费方工程和提供方工程设置的dubbo端口一样,为什么之前不会报错,修改扫描路径之后就会报错呢?
既然推测是修改扫描包路径导致了端口占用问题(尽管直接这么说有些莫名其妙),就来比较一下修改前后的扫描包路径:
消费方工程 提供方工程
修改前:com.***.***.controller com.***.***.service.impl
修改后:com.***.*** com.***.***.service.impl
区别在哪?
区别在于修改前的两个路径相互独立,而修改后消费方工程的扫描路径包含了提供方工程的扫描路径,dubbo重复扫描了提供方工程,第二次发布至相同端口时就会报错。
以上仅为一时之浅见,并不能保证百分百正确。
————强势分割————
当天晚上的补充:
在按照上面的思路自以为解决了问题之后,虽然好几次测试都成功了,但是后来却出现了mybatis报invalid bound statement。由于修改之后的扫描路径让我感觉到违和,再加上走投无路之下的我将config包拖到controller包下面,将消费方工程的dubbo扫描路径重新改为com.***.***.controller以避免和提供方的扫描路径重复,问题再一次解决了(确信)。