maven 构建项目时debug和热部署

 

 maven构建项目时,如何进行debug及web项目的热部署,此处以tomcat为例说明。

 

1.debug:

  •       设置JPDA_ADDRESS,服务器以jpda方式启动,如:catalina.sh jpda run。
  •       ide设置remote监听jpda方式启动的端口号。以Intellij idea为例,run->edit configrations->点击左上角的加号,选择Remote方式,设置相应的端口号,启动此remote。
  •       设置断点

2.web热部署(以Intellij idea为例

  • ide安装插件 JRebel
  • 在相应项目的reesource目录下生成rebel.xml文件,重新maven编辑项目
  • 服务器以jrebel方式启动,添加启动参数:-javaagent:/opt/soft/services/jrebel/jrebel.jar

    ps:若修改java文件,则需要单独编译此文件。

### 解决 IntelliJ IDEA 调试热部署失效的问题 在开发过程中,IntelliJ IDEA 的热部署功能可以显著提高效率。然而,在某些情况下可能会遇到热部署失效的情况。以下是可能导致该问题的原因以及解决方案: #### 1. **Spring Boot 应用程序运行方式** 如果应用程序不是通过 `spring-boot-maven-plugin` 提供的 `run` 目标启动,则可能无法正常支持热部署[^3]。这是因为 `spring-boot-maven-plugin` 使用的是爆炸形式(exploded form),类似于 IDE 中的方式。 建议修改项目构建配置文件(pom.xml 或 build.gradle),确保使用插件中的 `run` 命令来启动应用。例如,在 Maven 配置中添加以下内容: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` #### 2. **编译器设置** 检查 IntelliJ IDEA 的编译器设置是否启用了自动重新加载类的功能。进入 `File -> Settings -> Build, Execution, Deployment -> Compiler -> Build Project Automatically` 并勾选此选项[^4]。 此外,可以通过快捷键组合 `Ctrl + Shift + F9` 手动触发增量编译。 #### 3. **DevTools 插件启用** Spring Boot 提供了一个名为 `spring-boot-devtools` 的模块,用于增强开发体验并支持热部署。如果没有引入该依赖项,可能会导致热更新失败。可以在项目 pom 文件中加入如下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> ``` 注意:当使用外部 Tomcat 容器或其他非嵌入式容器,`devtools` 可能不会生效。 #### 4. **避免不必要的打操作** 有开发者会错误地对已经创建好的 JAR 再次进行打处理,这不仅增加了复杂度还容易引发冗余依赖问题[^2]。因此应确认当前工作流里不存在重复封装过程。 #### 5. **安全工具集成的影响** 如果有安装像 DevKnox 这样的安全性插件[^1],它们虽然有助于发现潜在漏洞但也有可能干扰正常的调试流程。尝试暂禁用这些附加组件观察效果变化。 最后提醒一下,以上提到的方法均基于标准环境假设下给出;具体实施还需考虑实际业务场景个人偏好等因素调整优化策略。 ```java // 示例代码片段展示如何动态替换 Bean 实现简单的 Hot Swap 功能 @Component public class MyService { public String getMessage() { return "Original Message"; } } @Configuration public class AppConfig implements ApplicationContextAware { private static ConfigurableApplicationContext context; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.context = (ConfigurableApplicationContext)applicationContext; } public static void reloadBean(String beanName){ try{ Field field = DefaultListableBeanFactory.class.getDeclaredField("singletonObjects"); field.setAccessible(true); Map<String,Object> singletonObjectsMap=(HashMap<String,Object>)field.get(context.getBeanFactory()); singletonObjectsMap.remove(beanName); field=DefaultListableBeanFactory.class.getDeclaredField("earlySingletonObjects"); field.setAccessible(true); Map<String,Object> earlySingletonObjectsMap=(HashMap<String,Object>)field.get(context.getBeanFactory()); earlySingletonObjectsMap.remove(beanName); field=DefaultListableBeanFactory.class.getDeclaredField("singletonFactories"); field.setAccessible(true); Map<String, ObjectFactory<?>> singletonFactoriesMap=(HashMap<String, ObjectFactory<?>>)field.get(context.getBeanFactory()); singletonFactoriesMap.remove(beanName); System.out.println("Reloaded "+beanName+" successfully."); }catch(Exception e){ e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值