【问题标题】:Maven profile not seeing dependency in child moduleMaven 配置文件在子模块中没有看到依赖项
【发布时间】:2014-03-17 20:26:18
【问题描述】:

我在 SO 和 Internet 上进行了搜索,但没有成功。这就是我所拥有的:

具有 dev 和 appserv 配置文件的多模块项目。当使用 dev 配置文件时(只是 mvn clean install,因为 default=true),然后加载特定的依赖项。一个依赖项是Child-A,必须在Child-B 中加载。我总是从父 POM 构建。

我在父 POM 中定义了激活的配置文件,在 Child-B 我有相同的配置文件和依赖项。

这是我的父母POM

<project ..>
    <groupId>com.organisation</groupId>
    <artifactId>project-name</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>child-b</module>
        <module>child-a</module>
    </modules>

    <properties>
        <javax.ws.rs.version>2.0</javax.ws.rs.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- project dependencies -->
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>child-a</artifactId>
                <version>${project.version}</version>
            </dependency>
            <!-- build dependencies -->
            <dependency>
                <groupId>javax.ws.rs</groupId>
                <artifactId>javax.ws.rs-api</artifactId>
                <version>${javax.ws.rs.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <dependencyManagement>
                <dependencies>
                    <dependency>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>child-a</artifactId>
                        <version>${project.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>javax.ws.rs</groupId>
                        <artifactId>javax.ws.rs-api</artifactId>
                        <version>${javax.ws.rs.version}</version>
                    </dependency>
                </dependencies>
            </dependencyManagement>
        </profile>

        <profile>
            <id>app-server</id>
            <activation>
                <activeByDefault>false</activeByDefault>
                <property>
                    <name>env</name>
                    <value>app-server</value>
                </property>
            </activation>
        </profile>
    </profiles>
</project>

我的Child-B 模块调用Child-A,在构建Child-B 时的IDE 也看不到Child-A 的类。

<project ..>
    <parent>
        <groupId>com.organisation</groupId>
        <artifactId>project-name</artifactId>
        <version>1.0</version>
    </parent>

    <artifactId>child-b</artifactId>
    <packaging>jar</packaging>

    <profiles>
        <profile>
            <id>dev</id>
            <dependencies>
                <dependency>
                    <groupId>${project.parent.groupId}</groupId>
                    <artifactId>child-a</artifactId>
                </dependency>
                <dependency>
                    <groupId>javax.ws.rs</groupId>
                    <artifactId>javax.ws.rs-api</artifactId>
                </dependency>
            </dependencies>
        </profile>

        <profile>
            <id>app-server</id>
                <dependencies>
                    ...
                </dependencies>
        </profile>
    </profiles>

    <dependencies>
        ...
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        ...
    </dependencies>
</project>

我看不出这里有什么问题,也无法理解问题出在哪里,为什么Child-B 不将Child-A 作为依赖项。在 profile 内的父 POM 中,我尝试删除 dependencyManagement,但结果仍然相同 - Child-AChild-B 模块中未看到。显然没有配置文件一切正常。

【问题讨论】:

  • 最后一个 POM 是 child-A 还是 child-B 的 POM?您在文本中提到 child-B 将 child-A 作为依赖项,但 POM 本身将 child-B 作为依赖项
  • @AdrianShum 嘿,我修正了类型。最后一个 POM 是 Child-B,在内部配置文件中我包含 child-a,但它没有。
  • @Skyzer:虽然可以在&lt;profile/&gt; 中定义依赖关系,但使用它通常不是一个好主意,因为它可能会破坏可移植性并且事情不会很明显。此外,来自dependency:tree 的报告将仅显示在pom.xml 和激活的配置文件中定义的依赖关系,这意味着它们将仅涵盖其中一种情况。这通常是糟糕的设计,让项目继承这种做事方式就像传播疾病一样。 (只是我的 5 美分建议)。
  • @carlspring 好的,但是我将如何设计呢?例如,我需要为本地测试和应用程序服务器单独构建。在我的应用程序服务器中,一些依赖项应该标记为已提供,因为 Glassfish 已经有 jax-rs,而我的 child-a 依赖项是 Glassfish 中的共享库。因此,在默认情况下构建本地测试时,这些依赖项应包含在范围内
  • 相当有办法解决。我建议的一个是将它们分成几个项目。例如有一个包含您的主要代码的 MAIN 项目。一个为依赖于 MAIN 的应用服务器创建 WAR 的 WEB 项目,然后是另一个构建可执行 JAR 的本地项目,该 JAR 也依赖于 MAIN。另一种方法是利用程序集插件,创建不同的程序集,每个程序集都有不同的分类器。

标签: java maven


【解决方案1】:

在 Child-b 中,您将依赖项放入 child-b 而不是对 child-a 的依赖项

<dependency>
   <groupId>${project.parent.groupId}</groupId>
   <artifactId>child-b</artifactId>
</dependency>

而不是

<dependency>
   <groupId>${project.parent.groupId}</groupId>
   <artifactId>child-a</artifactId>
</dependency>

【讨论】:

  • 嘿,感谢您的回答,但是当我在这里发布带有示例 POM 的问题时,这是一个错字。我的架构最初已经按照您的建议进行,但问题仍未解决
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多