如何从 Maven 程序集插件中排除依赖项:jar-with-dependencies?

Posted

技术标签:

【中文标题】如何从 Maven 程序集插件中排除依赖项:jar-with-dependencies?【英文标题】:How to exclude dependencies from maven assembly plugin : jar-with-dependencies? 【发布时间】:2011-09-06 18:48:33 【问题描述】:

Maven 的组装插件可以创建一个大 jar,其中包括所有具有 descriptorRef jar-with-dependencies 的依赖项。

如何排除其中一些依赖项?好像没有这样的配置?还有其他解决方案吗?

【问题讨论】:

相关:如果您在 POM 级别排除了一些依赖项并且它们仍包含在程序集输出中,请检查您的程序集插件版本。 Pre-3.1.1 has suffered from an exclusion related bug ,而且我们中的很多人仍在使用旧版本(我的版本是 2.4,直到我明确查找)。 【参考方案1】:

<scope>provided</scope> 添加到您不希望包含在 jar-with-dependencies 中的依赖项中,例如

    <dependency>
      <groupId>storm</groupId>
      <artifactId>storm</artifactId>
      <version>0.6.1-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>

【讨论】:

这是最简单的解决方案,也与 WAR 目标一致 我在两个不同的项目中使用 javafx-controls 和 javafx-fxml 库进行了尝试。它在第一个项目中运行良好。但是在第二个中,它因编译许多错误而失败,例如“package javafx.beans 不存在”。不知道为什么。 很高兴看到我如何支持这个答案,现在我遇到了 provided JAR 包含在输出 JAR 中的问题【参考方案2】:

您应该使用dependencySet 中提供的excludes 选项。 关注以下:

pom.xml 中的示例:

...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <finalName>../final/$project.artifactId</finalName>
          <archive>
            <manifest>
              <addClasspath>false</addClasspath>
              <mainClass>com.entrerprise.App</mainClass>
            </manifest>
          </archive>
          <descriptors>
            <descriptor>src/main/resources/jar-with-deps-with-exclude.xml</descriptor>
          </descriptors>
          <appendAssemblyId>false</appendAssemblyId>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
...

现在在您的新文件 jar-with-deps-with-exclude.xml 中(dependencySet 所在的位置):

 <?xml version="1.0" encoding="UTF-8"?>
    <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
        <id>jar-with-dependencies-and-exclude-classes</id>
        <formats>
          <format>jar</format>
        </formats>
        <includeBaseDirectory>false</includeBaseDirectory>
        <dependencySets>
          <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>false</useProjectArtifact>
            <unpack>true</unpack>
            <scope>runtime</scope>
            <excludes>
              <exclude>junit:junit</exclude>
              <exclude>commons-cli:commons-cli</exclude>
              <exclude>org.apache.maven.wagon:wagon-ssh</exclude>
            </excludes>
           </dependencySet>
        </dependencySets>
        <fileSets>
          <fileSet>
            <outputDirectory>/</outputDirectory>
            <directory>$project.build.outputDirectory</directory>
          </fileSet>
        </fileSets>
      </assembly>

就是这样。

【讨论】:

比 Raghuram 的答案更好【参考方案3】:

example 表示一种方法:

 <dependencySets>
    <dependencySet>
      ....
      <excludes>
        <exclude>commons-lang:commons-lang</exclude>
        <exclude>log4j:log4j</exclude>
      </excludes>
    </dependencySet>
    ....
  </dependencySets>

基本上我们会使用dependencySet 中的excludes 选项。

另见:https://maven.apache.org/plugins/maven-assembly-plugin/assembly-component.html

【讨论】:

这给出了一个错误:“Unrecognized tag: 'dependencySets'” for maven3 这个例子假设我知道依赖集在 pom.xml 中的位置。一个完整的例子会很有帮助。 将程序集描述符中的范围从 runtime 更改为 compile。这是关键。 这里的问题(在 7 年后)是这仅出现在程序集定义文件中,不与 'jar-with-dependencies' 一起使用。

以上是关于如何从 Maven 程序集插件中排除依赖项:jar-with-dependencies?的主要内容,如果未能解决你的问题,请参考以下文章

具有依赖项的 Maven 2 程序集:不包括范围“系统”下的 jar

使用 maven 程序集插件覆盖资源文件

如何从 maven 项目中自动排除未使用的 jar 文件?

不排除 Maven 瞬态依赖项(库/jar vaadin json)

在 Android Gradle 构建中,如何从包含的 jar 文件中排除依赖项?

如何从 sbt 的包中排除程序集?