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


115

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

例如

mvn -P debug
mvn -P release

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


定位到不同的Web服务器时可以使用它。例如,在构建JavaEE 5服务器时,它提供了不应包含在war文件中的JAXB之类的库,而在构建JavaEE 1.4服务器时,其中应包含JAXB jar。
莱昂内尔

Answers:


174

在此引用Maven文档

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

(强调是我的)

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

<个人资料>
    <个人资料>
        <id>调试</ id>
        …
        <依赖项>
            <dependency>…</ dependency>
        </ dependencies>
        …
    </ profile>
    <个人资料>
        <id>版本</ id>
        …
        <依赖项>
            <dependency>…</ dependency>
        </ dependencies>
        …
    </ profile>
</ profiles>

2
此方法将导致在编辑模式下无法解析代码。如果调试处于活动状态,则将缺少发行版的依赖项jar,并且代码将错误。怎么解决呢?
brucenan '16

6
您可以在依赖关系层次结构中将特定于发布的依赖关系的范围设置为“提供”,并在发布配置文件部分将范围重置为“编译”。这样,该依赖关系可用于编译,但不能在最终的“调试”配置文件中使用。
今天

@uday如果您希望给出表明该方法的答案,我希望支持它
javadba

IMHO配置文件是无用的,至少对于依赖项是无效的:IDE会出错,依赖项停止解析,应用程序最终无法运行。我期待更多。
Ares

6

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


2
仅当您有1个依赖项时才是这种情况。如果调试和发布之间的依赖关系数量不同,则仅令牌化将不起作用。为此,我建议不要在概要文件部分中标记化并明确定义dep。
Marcel Overdijk

另一个答案对我不起作用,因为默认配置文件依赖性仍与其他特定的配置文件依赖性一起包括在内。您的回答很好。
Vlad Mihalcea 2014年

@Vlad您是否已从POM主体中删除了依赖项?否则,您将获得两次。(有关如何确保一个配置文件始终处于活动状态,请参见stackoverflow.com/q/24855678/6944068。)–
toolforger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.