web-dev-qa-db-fra.com

Comment rechercher une chaîne dans les fichiers JAR

Mon application est construite sur Java EE.

J'ai environ 50 pots dans cette application.

Est-il possible de rechercher un mot clé particulier (en fait, je souhaite rechercher un mot clé BEGIN REQUEST)?

37
user1253847

Vous pouvez utiliser zipgrep sur Linux,

zipgrep "BEGIN REQUEST" file.jar

Si vous devez trouver la même chose en nombre de pots,

find libdir -name "*.jar" -exec zipgrep "BEGIN REQUEST" '{}' \;

où libdir est un répertoire contenant tous les fichiers jars. La commande recherchera également de manière récursive les sous-répertoires.

Pour Windows, vous pouvez télécharger cygwin et installer zipgrep sous celui-ci http://www.cygwin.com/

Modifier 1

Pour voir le nom du fichier que l'expression a été trouvé, vous pouvez le faire,

find libdir | xargs -I{} sh -c 'echo searhing in "{}"; zipgrep "BEGIN REQUEST" {}'

88
Kalpak Gadre

Attention: Ce n'est pas une réponse précise, c'est juste une approche heuristique rapide. Si vous avez besoin de trouver quelque chose comme le nom d'une classe (par exemple, quel jar a la classe Foo?) Ou peut-être un nom de méthode, cela peut fonctionner. 

grep --text 'your string' your.jar

Cela recherchera le fichier jar comme s'il s'agissait de texte. C’est plus rapide car cela n’élargit pas l’archive, mais c’est aussi la raison pour laquelle elle est moins précise. Si vous avez besoin d'être exhaustif, ce n'est pas l'approche que vous devriez utiliser, mais si vous voulez essayer quelque chose un peu plus rapidement avant de sortir zipgrep c'est une bonne approche.


De man grep,

  -a, --text
          Process  a binary file as if it were text; this is equivalent
          to the --binary-files=text option.
4
Captain Man

Utilisation de jfind jar 

JFind peut trouver un fichier de classe Java n'importe où sur le système de fichiers, même si il est caché beaucoup de niveaux au fond d'un pot dans une oreille dans un zip!

http://jfind.sourceforge.net/

1
liams62217

sous Android, je devais rechercher à la fois les fichiers jar et aar à la recherche d'une certaine chaîne que je cherchais, voici mon implémentation sur mac:

find . -name "*.jar" -o -name "*.aar" | xargs -I{} zipgrep "AssestManager" {}

trouve essentiellement tous les fichiers jar et aar dans le répertoire courant (et la commande find est récursive par défaut) dirige les résultats vers zipgrep et applique chaque nom de fichier comme paramètre via xargs. les crochets à la fin indiquent à xargs où placer le nom de fichier obtenu à l'aide de la commande find. si vous voulez chercher dans tout le répertoire personnel, changez simplement la recherche. trouver ~ 

1
j2emanue

La recherche dans un pot ou la recherche du nom de la classe contenant un texte particulier est très simple avec la recherche WinRar. C'est efficace et a toujours fonctionné pour moi au moins.

ouvrez un fichier jar dans WinRar, cliquez sur ".." jusqu'à ce que vous atteigniez le dossier principal à partir duquel vous souhaitez lancer la recherche (y compris les sous-dossiers).

Assurez-vous de vérifier les options ci-dessous:

1.) Indiquez "*" dans les champs "noms de fichiers à rechercher", "Types d'archives"

2.) cochez les cases "Rechercher dans les sous-dossiers", "Rechercher dans les fichiers", "Rechercher dans les archives".

1
tigersagar

La commande ci-dessous affiche les résultats avec le nom du fichier et le nom du fichier jar.

  1. Pour trouver la chaîne dans la liste du fichier jar.

    find <%PATH of the Folder where you need to search%> -name "*.jar" -print -exec zipgrep "jar$|<%STRING THAT YOU NEED TO FIND>" '{}' \;
    
  2. Pour trouver le nom de la classe dans la liste du fichier jar.

    find . -name "*.jar" -print -exec jar tvf {} \; |grep -E "jar$|<%CLASS NAME THAT YOU NEED TO FIND>\.class"
    
0
JKI

Fastjar - très vieux, mais répondre à vos besoins. Fastjar contient un outil appelé jargrep (ou grepjar). Utilisé de la même manière que grep:

>  locate .jar | grep hibernate | xargs grepjar -n 'objectToSQLString'

org/hibernate/type/EnumType.class:646:objectToSQLString
org/hibernate/sql/Update.class:576:objectToSQLString
org/hibernate/sql/Insert.class:410:objectToSQLString
org/hibernate/usertype/EnhancedUserType.class:22:objectToSQLString
org/hibernate/persister/entity/SingleTableEntityPersister.class:2713:objectToSQLString
org/hibernate/hql/classic/WhereParser.class:1910:objectToSQLString
org/hibernate/hql/ast/tree/JavaConstantNode.class:344:objectToSQLString
org/hibernate/hql/ast/tree/BooleanLiteralNode.class:240:objectToSQLString
org/hibernate/hql/ast/util/LiteralProcessor.class:1363:objectToSQLString
org/hibernate/type/BigIntegerType.class:114:objectToSQLString
org/hibernate/type/ShortType.class:189:objectToSQLString
org/hibernate/type/TimeType.class:307:objectToSQLString
org/hibernate/type/CharacterType.class:210:objectToSQLString
org/hibernate/type/BooleanType.class:180:objectToSQLString
org/hibernate/type/StringType.class:166:objectToSQLString
org/hibernate/type/NumericBooleanType.class:128:objectToSQLString
org/hibernate/type/CustomType.class:543:objectToSQLString
org/hibernate/type/TimeZoneType.class:204:objectToSQLString
org/hibernate/type/DateType.class:343:objectToSQLString
org/hibernate/type/LiteralType.class:18:objectToSQLString
org/hibernate/type/ByteType.class:189:objectToSQLString
org/hibernate/type/LocaleType.class:259:objectToSQLString
org/hibernate/type/CharBooleanType.class:171:objectToSQLString
org/hibernate/type/TimestampType.class:409:objectToSQLString
org/hibernate/type/CurrencyType.class:256:objectToSQLString
org/hibernate/type/AbstractCharArrayType.class:219:objectToSQLString
org/hibernate/type/FloatType.class:177:objectToSQLString
org/hibernate/type/DoubleType.class:173:objectToSQLString
org/hibernate/type/LongType.class:223:objectToSQLString
org/hibernate/type/IntegerType.class:188:objectToSQLString
0
AndreyT