有没有朋友可以帮忙写个判断 java class 是在的哪个 jar 包中的程序?

2015-02-04 10:49:29 +08:00
 mikemikemike
有没有朋友可以帮忙写个判断java class是在的哪个jar包中的程序?

工作要用到,java不熟练,但想请个写。
7555 次点击
所在节点    程序员
28 条回复
mikemikemike
2015-02-04 10:52:50 +08:00
这里能找到这样的合作朋友不?
exch4nge
2015-02-04 11:06:49 +08:00
可以不用java写。.jar文件可以当做zip压缩包,看看对应目录里有没有那个名字的xxx.class就好了。


(任何语言)用zip库遍历一下每个.jar文件的目录,查看是否存在对应路径上的.class文件即可。

哦,有可能遇到一个类在多个jar包的情况,这种情况我就不知道了……
lxrabbit
2015-02-04 11:08:54 +08:00
jar -xvf xxx.jar 不是应该这样解包的么
libo26
2015-02-04 11:34:43 +08:00
研究下jar命令吧
nesuk
2015-02-04 11:36:22 +08:00
好像有一个开源的组件(好像名字是WhichJar?),可以自动识别Class加载自哪个Jar。
nesuk
2015-02-04 11:36:41 +08:00
Fancye
2015-02-04 11:40:03 +08:00
···java
Class clazz = String.class;
Package p = clazz.getPackage();
System.out.println(p.getName());
```

Hope that helps!
mgcnrx11
2015-02-04 12:00:35 +08:00
@Fancye 这不就是最好答案了么,反射一下
ledkk
2015-02-04 12:15:31 +08:00
java -verbose:class 这个会自己打印加载类所在的jar包路径的
vjnjc
2015-02-04 13:06:56 +08:00
@Fancye 我感觉不是这样的,这样只会打印出他的packname而不会说是哪个jar包。

比如apache的httpclient,代码只能打印出org.apache.http.client,而事实上楼主要的是android.jar(没错,httpclient是android build-in的包)。

坦白说我不会,记忆里class loaded后只能获得他的packagename,不知道它的jar包名,坐等高手。
如果楼主执意需要的话可以求助于IDE,eclipse和idea都有找出当前class位于×.jar的功能
tension2012
2015-02-04 13:10:35 +08:00
grep javax/xml/soap/MessageFactory `find . -name *.jar`
langxuan
2015-02-04 13:17:24 +08:00
@Fancye 这个前提是已经有这个jar包了
sinsin
2015-02-04 13:24:32 +08:00
难道不是要分两种情况看么233
* 运行时的情况:检查ClassLoader已经加载了的类使用反射可以做到,比如-verbose:class是会显示所在jar的;slf4j-logback输出的日志也有显示所在jar这功能。如果都还没加载,或者同名class在多个jar中存在,那些没加载的自然不会“出现”。
* 静态的情况:在一堆jar或src目录中搜索某个ClassName在哪里存在,那就是IDE或zip工具能做到的事。有个GUI小工具JarIndexer也可以做到。
Fancye
2015-02-04 13:53:17 +08:00
Addtion:
```java
Class clazz = String.class;
ProtectionDomain pd = clazz.getProtectionDomain();
System.out.println(pd.getCodeSource().getLocation());
```

Hope that helps!
Fancye
2015-02-04 13:54:15 +08:00
stdout:
```
file:/E:/Workspaces/MyEclipse%20Professional%202014/tcs/lib/redstone.jar
```
Fancye
2015-02-04 13:55:05 +08:00
Sorry ,my class is XmlRpcClient!
mikemikemike
2015-02-04 16:05:54 +08:00
@exch4nge
@Fancye
@sinsin
@langxuan
@tension2012
@vjnjc
@ledkk
@mgcnrx11
@Fancye
@nesuk
@lxrabbit
小技量就不提了,你们比我熟悉,一批jar包下的位置,有只知道一个class名称,但要在这大批量的jar中找到是属于哪个jar的,写成一个jar包的形式让我调用,你们明白的吧?我不会写,你们试试?
vjnjc
2015-02-04 16:18:25 +08:00
这种啊。。。貌似是用zip遍历。。。
同等高手
ericliuhe
2015-02-04 18:47:38 +08:00
clazz.getResourceAsURL(clazz.getSimpleName() + ".class")
手机打字,方法名可能有点出入,自己纠正
把结果打印出来你就懂了
yorkw
2015-02-04 18:58:26 +08:00
如果是那些常用的第三方库,直接:

http://www.findjar.com/index.x

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/168111

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX