我有一个projectX,它生成一个TXT 文件作为其 Artifact 。这是该项目产生的唯一 Artifact 。这效果很好。没问题。
问题是依赖于此 Artifact 的项目会拉动所有projectX 的 Artifact ,这些 Artifact 显然是不相关的,因为 TXT 文件没有依赖项。为了生成 TXT 文件,projectX 当然有许多依赖项,但这些与下游项目无关。
我知道我可以在使用此 TXT 文件的每个单独项目中排除这些传递依赖项。这不是我想要的。我希望它们在projectX本身中停止,这样我就不需要在每个下游项目中声明此类排除。
以我有限的 Maven 知识,我想我需要看看 scope projectX 依赖项的参数。我正在寻找一个范围类型,它表示:“编译和执行projectX需要此依赖项,但它不是传递的”。找不到这样的范围。
如何在不影响下游项目的情况下解决这个问题? (那些使用projectX生成的 Artifact 的)
EDIT1:我对“提供”范围的问题是,projectX 的制作方式使其实际上作为构建过程的一部分执行自身。诚然,这很不寻常,但这就是生成 TXT 文件的原因,该文件是构建的真实输出。换句话说:projectX 的依赖项不仅需要可用于projectX 的编译,而且还可以用于projectX 的执行,但它们不得传播。
编辑2:
我如何执行projectX本身作为其构建过程的一部分:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>build-txt-file</id>
<phase>prepare-package</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${java.home}/bin/java</executable>
<arguments>
<argument>-classpath</argument>
<!-- automatically creates the classpath using all project dependencies, also adding the project build directory -->
<classpath/>
<argument>...</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
如果我将projectX的依赖项声明为provided
,那么上述步骤将不起作用。
最佳答案
看起来提供的
范围符合您的要求。引用您链接的 Maven 文档:
This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime.[...] This scope is only available on the compilation and test classpath, and is not transitive.
(强调我的)
<小时/>编辑(在评论和编辑中进行澄清之后):回顾一下,Maven 意义上的 Artifact 似乎并不是真正的 TXT 文件,至少不是唯一的,并且构建实际上编译了一些类并运行它们 在构建中。 现在,回到解决问题:)。
你陷入困境的原因是你可能违反了 Maven 关于 Artifact 的约定。具体来说,您的项目的依赖项期望您的“TXT”项目是其他项目,这就是您遇到问题的原因。
我看到有两种方法可以解决这个问题:
- 正如您在评论中提到的,您可以编写一个插件来处理 TXT 文件生成。
- 作为一种快速而简单的解决方案,您可以:
- 将您的项目分为两部分:“生成器”(需要 deps)和“持有者”(仅生成和存储您的 TXT 文件)。
- 在您的“生成器”项目中,使用 assembly plugin 将生成器代码及其所有依赖项打包到“uberjar”中(显然已弃用),或 shade plugin (参见“示例”)。注意指定主类。
- 运行
install
将“生成器” Artifact 包含在您的存储库中。 - 在您的“持有者”项目中,使用 dependency plugin将“生成器”JAR 复制到
目标
中。 - 最后,在您的“holder”项目中,使用
exec-maven-plugin
执行下载的“generator”JAR。
请注意,第二个解决方案基本上是一个“穷人的插件”,因此,如果您的构建中有更多类似的场景,从长远来看,学习编写 Mojos 可能会提供更好的返回。尽管如此,我希望这能解决您的问题。
关于java - Maven : how to create project with no propagating deps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21452173/