如何列出JAR的依赖关系

时间:2010-12-11 17:02:27

标签: java jar dependencies maven

是否有一个工具可以列出包含JAR中引用的(第三方)类的第三方“包”?假设它会识别JAR文件定义中的“home”包,它会打印出JAR中引用的第三级第三方类的完全限定名称列表。

org.apache.commons  
org.apache.maven
javax.servlet.jsp
org.eclipse.persistence
org.apache.jackrabbit

目的是我需要找到该JAR文件的maven依赖项并将其部署为maven工件。

8 个答案:

答案 0 :(得分:26)

JarAnalyzer

  

jar文件的依赖项管理实用程序。它的主要目的是遍历目录,解析该目录中的每个jar文件,并识别jar文件之间的依赖关系。输出是一个xml文件,表示jar文件之间的 PhysicalDependencies

     

有关 PhysicalDependencies 的详情,包括各种设计模式,请查看 Extensible Java ...

答案 1 :(得分:22)

自JDK 8以来有一个新工具:jdeps

https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool

  

jdeps是自JDK 8以来添加的新命令行工具,供开发人员用于理解其应用程序和库的静态依赖性。 jdeps是给定类文件的静态分析工具

答案 2 :(得分:10)

您可以执行以下操作(如果是maven项目):

<table id="office">
  <tr>
    <td>Office 1</td>
    <td><input type="radio" name="price-1" checked></td>
    <td><input type="radio" name="price-1"></td>
    <td><input type="radio" name="price-1"></td>
  </tr>
  <tr>
    <td>Office 2</td>
    <td><input type="radio" name="price-2"></td>
    <td><input type="radio" name="price-2" checked></td>
    <td><input type="radio" name="price-2"></td>
  </tr>
  <tr>
    <td>Office 3</td>
    <td><input type="radio" name="price-3"></td>
    <td><input type="radio" name="price-3"></td>
    <td><input type="radio" name="price-3" checked></td>
  </tr>
  <tr>
    <td>Office 4</td>
    <td><input type="radio" name="price-4"></td>
    <td><input type="radio" name="price-4" checked></td>
    <td><input type="radio" name="price-4"></td>
  </tr>
</table>
<button>click</button>

它还显示了传递依赖性,使调试依赖性冲突非常有用。

答案 3 :(得分:3)

如果你使用maven(据我所知),你可以简单地使用Maven Dependency插件。

首先你需要用你所有的jar写一个基本的pom.xml,你可以复制这个例子(我用hibernate作为例子),然后替换你的jar:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
       <groupId>com.mycompany.app</groupId>
       <artifactId>my-app</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>jar</packaging>
       <name>Maven Quick Start Archetype</name>
       <url>http://maven.apache.org</url>
       <dependencies>
          <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-core</artifactId>
             <version>3.5.0-Final</version>
          </dependency>
<!-- add here other dependencies -->
       </dependencies>
    </project>

然后打开终端,进入上面pom.xml的包含文件夹并运行以下命令:

mvn依赖:树

这将打印依赖项列表...

或者如果要在文件夹中下载和复制所有依赖项,请运行以下命令:

mvn依赖:copy-dependencies

您将在文件夹./target/dependencies

中找到所有依赖项

答案 4 :(得分:3)

Tattleltale是JBoss的一个工具,它可以做到这一点

tattletale.jboss.org /

答案 5 :(得分:2)

我的第一个想法是你可以通过使用类加载器来迭代jar中的所有类文件并使用反射来分析每个类的依赖性。但是Class类没有告诉您这些信息的方法。所以接下来的想法是使用某种字节码分析器(例如asm)来从编译类中提取所有引用的类。

假设您可以获得此信息,下一个问题是将类跟踪到jar。从某种意义上说,这将是一个简单的部分,因为您需要做的就是为您的maven仓库或目录或罐子所在的每个罐子创建一个类加载器,然后依次询问每个罐子是否包含特定的类。

这种想法的缺陷是java类(原始源代码或编译代码)没有详细说明从哪里获取导入的类。因此,如果您有两个具有相同包和名称的类(比您想象的更频繁),那么您将无法确定使用哪个类。

即使java只是假设它在类路径中找到的第一个是正确的,如果结果不正确则抛出异常(MethodNotFoundException)。因此,除非您要进一步分析字节码以确定调用每个类的方法,然后将它们与类路径中的类进行比较,否则您仍然无法正确。

简而言之,它可能会做你想要的,但可能非常困难和耗时。

我通常处理这个问题的方法是简单地在测试代码中启动类并继续添加依赖项,直到我可以让它执行我感兴趣的每个方法。

答案 6 :(得分:1)

如果你的是基于maven的项目

mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath

请看下面的链接 http://maven.apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html

可能在你的情况下

mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath -f pathtopom.xml of third party 

答案 7 :(得分:0)

这可能是此工具的替代方案。但它没有列出引用的类。最后一个数字决定了“包级别”。

jar tvf yourjar.jar | perl -nle'BEGIN{$depth=(shift)-1}print join(".", (split(/\//, (split)[-1]))[0..$depth])' 3

问题是,这样就不可能从类定义中获取引用的类。所以唯一可能的方法就是在JAVA中做到这一点。

所以问题是:有没有可以做到的Java工具?

编辑:

我找到了我需要的东西:M2eclipse有一个名为类搜索

的功能

在maven存储库视图中,右键单击存储库并启用完整索引

然后导航&gt;从maven打开类型 - 在那里你可以查看基于java包约定的所有可用工件