springboot的热部署和dubug
采用了项目聚合,产生一些不同,遇到的问题和解决方法分享下。
项目结构:
rebuilder2
-htran 主项目
-htran-api
1、htran.pom
<parent>
<groupId>com.cq</groupId>
<artifactId>common-parent</artifactId>
<version>1.0.0-RELEASE</version>
<relativePath></relativePath>
</parent>
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <jvmArguments> -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 </jvmArguments> </configuration> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.6.RELEASE</version> </dependency> </dependencies> </plugin>
2、IDEA配置
RUN -> Edit configuraions -> '+' -> Remote ->右侧修改名称为debug
3、maven命令
clean spring-boot:run -pl htran
由于采用了项目聚合,htran引入了htran-api同时还继承了ParentPom,所以直接在rebuild2 路径下 mvn clean spring-boot:run 会同时启动htran-api;而htran-api只是用来存放一些接口和实体类的,并没有application.java也不能运行,mvn在构建时就会产生 Unable to find a suitable main class异常,而直接在htran路径下执行mvn clean spring-boot:run又会报找不到htran-api的错误,所以在rebuild2 路径下添加 -pl htran。
4、先执行maven命令,再run刚刚配置的debug,就可以热部署+debug了
5、修改代码后要执行重新编译,快捷键是ctrl + shift + F9
6、如果只是想热部署而不是debug,那就去掉pom中的
<jvmArguments> -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 </jvmArguments>
直接 clean spring-boot:run -pl htran,不需要配置debug
一些异常:
找不到<parent>项目的pom文件。这是因为一般我们在使用idea时,会在setting中指定idea使用本地的maven库路径,而忽略了maven配置文件setting.xml中对本地库路径的设置,这样通过idea使用maven时会使用配置的路径,但直接使用mvn命令,则会由maven直接使用setting.xml的配置路径。这样手动添加到idea本地库的包maven就会找不到。
包冲突:javax.persistance。 由于hibernate已经自带了javax.persistance,如果在其他地方引入了低版本的javax.persistance依赖,mvn在构建项目时如果先加载了低版本的包,就不会再加载高版本包,这就会出现各种错误。常见是各种 java.lang.NoSuchMethodError。排除低版本的依赖即可。但是直接用idea构建项目就不会有这个问题(也许idea能智能加载高版本包?
java.lang.IllegalAccessException: Class org.springsource.loaded.ReloadableType can not access a member of class org.springframework.aop.framework.CglibAopProxy$ClassLoaderAwareUndeclaredThrowableStrategy with modifiers "public" 这个是springloaded版本问题,似乎和jvm版本也有关系,官方说是升级到1.2.6就解决了,但是我在用的时候还是会出现,但是不影响运行,不用管他。奇怪的写这个笔记的时候,想找到这个异常信息,又运行了一下,却又不抛异常了。编程真是神奇啊。。。