Java 如何远程调试在同一容器中运行的两个spring boot应用程序,它们的代码库相同,但配置文件不同?
我有两个spring boot应用程序在同一个容器中运行,它们的代码库相同,但配置文件不同 一个用于生产,另一个用于测试。每个应用程序在不同的虚拟主机下运行 容器是tomcat,我在Java 如何远程调试在同一容器中运行的两个spring boot应用程序,它们的代码库相同,但配置文件不同?,java,eclipse,spring,debugging,remote-debugging,Java,Eclipse,Spring,Debugging,Remote Debugging,我有两个spring boot应用程序在同一个容器中运行,它们的代码库相同,但配置文件不同 一个用于生产,另一个用于测试。每个应用程序在不同的虚拟主机下运行 容器是tomcat,我在setenv.sh中添加了这个: CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n $CATALINA_OPTS" 使用eclipse,我可以为远程Java应用程序创建调试配置。我已将主机设置为测试服务
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;
...
}
您可以在其任何方法中设置断点,右键单击它并编辑其断点属性…
如下所示:
注意:选择“true”时,有条件的和挂起。仅当当前对象属于已激活了testProfile
的应用程序时,才会触发断点
注意:
您还可以在应用程序中添加一个单例bean,使应用程序中的任何对象都可以静态访问env
。在这种情况下,您可以访问断点属性中的EnvHolder.env
,以检查当前配置文件
public class EnvHolder {
public static Environment env;
@Autowired
public void setEnv(final Environment environment) {
env = environment;
}
}
但是,如果您在tomcat上没有两个具有独立库的不同应用程序,则类加载问题可能会干扰这种方法
如果无法修改应用程序中的任何类,可以尝试将有关当前配置文件的提示插入到某个线程绑定对象中。例如,为线程名称添加一个特殊的后缀,但您必须确保当线程在测试应用程序中结束其工作时,该名称被清除。使用singleton bean的解决方案运行良好,并且比第一个命题入侵性更小。非常感谢。