V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mikemikemike
V2EX  ›  程序员

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

  •  
  •   mikemikemike · 2015-02-04 10:49:29 +08:00 · 7382 次点击
    这是一个创建于 3373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有没有朋友可以帮忙写个判断java class是在的哪个jar包中的程序?

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


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

    哦,有可能遇到一个类在多个jar包的情况,这种情况我就不知道了……
    lxrabbit
        3
    lxrabbit  
       2015-02-04 11:08:54 +08:00
    jar -xvf xxx.jar 不是应该这样解包的么
    libo26
        4
    libo26  
       2015-02-04 11:34:43 +08:00
    研究下jar命令吧
    nesuk
        5
    nesuk  
       2015-02-04 11:36:22 +08:00
    好像有一个开源的组件(好像名字是WhichJar?),可以自动识别Class加载自哪个Jar。
    nesuk
        6
    nesuk  
       2015-02-04 11:36:41 +08:00
    Fancye
        7
    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
        8
    mgcnrx11  
       2015-02-04 12:00:35 +08:00
    @Fancye 这不就是最好答案了么,反射一下
    ledkk
        9
    ledkk  
       2015-02-04 12:15:31 +08:00
    java -verbose:class 这个会自己打印加载类所在的jar包路径的
    vjnjc
        10
    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
        11
    tension2012  
       2015-02-04 13:10:35 +08:00
    grep javax/xml/soap/MessageFactory `find . -name *.jar`
    langxuan
        12
    langxuan  
       2015-02-04 13:17:24 +08:00
    @Fancye 这个前提是已经有这个jar包了
    sinsin
        13
    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
        14
    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
        15
    Fancye  
       2015-02-04 13:54:15 +08:00
    stdout:
    ```
    file:/E:/Workspaces/MyEclipse%20Professional%202014/tcs/lib/redstone.jar
    ```
    Fancye
        16
    Fancye  
       2015-02-04 13:55:05 +08:00
    Sorry ,my class is XmlRpcClient!
    mikemikemike
        17
    mikemikemike  
    OP
       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
        18
    vjnjc  
       2015-02-04 16:18:25 +08:00
    这种啊。。。貌似是用zip遍历。。。
    同等高手
    ericliuhe
        19
    ericliuhe  
       2015-02-04 18:47:38 +08:00 via iPhone
    clazz.getResourceAsURL(clazz.getSimpleName() + ".class")
    手机打字,方法名可能有点出入,自己纠正
    把结果打印出来你就懂了
    yorkw
        20
    yorkw  
       2015-02-04 18:58:26 +08:00
    如果是那些常用的第三方库,直接:

    http://www.findjar.com/index.x
    sinsin
        21
    sinsin  
       2015-02-04 19:05:13 +08:00
    @mikemikemike 原来是伸手党啊。。。233
    你的需求并不明确,我们不会去试试。这问题里各种工具的作者都跑进去回了,自己找合适的吧。
    http://stackoverflow.com/questions/1342894/find-a-class-somewhere-inside-dozens-of-jar-files
    mikemikemike
        22
    mikemikemike  
    OP
       2015-02-04 22:26:18 +08:00
    @ericliuhe
    @sinsin
    我不懂,我只是单纯的想让你们给我写一个,然后我支付宝转你账。。。
    被你们误解了,唉。
    fxbird
        23
    fxbird  
       2015-02-04 22:31:00 +08:00
    @mikemikemike how much?我写过
    KentY
        24
    KentY  
       2015-02-05 05:59:04 +08:00
    你交代的不明白,你vm里load了一个class,你想知道这个class来自哪个jar? 还是说你有个class名字,包括包名,想知道哪个jar里有这个class名字?
    Fancye
        25
    Fancye  
       2015-02-05 10:20:03 +08:00
    @mikemikemike I done. If you need, put your email please.
    Fancye
        26
    Fancye  
       2015-02-05 15:05:37 +08:00
    xbaofeng
        27
    xbaofeng  
       2015-02-06 21:32:05 +08:00
    total commander 直接搜压缩文件
    Fancye
        28
    Fancye  
       2015-02-12 23:04:58 +08:00
    cmd: java -jar findJar.jar

    Jar from pan.baidu: http://pan.baidu.com/s/1kT9TSBd password: vlvp
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   818 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:36 · PVG 05:36 · LAX 14:36 · JFK 17:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.