Maven 程序集插件:如何包含传递依赖项的提供依赖项
Maven assembly plugin: how to include provided dependencies of transitive dependencies
似乎在 provided
范围内包含直接依赖关系很好理解。似乎也很容易实现 runtime
范围内的传递依赖。
但是我怎样才能包含两个间接级别之外的依赖项?
示例:
A --> B --> C
其中 A 依赖于 B(编译范围),B 依赖于 C(提供的范围)。
我希望 A
检索 C
(例如:在本地下载 jar),无论是通过程序集描述符还是 maven-dependency-plugin:copy-dependencies
或其他机制。
我似乎已经尝试了上述两个插件的所有选项组合。这两种方法都没有涵盖这种情况。它们都获得 B
(即使 B
更改为提供的依赖项),以及 B
的任何编译范围依赖项,但未提供 B.
的依赖项
我想我正在尝试做一些类似于我项目的阴影表示但没有解包依赖项的事情。
当然,我不想在 A 的 pom 中枚举 B 的所有依赖项 - 我想隐式地和递归地检索(然后打包)所有依赖项。
你将无法做到这一点。它不是 maven-assembly-plugin
的限制,而是 Maven 考虑传递依赖的方式。范围为 provided
的传递依赖将始终被忽略(请参阅文档中的 this table)。
有一个关于此的未解决错误 (MNG-2205),但我认为它不会很快得到修复。这确实是预期的行为,因为 provided
依赖项,根据名称,应该在运行时提供。
虽然 Tunaki 说得很对,但我找到了一个总比没有好的可行解决方案,使用一个不太知名的插件(注意:仅适用于 Maven <= 3。0.X)
这指定了两个依赖块。第一个引入正常的编译依赖,包括传递,它与使用复制依赖相同。除了正常的 pom 依赖声明之外,第二个块还特别提到了 B(不幸的是,但至少两个依赖项都在同一个 pom 中)并请求其提供的 deps:
<plugin>
<groupId>com.github.goldin</groupId>
<artifactId>copy-maven-plugin</artifactId>
<version>0.2.5</version>
<executions>
<execution>
<id>get-provided-dependencies</id>
<phase>generate-resources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<resources>
<resource>
<targetPath>${project.build.directory}/lib</targetPath>
<dependencies>
<dependency>
<includeScope>compile</includeScope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact_i_call_B</artifactId>
<version>1.0</version>
<includeScope>provided</includeScope>
</dependency>
</dependencies>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
此插件的文档此时可能只存在于存档中,不确定它发生了什么:
http://web.archive.org/web/20130826193436/http://evgeny-goldin.com/wiki/Copy-maven-plugin
似乎在 provided
范围内包含直接依赖关系很好理解。似乎也很容易实现 runtime
范围内的传递依赖。
但是我怎样才能包含两个间接级别之外的依赖项?
示例:
A --> B --> C
其中 A 依赖于 B(编译范围),B 依赖于 C(提供的范围)。
我希望 A
检索 C
(例如:在本地下载 jar),无论是通过程序集描述符还是 maven-dependency-plugin:copy-dependencies
或其他机制。
我似乎已经尝试了上述两个插件的所有选项组合。这两种方法都没有涵盖这种情况。它们都获得 B
(即使 B
更改为提供的依赖项),以及 B
的任何编译范围依赖项,但未提供 B.
我想我正在尝试做一些类似于我项目的阴影表示但没有解包依赖项的事情。
当然,我不想在 A 的 pom 中枚举 B 的所有依赖项 - 我想隐式地和递归地检索(然后打包)所有依赖项。
你将无法做到这一点。它不是 maven-assembly-plugin
的限制,而是 Maven 考虑传递依赖的方式。范围为 provided
的传递依赖将始终被忽略(请参阅文档中的 this table)。
有一个关于此的未解决错误 (MNG-2205),但我认为它不会很快得到修复。这确实是预期的行为,因为 provided
依赖项,根据名称,应该在运行时提供。
虽然 Tunaki 说得很对,但我找到了一个总比没有好的可行解决方案,使用一个不太知名的插件(注意:仅适用于 Maven <= 3。0.X)
这指定了两个依赖块。第一个引入正常的编译依赖,包括传递,它与使用复制依赖相同。除了正常的 pom 依赖声明之外,第二个块还特别提到了 B(不幸的是,但至少两个依赖项都在同一个 pom 中)并请求其提供的 deps:
<plugin>
<groupId>com.github.goldin</groupId>
<artifactId>copy-maven-plugin</artifactId>
<version>0.2.5</version>
<executions>
<execution>
<id>get-provided-dependencies</id>
<phase>generate-resources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<resources>
<resource>
<targetPath>${project.build.directory}/lib</targetPath>
<dependencies>
<dependency>
<includeScope>compile</includeScope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact_i_call_B</artifactId>
<version>1.0</version>
<includeScope>provided</includeScope>
</dependency>
</dependencies>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
此插件的文档此时可能只存在于存档中,不确定它发生了什么: http://web.archive.org/web/20130826193436/http://evgeny-goldin.com/wiki/Copy-maven-plugin