Excluding “provided” dependencies from Maven assembly

后端 未结 4 1272
长情又很酷
长情又很酷 2020-12-25 13:49

I am trying to use the Maven assembly plugin to build a jar-with-dependencies, except those that have provided scope.

I have copied the jar-with-dependencie

相关标签:
4条回答
  • 2020-12-25 14:36

    This is an old post, but the maven-dependency-plugin now has an "excludeScope" option that you can set to "provided" or whatever scope you need.

    http://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html#excludeScope

    For example,

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    <overWriteReleases>false</overWriteReleases>
                    <overWriteSnapshots>false</overWriteSnapshots>
                    <overWriteIfNewer>true</overWriteIfNewer>
                    <excludeScope>provided</excludeScope>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
    0 讨论(0)
  • 2020-12-25 14:38

    This is a bit clunky, but you can use the maven-dependency-plugin to copy/unpack all the dependencies into your project, then use the assembly plugin to do the packaging.

    The copy-dependencies and unpack-dependencies goals both have an optional excludeScope property you can set to omit the provided dependencies. The configuration below copies all dependencies into target/lib, your assembly plugin descriptor can be modified to use a fileSet to include those jars.

    Update: Just tested this to confirm it works. Added the configuration for binding the assembly plugin to the package phase, and the relevant modifications to the assembly descriptor.

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>copy-dependencies</id>
          <phase>process-resources</phase>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <excludeScope>provided</excludeScope>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.2-beta-4</version>
      <executions>
        <execution>
          <id>jar-with-deps</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <descriptors>
          <descriptor>src/main/assembly/my-assembly.xml</descriptor>
        </descriptors>
      </configuration>
    </plugin>
    

    The fileSet section of the my-assembly descriptor would look like this:

    <assembly>
      <fileSets>
        <fileSet>
          <directory>${project.build.directory}/lib</directory>
          <outputDirectory>/</outputDirectory>
          <includes>
            <include>*.*</include>
          </includes>
        </fileSet>
      </fileSets>
    ...
    
    </assembly>
    
    0 讨论(0)
  • 2020-12-25 14:48

    In theory the tags "ignoreNonCompile" and "excludeScope" should help, but be warned that they do not necessarily work properly.

    With maven3 and the maven-dependency-plugin 2.4, one solution is:

    <configuration>
    <excludeArtifactIds>junit,mockito-all</excludeArtifactIds>
    <excludeTransitive>true</excludeTransitive>
    </configuration>
    
    0 讨论(0)
  • 2020-12-25 14:51

    With the latest Maven (I was testing on Maven 3.0) this appears to work as expected, with some caveats:

    The requested scope (in the dependencySet) may include additional scopes based on the following definition: http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

    Thus, if you request compile scope you will get both compile and provided. However, if you request runtime scope you should get compile and runtime (but not provided).

    0 讨论(0)
提交回复
热议问题