首页 文章

从.war中排除maven依赖关系的正确方法

提问于
浏览
2

我在Eclipse中有一个多模块Maven项目 . 它有一个jar模块,“myapp-core”和一堆.war模块 . 核心模块依赖于一些外部jar,战争模块依赖于核心 .

问题是,当我构建.war文件时,所有依赖项都会被复制到所有WEB-INF / lib文件夹中,所以我们有重复项 . 理论上,解决问题的正确方法是将myapp-core中的依赖项赋予“提供”范围 . 不幸的是,当我这样做时,所有.war模块都会出现编译错误 . 无论如何,所有传递依赖都会被复制!

如何设置以便排除战争中常见的依赖关系?

(不幸的是,我不能一个接一个地排除所有传递文物 . 它们中有大约50个,而且这是一个不断变化的列表 . )

2 回答

  • 1

    您可以使用配置节排除和包含工件

    <project>
      ...
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.4</version>
            <configuration>
              <!--
                Exclude JCL and LOG4J since all logging should go through SLF4J.
                Note that we're excluding log4j-<version>.jar but keeping
                log4j-over-slf4j-<version>.jar
              -->
              <packagingExcludes>
                WEB-INF/lib/commons-logging-*.jar,
                %regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar]
              </packagingExcludes>
            </configuration>
          </plugin>
        </plugins>
      </build>
      ...
    </project>
    

    供参考,请参阅here

  • 1

    您可以排除某些工件所引入的某些传递依赖项,而不是“提供”,并允许保留其他依赖项 . 例如 . ,

    X -depends-> B1 -depends-> C1
    Y -depends-> B2 -depends-> C2 -depends-> D1
    

    然后设置你的pom让X排除B1 . 然后你得到最新最好的B和最新的C(假设B2是B1的较新版本,C2是C1的较新版本) . 此外,您可以声明D1为依赖项,或将其标记为“已提供” .

    有关更多示例,请参阅mvnref-book/dependencies,另请参阅另一个堆栈交换问答here

相关问题