如何从 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 瞬态依赖项(库/jar vaadin json)