我已经通过热部署教程,它的工作原理.但我对这些限制有疑问(第3点)即
热部署仅支持方法实现中的代码更改.如果添加新类或新方法,仍需要重新启动.
基本上,如果我在现有方法中进行更改,但在添加方法或类的情况下需要,我们不需要重新启动服务器.
我理解它是如何工作的: -当我在现有方法中进行更改或引入新方法时,Eclipse会将文件放在webserver下的正确位置.如果类已经由perm gen空间中的类加载器加载,它将从permgen空间卸载它并在内部加载新的,而不重新启动服务器,以便反映新的更改(字节代码).那是对的吗 ?
如果是,为什么热部署不适用于新方法和新类文件?
我有一个在Vagrant中运行的CoreOS.Vagrant专用网IP为192.168.111.1.CoreOS内部是一个Tomcat 8.0.32的docker容器.几乎一切正常(应用程序部署等)只是调试没有.Tomcat映射到8080端口,JPDA端口应为8000.
Tomcat JPDA配置有:
JDPA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
Run Code Online (Sandbox Code Playgroud)
它从catalina.sh jpda start命令开始.运行它时控制台中的输出docker-compose是:
tomcat | Listening for transport dt_socket at address: 8000
Run Code Online (Sandbox Code Playgroud)
从容器信息我假设端口按它们应该映射:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dcae1e0148f8 tomcat "/run.sh" 8 minutes ago Up 8 minutes 0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp tomcat
Run Code Online (Sandbox Code Playgroud)
我的docker镜像基于这个Dockerfile.
尝试运行远程调试配置时(下面的屏幕截图)我收到错误Error running Debug: Unable to open debugger port (192.168.111.1:8000): java.net.ConnectException "Connection refused".我已经尝试过改变各种配置但没有运气的一切.我错过了什么吗?
与 eclipse调试远程web应用程序相关 => 如何在我的eclipse中调试远程应用程序
如何在mvn tomcat插件中设置/存档? http://tomcat.apache.org/maven-plugin-2.0-SNAPSHOT/tomcat7-maven-plugin/
唯一可能有用的是设置systemProperty,但这对我不起作用; /
目标:让tomcat通过maven在控制台上运行,但为不同的IDE启用远程调试
(是的,我们可以在Eclipse WTP中运行tomcat!这不是问题;)
我正在使用Play 2设置一个项目,我已经能够使用eclipse远程调试来调试webapp.虽然,我也想在我的测试中使用断点.有谁知道设置单元如何测试远程调试?
我试图在调试模式下运行Tomcat 7.如果我输入./catalina.sh jpda starttomcat,就好像jpda选项不在那里并且输出:
Michaels-MacBook-Pro:bin clairewilgar$ ./catalina.sh jpda start
Using CATALINA_BASE: /Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS
Using CATALINA_HOME: /Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS
Using CATALINA_TMPDIR: /Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS/temp
Using JRE_HOME: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Using CLASSPATH: /Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS/bin/bootstrap.jar:/Users/clairewilgar/Downloads/apache-tomcat-7.0.42-MIS/bin/tomcat-juli.jar
Run Code Online (Sandbox Code Playgroud)
并且不会更改我的CATALINA_OPTS或任何其他内容.如果我尝试通过Eclipse连接,我会收到错误
"启动工作流程"遇到了问题.无法连接到远程VM.拒绝连接.
我已经尝试将端口更改为jpda端口到8001没有成功,我已经尝试在调用catalina.sh之前在终端中声明JPDA选项,但这没有任何区别.我的catalina.sh JPDA行如下:
if [ "$1" = "jpda" ] ; then
if [ -z "$JPDA_TRANSPORT" ]; then
JPDA_TRANSPORT="dt_socket"
fi
if [ -z "$JPDA_ADDRESS" ]; then
JPDA_ADDRESS="8000"
fi
if [ -z "$JPDA_SUSPEND" ]; then
JPDA_SUSPEND="n"
fi
if [ -z "$JPDA_OPTS" ]; then
JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
fi
CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
shift
fi
Run Code Online (Sandbox Code Playgroud)
还有其他原因导致JPDA无法运行吗?我正在使用OSX(Mountain Lion),如果有任何与我可能错过的相关的内容.提前致谢.
编辑:我的catalina.out文件运行./catalina.sh jpda …
我花了很多时间使用JPDA在Eclipse中调试应用程序.Eclipse调试器有一些问题让我非常恼火.任何人都可以推荐插件,更好的调试器或者我不知道的技巧吗?
我正在尝试在调试模式下运行Apache Tomcat 8.0.21。
当我发出命令时
sh catalina.sh jpda start
Run Code Online (Sandbox Code Playgroud)
它给出了这个错误。
错误信息
错误:无法两次加载此JVM TI代理,请检查Java命令行中是否有重复的jdwp选项。VM代理库初始化期间发生错误,无法初始化:jdwp
有人可以帮忙吗?
在调试C/C++应用程序时,我可以创建一个转换为指针类型的地址的监视,然后查看结构的内容,即使它超出范围.是否有可能在Java中实现类似的东西?
假设我在一个方法中,我添加了一个像"&this"这样的东西然后当我离开类方法时,我仍然可以看到它的内容,即使它超出了范围?
我很确定我的问题的答案是"不",所以我最感兴趣的是"为什么不呢?" 说明.这是JVM的限制吗?JPDA限制?有没有更好的地方提出这样一个专门的问题?
我有一个经典的Heisenbug例子是由我以前从未见过的情况引发的.我的遗留应用程序(大约100K旧代码)无法在特定实例中正常工作,仅仅启用JPDA进行远程调试就足以改变行为,导致应用程序正常工作:除了添加"-Xdebug -Xnoagent -Xrunjdwp之外什么都不做: transport = dt_socket,server = y,suspend = n,address = 6666"到vm的命令行隐藏了bug(有或没有实际连接).鉴于我有一个完全可重复的测试用例,我讨厌在代码更改的情况下对其进行干扰,以防它重新隐藏.当然,这只发生在生产中.
通常,我会立即假设一个线程问题,但是a)行为是100%失败与100%工作,b)在相关代码路径中没有明确使用线程.然后我们的团队试图找出这种行为的其他原因列表,所以我想也许Stack Overflow的团队思想可能会增加更多.
Java中的Heisenbugs:
还有其他值得探索的案例吗
编辑:
我正在尝试捕获在任何android应用程序中进行的所有方法调用。为此,我正在使用JDI为该应用程序的每个运行线程注册MethodEntryRequest。我可以成功完成此操作,但是我遇到的问题是该应用程序变得非常非常慢。所以我想知道我在实现中是否做错了什么。我将代码添加到我首先注册ClassPreparedRequest的地方,以捕获应用程序进程对每个类的加载,并在其中将MethodEntryRequest与threadfilter注册到导致该类加载的线程。
if(!traceMap.keySet().contains(event.thread()))
{
EventRequestManager mgr = vm.eventRequestManager();
MethodEntryRequest menr = mgr.createMethodEntryRequest();
menr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
menr.addThreadFilter(event.thread());
menr.enable();
}
Run Code Online (Sandbox Code Playgroud)
用于注册ClassPreparedRequest的代码为
ClassPrepareRequest cpr = mgr.createClassPrepareRequest();
cpr.addClassFilter("com.example.*");
cpr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
cpr.enable();
Run Code Online (Sandbox Code Playgroud)