【问题标题】:Maven: How is it possible to get a dependency in your war when it's not in your dependency tree?Maven:当它不在你的依赖树中时,如何在你的战争中获得依赖?
【发布时间】:2014-01-24 23:42:12
【问题描述】:

我有一个战争文件,当我运行mvn package 时,它在 WEB-INF/lib 中获得了 slf4j-jdk14 依赖项,但我无法弄清楚它是如何进入那里的。 CD 进入战争导演并运行mvn dependency:tree -Dverbose。唯一提到 slf4j-jdk14 的行是:

[INFO]    +- org.slf4j:slf4j-jdk14:jar:1.6.1:provided

您可以在此处查看完整输出:https://gist.github.com/dankmirth/691b020f4f908f92015f

我可以在 pom.xml 中注释掉这个依赖。当我这样做时,mvn dependency:tree -Dverbose 根本没有提到 slf4j-jdk14。但是,如果我然后运行mvn clean package,那么战争中仍然有这个罐子。

这怎么可能? dependency:tree 是否只显示部分图片?这是一个Maven错误吗?

$ mvn -version
Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 08:22:22-0700)

如果我运行help:effective-pom,则只有对 slf4j-jdk14 的引用位于排除它的行中。对我来说,war 插件看起来很标准,这是输出:

  <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <executions>
      <execution>
        <id>default-war</id>
        <phase>package</phase>
        <goals>
          <goal>war</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

虽然我很想为此提供一个 pom,但我不能,因为我的公司不允许。我试图在示例项目中重现这一点,但无法做到。我希望那里的一些专家可以指出我调试这个 jar 来自哪里的路径,因为根据我对 maven 的理解,这不应该是可能的。

【问题讨论】:

  • 请附上整个依赖:树
  • 尝试 3.1。另外,运行 help:effective-pom 看看是否有人在配置对 war 插件没有帮助的东西。
  • @bmargulies 我更新并运行了 help:effective-pom。我没有看到任何效果。
  • @MariuszS 看到我的更新。我把它放在一个要点中

标签: java maven war


【解决方案1】:

This answer 对上一个问题说即使排除了传递依赖项,war 插件在复制依赖项时似乎也没有排除 jar。所以你可以尝试在你的 pom 中排除一些其他的传递依赖,并检查它是否没有被复制。如果它仍然被复制,则意味着您的 slf4j-jdk14 以相同的方式被复制。

如果是这种情况,您可以尝试使用war plugin configuration 排除它。

【讨论】:

  • 好的,但是我在哪里说过,“我可以在 pom 中注释掉这个依赖项。当我这样做时,mvn dependency:tree -Dverbose 根本没有提到 slf4j-jdk14。”那是不是意味着war插件甚至看不到slf4j-jdk14,传递与否?
  • 顺便说一句,我认为 war 插件配置可能会解决我的问题(我会尝试并告诉你),但我想自信地理解为什么这发生在我将此标记为答案之前。
  • @tieTYT 根据我从链接中了解到的情况,war 插件似乎不适用于依赖关系树。也许它有自己的逻辑来确定应该复制哪些 jar,并且该逻辑(可能是错误的?)不排除使用 exclude 标签排除的工件。
猜你喜欢
  • 2013-08-23
  • 2016-01-02
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多