繁体   English   中英

如何远程调试在相同容器中运行的具有相同代码库但配置文件不同的两个spring boot应用程序?

[英]How to remote debug two spring boot applications running in the same container with the same codebase but with different profiles?

我有两个使用相同代码库但配置文件不同的容器在同一容器中运行的spring boot应用程序。

一个应用程序用于生产,另一个应用程序用于测试。 每个应用程序都在不同的虚拟主机下运行。

容器是tomcat,我已经在setenv.sh添加了它:

CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n $CATALINA_OPTS"

使用eclipse,我可以为远程Java应用程序创建调试配置。 我已将主机设置为测试服务器主机名。

但是,当我设置一个断点时,生产测试应用程序会触发该断点。

如何设置调试环境(例如仅测试应用程序触发断点)?

您需要做的是创建一种验证当前配置文件的方法。 您可以将环境添加到要调试的对象中:

public class SpringBean {
  @Autowired
  private Environment env;
  ...
}

您可以在其任何方法中设置断点,右键单击它并编辑其Breakpoint properties...如下所示:

在此处输入图片说明

注意选择Suspend when 'true' ConditionalSuspend when 'true' 仅当当前对象属于已激活testProfile的应用程序时,才会触发断点。

注意:

您还可以将单例bean投放到您的应用中,这将使您可以从应用中的任何对象静态访问env 在这种情况下,您可以在断点属性中访问EnvHolder.env以检查当前配置文件。

public class EnvHolder {
  public static Environment env;

  @Autowired
  public void setEnv(final Environment environment) {
      env = environment;
  }
}

但是,如果您在tomcat上没有两个具有单独库的不同应用程序,则类加载问题可能会干扰该方法。

如果您无法在应用程序中修改任何类,则可以尝试将有关当前配置文件的提示插入某个线程绑定的对象中。 例如,在线程名称上添加一个特殊的后缀,但是您必须确保在线程在测试应用程序中结束工作时清除该名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM