';其中';用于在Java类路径上查找资源的等效命令

';其中';用于在Java类路径上查找资源的等效命令,java,classpath,utility,Java,Classpath,Utility,是否有UNIX“which”命令的等价物,即对于给定的资源,遍历所有类路径组件并告诉我在哪个组件中找到它特别是当类路径上出现多个实例时? (上下文:我花了一天的大部分时间来追踪一个bug,这个bug归结为一个很长的类路径,在一个编译过的jar之前有一个源目录,它的源代码是陈旧的(因此它会使编译过的新代码黯然失色) (是的,我知道您可以通过“java-verbose”实现这一点,但这会产生大量的输出 也许'java-verbose…| grep specific resource'是最好的方法?我

是否有UNIX“which”命令的等价物,即对于给定的资源,遍历所有类路径组件并告诉我在哪个组件中找到它特别是当类路径上出现多个实例时?

(上下文:我花了一天的大部分时间来追踪一个bug,这个bug归结为一个很长的类路径,在一个编译过的jar之前有一个源目录,它的源代码是陈旧的(因此它会使编译过的新代码黯然失色)

(是的,我知道您可以通过“java-verbose”实现这一点,但这会产生大量的输出


也许'java-verbose…| grep specific resource'是最好的方法?

我使用shell脚本在一组jar中查找类。相关部分如下:

find /my/jars -name \*.jar | while read jar; do
    jar -tf "$jar" | fgrep --label="$jar" -l foo/bar/SomeClass.class
done
它列出了
/my/JARs
中包含文件
foo/bar/SomeClass.class
的所有jar

编辑

评论中的这一行同样有效:

grep -rail --include=\*.jar foo/bar/SomeClass.class /my/jars

您最好的选择是使用类路径并在每个元素中搜索有问题的类

理论上,类保证按类路径顺序加载。但是,如果类路径有一个通配符元素,它就不再是确定性的。因此,您需要检查这些元素,只需转储与相关资源匹配的类路径元素


如果
java-verbose
没有提供您所需的所有信息,那么一个简短的JRuby/Groovy脚本应该可以做到这一点。

请看,我相信它正是您想要的。推出自己的并不困难,但为什么要在现成的情况下这么做呢?

解压-l your_library.jar | grep ClassName:)是的,我正在为一整套jar做这件事。
grep-rail——include=*.jar
从这里的答案来看:。我没有意识到
grep
可以处理二进制文件!谢谢。类似于这个问题吗?谢谢我搜索了一下,但没有发现,他的问题更具限制性。.class不一定要在.jar.Right中,类路径上的通配符被认为是有害的。总是将它们放在静态的子目录/jar列表中,以避免将来出现意外。@smci不,我根本不会这样概括它。通常情况下,类路径上没有源目录,并且依赖项是规范化的。通配符是发行版的一个很好的捷径。当然,现在大多数依赖项都不是手动管理的,但通配符本身从根本上来说并不坏。如果有多个类路径组件(特别是如果它们有子目录),通配符就是一场噩梦。您希望每个资源都能准确地找到它应该位于的位置,否则就会失败。@smci这是一个很大的“如果”,您假设存在多个依赖满足条件。显然,如果你有病理学图书馆藏品,通配符不是一个好主意。奥托,如果你处在那种情况下,事情已经开始好转了。不,不是。一个非平凡的生产类路径往往有多个组件。至于多重满意度,这是我问题的全部重点。(当在本地开发机器和测试机器之间远程工作时,它不是病态的,它只是一个源目录和编译的JAR。不存在cow legs。)