【问题标题】:Maven dependency exclusions in pom.xml are not excluded by assemblypom.xml 中的 Maven 依赖排除项不被程序集排除
【发布时间】:2016-12-21 21:24:55
【问题描述】:

所以我有一个项目,其中我从我的一个依赖项中排除了所有传递依赖项(oracle jdbc 固执地拉入了某人可能需要的所有 jar,这给我带来了问题通过替换我的 xml 解析器)。

我项目的程序集使用dependencySet 来拉入我需要的罐子,但这根本不尊重这些排除:应该排除的罐子出现在最终包中。

我知道我可以在程序集描述符本身中显式排除这些依赖项,但是必须在两个地方维护排除项是不可取的,如果你在 pom.xml 中有很多排除项,这会变得笨拙

最小复制示例:

所有文件

$ find
.
./src
./src/assembly
./src/assembly/tar.gz.xml
./pom.xml

pom.xml

<?xml version="1.0"?>
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>bug.maven</groupId>
  <artifactId>maven-bug</artifactId>
  <version>1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <descriptors>
            <descriptor>src/assembly/tar.gz.xml</descriptor>
          </descriptors>
          <finalName>maven-bug-${project.version}</finalName>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>attached</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>commons-validator</groupId>
      <artifactId>commons-validator</artifactId>
      <version>1.4.1</version>
      <exclusions>
        <exclusion>
          <groupId>*</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

src/assembly/tar.gz.xml

<?xml version="1.0"?>
<assembly>
  <id>pkg</id>
  <formats>
    <format>tar.gz</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/lib</outputDirectory>
      <useProjectArtifact>false</useProjectArtifact>
    </dependencySet>
  </dependencySets>
</assembly>

重现

$ mvn clean package
$ tar tzf target/maven-bug-1-SNAPSHOT-pkg.tar.gz
lib/commons-validator-1.4.1.jar
lib/commons-beanutils-1.8.3.jar
lib/commons-logging-1.2.jar
lib/commons-digester-1.8.1.jar
lib/commons-collections-3.2.1.jar

预期结果

$ mvn clean package
$ tar tzf target/maven-bug-1-SNAPSHOT-pkg.tar.gz
lib/commons-validator-1.4.1.jar

据我所知,这只是一个没有 maven 文档的错误。有没有人知道我缺少或解决方案?

【问题讨论】:

  • 程序集描述符中有一个简单的条目:` false` 应该可以解决您的问题。此外,如果您认为缺少一些文档,您应该打开Ticket in JIRA。啊顺便说一句。目标attached 已弃用,不应使用。在 3.0.0 版本中(这是最新的版本,它已被删除)。请参阅docs page

标签: maven build dependency-management maven-assembly-plugin


【解决方案1】:

编辑

maven-assembly-plugin has been released Jan 01, 2019 的版本3.1.1现在在依赖项排除项中支持通配符。只需升级插件。

就像我在 this answer 中解释的那样,Maven 程序集插件 (version &lt;= 3.1.0) 在依赖项排除项中不支持通配符。

This commit 修复了它,但插件(版本3.1.1在撰写本文时尚未发布。

截至目前 (version &lt;= 3.1.0),最简洁的解决方案是显式声明所有排除的依赖项,不使用通配符。

【讨论】:

    【解决方案2】:

    程序集描述符中有一个简单的条目:&lt;useTransitiveDependencies&gt;false&lt;/useTransitiveDependencies&gt; 应该可以解决您的问题。此外,如果您认为缺少一些文档,您应该打开Ticket in JIRA。啊顺便说一句。目标attached 已弃用,不应使用。在 3.0.0 版本中(这是最新的版本,它已被删除)。请参阅docs page。您的 pom 文件中的依赖项与您可以在 maven 程序集描述符中定义的依赖项之间存在故意差异,因为描述符描述了您打包的内容,而不是类路径上的内容,可能存在差异......而且它们不是总是一样的。

    【讨论】:

    • 不过,这有一个缺点:如果您只想排除一些传递依赖项,这将不起作用。要么全有,要么全无,不允许微调。我发现没有比using the dependency plugin 更好的解决方案来复制目录中的所有依赖项,然后使用fileSet 而不是dependencySet。有点令人费解,但它确实有效。仍然希望有一个更清洁的解决方案。
    • 是的,正如@Chop 所说,删除所有传递依赖项并不能实现目标,我需要那些来运行项目。它只是导致问题的一些表现不佳的行为。普遍的共识似乎是这只是汇编插件中的一个差距,我正在查看代码以查看是否有办法修复它并提交补丁,所以如果有人知道如何处理,请告诉我。
    猜你喜欢
    • 2010-11-30
    • 2019-04-16
    • 2012-02-25
    • 2013-11-06
    • 2017-09-14
    • 1970-01-01
    • 2012-08-16
    • 2012-04-14
    • 2015-09-08
    相关资源
    最近更新 更多