目录
前后端分离项目可以用debug启动但是不管怎么发请求都进不了这个debug
微服务项目引入canal遇到的问题
最近在做一个微服务的项目练手,项目中会使用canal对数据库中的业务表进行监听,在引入canal的过程遇到的问题:(如果有资料建议使用资料中的包直接复制,没有相关的资料那么自己去github上面下载)
找项目资料提供的与canal相关的jar包,然后把它复制到一个路径:使用mvn指令来安装这个外部的jar包:(这样做是有问题的,下面有踩坑的过程,会提供另一个方法)
这种方式虽然也可以安装这个依赖,但是会出现各种问题,个人已经踩坑,花了三个小时才解决。。。。。。
不要这么安装,这么安装会出现有依赖但是没有具体的依赖内容的情况:具体为什么会这样,,我也不知道。。。。反正从maven的缓存到远程地址,到maven的版本问题都考虑了,,结果还是没找到原因。。。。之所以出现这种情况就是因为我使用了mvn来安装这个老师提供的jar包,然后就出现了下面的这种情况,,有依赖但是没有依赖包,但是依赖包又在本地仓库。。。。。。。有一些依赖可以使用,但是运行就报错。。。
//至于为什么,,,我暂时也不知道。。。。。。 所以最后还是选择换一种方法来引入
mvn install:install-file -DgroupId=com.xpand -DartifactId=starter-canal -Dversion=0.0.1-SNAPSHOT -Dfile=D:\repo\starter-canal-0.0.1-SNAPSHOT.jar -Dpackaging=jar-Dfile:表示这个jar包现在的位置,其他都是与maven坐标相同。
使用下面这种方法安装就行(亲测有效),是可以直接使用的:
直接把给的资源复制到对应的包:
然后在idea中重新刷新这个pom文件。
(1)创建工程模块xxx_canal,pom引入依赖
<!--canal相关-->
<dependency>
<groupId>com.xpand</groupId>
<artifactId>starter-canal</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--rabbitMq相关-->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
(2)创建包com.xxx.canal ,包下创建启动类
@EnableCanalClient //标注为canal客户端
@SpringBootApplication
public class CanalApplication {
public static void main(String[] args) {
SpringApplication.run(CanalApplication.class,args);
}
}
可以直接使用,并且不会报错。
Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)V
报错:Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)V
报这个错绝大部分都是依赖出问题了!!比如重复依赖导致版本冲突,然后maven又没有帮你把重复的依赖排除,因为可能这两个依赖中有不一样的东西,从而导致maven没有帮你把版本冲突的依赖排除,或者是你的maven配置出现问题了。下面讲一下怎么排除手动的排除版本冲突:
找到报错信息的冲突类:我的报错是AnnotationAwareOrderComparator类不存在, 然后把AnnotationAwareOrderComparator这个类进行全局搜索,看在哪些包下有它:
Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)V
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:431)
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:420)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:268)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:249)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
at com.ydles.canal.CanalApplication.main(CanalApplication.java:16)
双击shift进入idea的全局搜索:
然后刷新pom。
java: 警告: 源发行版 11 需要目标发行版 11
之所以会出现这个问题,那是因为项目的java版本和模块的jdk选择冲突,甚至是maven配置中出现jdk版本配置与项目模块要求的jdk配置冲突!!!
甚至是有时候你都怀疑是不是idea这个编辑器出问题了:比如你明明在idea修改了项目的全局jdk设置和语言版本设置,但是只要一创建新的maven项目,然后一运行就会报java: 警告: 源发行版 11 需要目标发行版 11,是不是你也很疑惑为什么会这样?答案在下面揭晓!!!
先修改三个位置:
然后自己开心的去启动项目发现确实没有问题,但是只要自己一创建新的maven模块,然后一启动其他模块的项目,就又出现 java: 警告: 源发行版 11 需要目标发行版 11 这个报错。之所以会这样,那么是因为你之前在maven的配置文件中配置了其他版本的jdk,但是时间一久你可能自己都忘记了,,所以在新的项目中出现这种问题你就懵逼了!
所以如果你遇到这种情况,那么一定要去maven的cnfg文件夹下的setting配置文件中看看自己的maven中配置的jdk的那个版本,看和自己的项目一不一样。修改成一样的就行。比如你的idea中的项目使用的是jdk8,那么在maven中的配置文件中也要配置使用jdk8的配置。
jdk11的maven配置:
<profile>
<id>jdk-11</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>11</jdk>
</activation>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
</properties>
</profile>
或者是 jdk8的maven配置:(根据自己的实际项目中的jdk版本来进行选择)
<profile>
<id>jdk1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
maven中的配置文件指定的jdk版本是非常关键的,因为你每次创建maven项目或者是用maven进行编译的时候,都会来使用maven配置文件中指定的jdk版本,所以如果这里的jdk与项目实际的jdk不一样,是很容易报版本语法错误的。
前后端分离项目可以用debug启动但是不管怎么发请求都进不了这个debug
我出现这种情况的场景是:在公司实习的时候,leader只给了项目的前后端代码的gitlab地址,然后我拉取代码到本地后,前后端项目都可以正常运行,也可以正常访问远程的测试库,但是当我们使用debug来跑后台的java的时候,不过我们怎么发请求都是进入不了debug,但是项目明明已经用debug启动了,,,我用跑起来的后台点击页面发请求也进不了debug,用postman模拟请求(带token的),可以请求成功但是就是进不了debug,,,,所以但是非常的懵逼。。。。。
后来经过我把后台自己给关了,但是在前端点击按钮还是可以跳转到相关的页面,这就有意思了,,通过这个操作最后发现原来是在前后端分离的项目中,前端一般都会有远程代理,最后在前端的config文件中确实是看到了这个远程代理的地址,也就是说我们发的请求实际上是通过前端的远程代理转发到这个配置的远程地址去了。。。。
最后解决的办法是:把前端配置代理地址的位置(与项目有关的代理地址)改成本地的这个后台项目地址(ip地址与端口号都要改)。如果不知道具体改哪个,可以问问自己组的前端或者是前辈,他们肯定知道。最后重新启动项目,然后再发请求,就可以进入到debug了。