程序集不排除pom.xml中的Maven依赖项排除项

时间:2016-12-21 21:24:55

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

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

我的项目程序集使用dependencySet来引入我需要的jar,但这根本不考虑这些排除:应排除的jar显示在最终包中。

我知道我可以在程序集描述符本身中明确地排除这些依赖项,但不希望在两个地方维护排除项,如果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 /组件/ 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文档的bug。有没有人知道我缺少或解决?

2 个答案:

答案 0 :(得分:2)

就像我在this answer中解释的那样,Maven程序集插件(version <= 3.1.0)不会在依赖项排除项中使用通配符。

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

截至目前(version <= 3.1.0),最干净的解决方案是明确声明所有被排除的依赖项,而不使用通配符。

答案 1 :(得分:1)

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