如何找到特定类文件中的依赖项?

use*_*246 8 maven apache-storm

我的项目包含一些依赖性,这些依赖性正在拉动相同的共同依赖性.

公共依赖项storm-kafka具有新版本1.0.2和旧版本0.10.0

在构建一个带阴影的jar时,我会看到我的胖罐中的两个版本中的类,并且在执行过程中以某种方式,较旧的一个被拾取,这给出了一个ClassNotFoundError因为与旧版本相关的其他依赖项不存在.

jar -xvf my_shaded_fat_jar.jar
find . -name KeyValueSchemeAsMultiScheme.class
./org/apache/storm/kafka/KeyValueSchemeAsMultiScheme.class
./storm/kafka/KeyValueSchemeAsMultiScheme.class
Run Code Online (Sandbox Code Playgroud)

storm/kafka是旧的,org/apache/storm/kafka是我想要的新的.

令人惊讶的是我在我的~/.m2回购中看不到0.10.0 :

ls ~/.m2/repository/org/apache/storm/storm-kafka/
1.0.2
# no 0.10.0 here !
Run Code Online (Sandbox Code Playgroud)

如何调试maven以找出较旧的依赖关系从何处蔓延?

编辑:

在跑步时mvn dependency:tree -Dverbose -Dincludes=storm.kafka,我得到:

[WARNING] The POM for org.apache.storm:flux-core:jar:1.0.2 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
[WARNING] The POM for org.apache.storm:storm-kafka:jar:1.0.2 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli)  ---
[WARNING] Failed to build parent project for org.apache.storm:flux-core:jar:1.0.2
[WARNING] Invalid POM for org.apache.storm:flux-core:jar:1.0.2, transitive dependencies (if any) will not be available, enable debug logging for more details
[WARNING] Invalid POM for org.apache.storm:storm-kafka:jar:1.0.2, transitive dependencies (if any) will not be available, enable debug logging for more details
[WARNING] Failed to build parent project for org.apache.storm:flux-core:jar:1.0.2
[WARNING] Invalid POM for org.apache.storm:flux-core:jar:1.0.2, transitive dependencies (if any) will not be available, enable debug logging for more details
Run Code Online (Sandbox Code Playgroud)

为什么poms无效?我只是.m2通过删除所有内容来清理我的仓库~/.m2/repository/org/apache/storm

小智 6

您可以使用 Maven 树目标来显示使用的所有依赖项。默认情况下,这会打印出完整的 dep 树,但您也可以通过它来查找您感兴趣的特定依赖项 - 例如尝试:

mvn 依赖项:tree -Dverbose -Dincludes=storm.kafka

看看卡夫卡的吸引力是什么。更多信息可以在这里找到:

http://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html

  • @adamskoye,您好,我用您的命令中的更多详细信息更新了我的问题。我认为我想要解决的问题是引入给定类的确切依赖项,而不是给定依赖项本身,因为此时我不知道哪个依赖项引入了错误的类文件。 (3认同)

web*_*rjn 6

mvn dependency:build-classpath -Dmdep.outputFile=f
Run Code Online (Sandbox Code Playgroud)

给出所有依赖 jar 的列表。

现在迭代它们并将它们的内容添加到文件中:

for f in `cat f | tr ';:' '  '`
do
    echo $f >> out
    unzip -v $f >> out
done
Run Code Online (Sandbox Code Playgroud)

  • 在我的系统中,“tr”命令需要冒号而不是分号,因为“mvn dependency:build-classpath”的输出由“:”分隔。否则,这是获取依赖项内文件的好方法。 (2认同)