linux服务器中部署java应用在jar包中搜索指定的文件及文件中的字符串

1. 概述

在维护Java应用时,有时我们排查别人的代码问题,在没源码的情况下需要通过对部署的war或jar进行搜索来排查问题。搜索涉及两部分,第一是定位包中的文件,第二是在文件中搜索目标字符串,最终定位问题。本文将介绍如何搜索jar包中的文件及文件中的字符串。

2.class与jar文件介绍

class文件是一个字节码文件,包含了类或接口的字节码定义。JavaRuntime(JAR)是一个基于ZIP格式的压缩归档文件,将Java字节码、源码、数据、元数据文件在一起,文件的扩展名是.jar。这样打包组织可以更方便部署、使用。

3.搜索jar包中的包含的目标文件

假设我们希望检查所有的包中是否含有某个配置文件,那么通过find + grep完成搜索,缩小目标范围。根据实际情况调整自己的find与grep命令参数

$ find /jars -type f -iname '*.jar' | xargs grep --text --files-with-matches 'xxx.xml'
/jars/apache-log4j-2.19.0-bin/log4j-api-2.19.0.jar
/jars/apache-log4j-2.19.0-bin/log4j-docker-2.19.0.jar
/jars/apache-log4j-2.19.0-bin/log4j-kubernetes-2.19.0.jar
/jars/apache-log4j-2.19.0-bin/log4j-core-2.19.0.jar
/jars/apache-log4j-2.19.0-bin/log4j-to-slf4j-2.19.0.jar
/jars/apache-log4j-2.19.0-bin/log4j-1.2-api-2.19.0.jar
/jars/google-guava/dep/failureaccess-1.0.1.jar
/jars/invalid.jar
/jars/google-guava/guava-31.1-jre.jar
/jars/commons-io-2.11.0.jar

4.搜索jar中的字符串

当确定目标文件后,我们使用zipgrep命令搜索jar中文件是否包含字符串

zipgrep "XXX" xxx.jar

如果要进行范围搜索结合find及exec参数来执行

find libdir -name "xxx.jar" -exec zipgrep "xxx" '{}' \;

5.总结

定位问题通常要通过搜索来完成,先明确要搜索的对象,然后按部分完成不同部分搜索,最终定位问题。

6.参考资料

[1]搜索jar中的class文件,https://www.baeldung.com/linux/jar-class-search
[2]搜索jar内文件中的字符串,https://stackoverflow.com/questions/10331025/how-to-search-for-a-string-in-jar-files
[3]find命令,https://www.baeldung.com/linux/find-exec-command
[4]zipgrep命令,https://deepinout.com/linux-cmd/linux-archiving-and-compression-related-cmd/linux-cmd-zipgrep.html

你可能感兴趣的:(运维,java,服务器,linux)