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

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

我有两个 spring 引导应用程序 运行 在同一个容器中,它们具有相同的代码库但具有不同的配置文件。

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

容器是 tomcat,我在 setenv.sh 中添加了这个:

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

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

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

如何设置只有测试应用程序触发断点的调试环境?

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

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

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

注意 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 上没有两个具有独立库的不同应用程序,class 加载问题可能会干扰该方法。

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