|
2#
楼主 |
发表于 2022-8-3 15:02:21
|
只看该作者
本帖最后由 草帽路飞UU 于 2022-8-11 16:33 编辑
5.1 这句话的解释
-javaagent
JDK5 之后新增的参数,主要用来在运行 jar 包的时候,以一种方式介入字节码加载过程,如有兴趣自行百度。注意后面有个冒号:
/home/admin/Jacoco/Jacocoagent.jar
需要用来介入 class 文件加载过程的 jar 包,想深入了解的,百度 “插桩” 哈。
这是一个 jar 包的绝对路径。
includes=*
这个代表了,启动时需要进行字节码插桩的包过滤,* 代表所有的 class 文件加载都需要进行插桩。
假如你们公司内部代码都有相同的包前缀 :com.mycompany<你可以写成:
includes=com.mycompany.*
output=TCPserver
这个地方不用改动,代表以 TCPserver 方式启动应用并进行插桩。
port=2014
这是 Jacoco 开启的 TCPserver 的端口,请注意这个端口不能被占用。
address=192.168.110.1
这是对外开发的 TCPserver 的访问地址。可以配置 127.0.0.1, 也可以配置为实际访问 IP。
配置为 127.0.0.1 的时候,dump 数据只能在这台服务器上进行 dump,就不能通过远程方式 dump 数据。配置为实际的 IP 地址的时候,就可以在任意一台机器上 (前提是 IP 要通,不通都白瞎),通过 Ant XML 或者 API 方式 dump 数据。举个栗子:
我如上配置了 192.168.110.1:2014 作为 Jacoco 的 TCPserver 启动服务,那我可以在任意一台机器上进行数据的 dump,比如在我本机 Windows 上用 API 或者 XML 方式调用 dump。
如果我配置了 127.0.0.1:2014 作为启动服务器,那么我只能在这台测试机上进行 dump,其他的机器都无法连接到这个 TCPserver 进行 dump。
总结:
这句内容,如下,格式是固定的,只有括号内的东西方可改变,其它尽量不要动,连空格都不要多:
-javaagent/home/admin/Jacoco/Jacocoagent.jar)=includes=(*),output=TCPserver,port=(2014),address=(192.168.110.1)
比如我可以改成其他的:
javaagent/home/admin/Jacoco_new/Jacocoagent.jar)=includes=com.company.*,output=TCPserver,port=20
注意其他地方基本不用改动。
5.2 war 包方式启动
tomcat 的 war 包方式启动,假设 tomcat 路径为: $CATALINA_HOME= /usr/local/apache-tomcat-8.5.20,我们常用的命令存在于: $CATALINA_HOME\bin下,有 startup.sh 和 shutdown.sh(windows 请自觉改为 bat, 后续不再声明),其实这两个只是封装之后的脚本,底层调用的都是 $CATALINA_HOME\bin\catalina.sh(或者 bat),如图源码:
因此,只需要改动 catalina.sh 中的启动参数即可。
前面提到过,主要改动主要是改动 java -jar,tomcat 是通过一个 JAVA_OPTS 参数来控制额外的 java 启动参数的,我们只需要在合适的地方把上面的启动命令追加到 JAVA_OPTS 即可
打开 catalina.sh,找到合适的地方修改 JAVA_OPTS 参数:
理论上,任何地方修改 JAVA_OPTS 参数均可,但我们实验过后,在以下位置加入,是一定可以启动成功的,当然您也可以尝试其他位置。
JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
源脚本中有这个注释掉的地方,我们在下方修改 JAVA_OPTS,在其下方,加一句:
JAVA_OPTS="$JAVA_OPTS -javaagent:JacocoJarPath=includes=*,output=TCPserver,port=2014,address=192.168.110.1"
改完之后如下所示:
改完之后,就可以进行 startup.sh 的启动了,应用启动成功之后,可以在服务器上进行调试,查看 TCPserver 是否真的起来了。
判别方式如下 (该图中是现有的已经开启的服务,所以 IP 和端口跟前面的命令不一样,这点请注意,这里只是为了展示;后续几种方式判别方式相同,不再赘述了哈), 这个端口在应用启动时被占用,在应用关闭时被释放,这个请注意检查:
如此,这个端口已经在监听了,证明这个测试环境已经把 Jacoco 注入进去,那你对该测试环境的任何操作,代码执行信息都会被记录到这个 ip:port 开启的 TCP 服务中。
5.3 Maven 命令的插件启动方式
在我司,有的开发会喜欢用插件方式启动,在代码 pom 文件层级中,运行如下命令:
mvn clean install
mvn tomcat7:run -Dport=xxx
或者还有
mvn clean install
mvn spring-boot:run -Dport=xxx
这两套命令,本质上没什么差别,只是运行插件不一样,具体用什么命令,如果不清楚,最好是跟开发请教一下。
他们的意思是,在当前代码的 pom 文件层级运行,意思是通过 maven 的 tomcat 插件启动这个服务,这个服务启动在端口 xxx 上,注意这个端口是应用的访问端口,和 Jacoco 的那个端口不是一回事。
对这种方式注入 Jacoco,也是可以的。这种可以不用修改任何的配置文件,只需要在你启动的时候,临时修改变量就行了。这种方式改变 java 的启动参数方式是这样:
export MAVEN_OPTS="-javaagent:JacocoJarPath=includes=*,output=TCPserver,port=2014,address=192.168.110.1"
这句命令加在哪里呢?就是 run 之前。为什么呢,因为这样一改,你的所有的 mvn 命令都会生效,但其实我们只想介入启动过程。因此,前面提到的两套启动命令,就可以改成如下方式:
mvn clean install
export MAVEN_OPTS="-javaagent:JacocoJarPath=includes=*,output=TCPserver,port=2014,address=192.168.110.1"
mvn tomcat7:run -Dport=xxx
export MAVEN_OPTS=""
和
mvn clean install
export MAVEN_OPTS="-javaagent:JacocoJarPath=includes=*,output=TCPserver,port=2014,address=192.168.110.1"
mvn spring-boot:run -Dport=xxx
export MAVEN_OPTS=""
当然,你的 run 命令,也可能是其他变种,比如:nohup mvn …. & 这种后台启动的方式,也是可以的。
最后修改为 "" 是因为担心对后续的 mvn 命令产生影响,其实如果你切换了 terminal 窗口,这个临时变量就会失效,不会对环境造成污染。
如果应用启动成功了,就可以按照前面的方式,netstat 叛别一下 TCP 服务是否真的启动。
如果你设置了这个变量的位置不对,那你用 mvn 命令的时候,可能会出现如下的异常:java.net.BindException: Address already in use: bind
这时候,就需要去检查一些,你配置的 Jacoco 端口是不是在启动应用服务时已经被占用。或者你临时设置了 MAVEN_OPTS 这个变量,启动之后又没有改回来,然后接着运行了 mvn 命令,这时候也会出现这种错误。这里请务必关注。
提一句题外话,ANT 的方式是不是也可以通过临时修改 ANT_OPTS 参数进行启动 (因为 ANT 和 MAVEN 本是一家子吗,我猜底层可能差异不是很大),我不曾做尝试,有兴趣的可以尝试下。
5.4 ANT 构建,通过 XML 配置文件启动
这种方式可能实现启动应用的阶段不同,但大都配置在 build.xml 里,这里请根据不同的项目做不同的适配。
它的原理是,在 Ant 的启动 target 中,有个 的标签,给她增加一个 jvmarg 参数的子标签,如下代码:
<jvmarg value=”-javaagent:JacocoJarPath=includes=*,output=TCPserver,port=2014,address=192.168.110.1” />
比如我们的启动命令是这样:
ant -f build.xml clean build startJetty
以此启动之后,将会注入 Jacoco 的代理,最终可以按照上面的方式判断端口是否启动。
5.5 java -jar 方式启动
这种最简单直接:
java -javaagent: JacocoJarPath=includes=*,output=TCPserver,port=2014,address=192.168.110.1 -jar xxxxxxxxxx.jar
注意,javaagent 参数,一定要在 jar 包路径之前,尽量在-jar 之前,不然可能不会生效。请注意 java -jar 命令的使用方式,在 jar 包前面传进去的是给 jvm 启动参数的,在 jar 包之后跟的是给 main 方法的。
启动后,依然按照前面的方式判断是否启动了监听端口。
5.6 启动之后
启动之后,就进行测试就可以了,跟平常不注入 Jacoco 代理是无异的。
|
|