ChatGPT解决这个技术问题 Extra ChatGPT

不同构建配置文件的不同依赖项

对于不同的配置文件,maven pom.xml 文件中是否可以有一组不同的依赖项?

例如

mvn -P debug
mvn -P release

我想在一个配置文件中选择一个不同的依赖 jar 文件,该文件具有相同的类名和相同接口的不同实现。

这可以在针对不同的 Web 服务器时使用。例如,在为 JavaEE 5 服务器构建时,它提供了诸如 JAXB 之类的库,您不应该将其包含在您的 war 文件中,而在构建 JavaEE 1.4 服务器时,您应该在其中包含 JAXB jar。

L
Lii

引用 Maven documentation on this

配置文件元素包含可选的激活(配置文件触发器)和如果该配置文件已被激活则要对 POM 进行的更改集。例如,为测试环境构建的项目可能指向与最终部署不同的数据库。或者可以根据使用的 JDK 版本从不同的存储库中提取依赖项。

(重点是我的)

只需将 release 配置文件的依赖项放入配置文件声明本身,并对 debug 执行相同操作。

<profiles>
    <profile>
        <id>debug</id>
        …
        <dependencies>
            <dependency>…</dependency>
        </dependencies>
        …
    </profile>
    <profile>
        <id>release</id>
        …
        <dependencies>
            <dependency>…</dependency>
        </dependencies>
        …
    </profile>
</profiles>

此方法将导致代码在编辑模式下无法解析。如果 debug 处于活动状态,则 release 的依赖 jar 将丢失,并且代码将出错。如何解决?
您可以在依赖层次结构中将发布特定依赖的范围设置为“提供”,并在发布配置文件部分将范围重置为“编译”。这样依赖项可用于编译,但不能用于“调试”配置文件的最终战争。
恕我直言,配置文件没有用,至少对于依赖项而言:IDE 出错,依赖项停止解析,应用程序最终无法运行。我期待更多。
佚名

您的 groupId、artifactId 应该在您的配置文件中标记为属性,您可以将依赖项移动到通用部分。


仅当您有 1 个依赖项时才会出现这种情况。如果调试和发布之间的依赖项数量不同,则标记化将不起作用。就此而言,我建议不要在配置文件部分标记和明确定义 deps。
另一个答案对我不起作用,因为默认配置文件依赖项仍然与其他特定配置文件依赖项一起包含。你的回答很好。
@Vlad 您是否从 POM 的主体中删除了依赖项?否则你会得到它两次。 (有关如何确保一个配置文件始终处于活动状态,请参阅 stackoverflow.com/q/24855678/6944068。)