java - Maven : how to create project with no propagating deps?

标签 java maven

我有一个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 文件生成。
  • 作为一种快速而简单的解决方案,您可以:
    1. 将您的项目分为两部分:“生成器”(需要 deps)和“持有者”(仅生成和存储您的 TXT 文件)。
    2. 在您的“生成器”项目中,使用 assembly plugin 将生成器代码及其所有依赖项打包到“uberjar”中(显然已弃用),或 shade plugin (参见“示例”)。注意指定主类。
    3. 运行 install 将“生成器” Artifact 包含在您的存储库中。
    4. 在您的“持有者”项目中,使用 dependency plugin将“生成器”JAR 复制到目标中。
    5. 最后,在您的“holder”项目中,使用 exec-maven-plugin 执行下载的“generator”JAR。

请注意,第二个解决方案基本上是一个“穷人的插件”,因此,如果您的构建中有更多类似的场景,从长远来看,学习编写 Mojos 可能会提供更好的返回。尽管如此,我希望这能解决您的问题。

关于java - Maven : how to create project with no propagating deps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21452173/

相关文章:

java - SWT - 使表格可滚动

java - DBUnit DatabaseUnitRuntimeException

java - 在 Eclipse 中,我在哪里可以看到项目的构建进度?

maven - Gson依赖关系-哪个存储库?

java - 查找二维数组中数字的位置

java - 导出处清洁问题

java - Maven 属性当前用户名?

eclipse - 如何将 JUnit 5 与现有 Eclipse 项目集成?

jsp - 在 web-app 中使用 maven 和 eclipse 时抛出异常

java - Bouncy CaSTLe,NoSuchMethodError(org.bouncycaSTLe.asn1.ASN1Integer)