【问题标题】:Search or list Java classes in classpath (ncluding JARS) via command line通过命令行在类路径(包括 JARS)中搜索或列出 Java 类
【发布时间】:2014-01-19 01:16:55
【问题描述】:

我真的很喜欢用 javap 命令行程序来反编译和检查类,但是大多数时候我记不起类的完全限定包名:

javap java.nio.file.Files

如果我不知道包名,我会求助于谷歌。是否有内置的 java 程序或 slick Linux 命令可以搜索并列出给定类名的所有匹配包?

【问题讨论】:

  • 许多 IDE(如 NetBeans、IntelliJ 和 Eclipse)可以做到这一点;我不知道从命令行执行此操作的简单方法。但这是可能的,或者 IDE 无法做到。
  • “要求我们推荐或查找工具、库或喜爱的场外资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。"
  • gparyani,对不起,我认为到目前为止我的解决方案很明显是谷歌。

标签: java linux


【解决方案1】:

搜索所有罐子:

find <path> -name "*.jar" -exec jar -tf {} \; | grep "/<classname>\.class\$"

示例:

find ~/.ivy2/ -name "*.jar" -exec jar -tf {} \; | grep "/Filter\.class\$"

输出:

javax/servlet/Filter.class
javax/servlet/Filter.class
javax/servlet/Filter.class
org/scalatest/Filter.class
org/scalatest/Filter.class
org/fusesource/scalate/filter/Filter.class
org/fusesource/scalate/filter/Filter.class
scala/tools/scalap/scalax/rules/Filter.class
org/apache/ivy/util/filter/Filter.class
com/foursquare/fongo/impl/Filter.class
com/foursquare/fongo/impl/Filter.class
com/foursquare/fongo/impl/Filter.class
shapeless/Filter.class

我个人并不喜欢这个解决方案。

要搜索所有类文件,只需使用find:

find <path> -name "*.class"

【讨论】:

  • 虽然它完成了工作,但我绝对同意这个问题的解决方案不够优雅。我现在将它与 Google 结合使用。谢谢
  • 希望有一种方法可以进一步完善这一点,只列出具有 main 方法的类。
  • 您可以从javap 获取main 和其他类信息,但不幸的是,您无法将解压缩的jar 输出通过管道传输到javap。您可以改为mkdir /tmp/d,然后是findunzip &lt;each jar&gt; -d /tmp/d,然后运行javap &lt;each class file&gt; 和grep 查找public static void main(java.lang.String[]);。然后rm -rf /tmp/d/* 并继续下一个找到的罐子。此外,一个 jar 可以在其中包含嵌套的 jar,因此一旦解压缩主 jar,您就可以递归地解压缩其他 jar。如果我有时间,我会为它写一个脚本,但它不是单行器。
  • 我想尝试另一种方法,例如从 Java 程序加载类/jar 并改用反射。也许可以利用 Java IDE 中的一些库来实现这一点。
  • 其实我注意到javap 需要一个类路径,所以不需要创建临时目录。像这样的东西可以与 find 结合使用:stackoverflow.com/questions/1171549/…
猜你喜欢
  • 2011-01-06
  • 2020-10-25
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多