【问题标题】:Exclude maven sub modules dependencies from top level module从顶级模块中排除 maven 子模块依赖项
【发布时间】:2018-08-02 17:52:56
【问题描述】:

我创建了一个包含三个模块的 maven 父项目:

  • 数据层模块
  • data-service-module(使用数据层模块)
  • web-module(使用 data-services-module)

这是来自父 pom.xml 的 sn-p :

<groupId>org.mygroup</groupId>
<artifactId>myArtifact</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>

<modules>
  <module>data-layer-module</module>
  <module>data-service-module</module>
  <module>web-module</module>
</modules> 

data-layer-module pom.xml 不包含对其他模块的依赖项(它仅包含其外部依赖项)。

data-service-module 在其pom.xml 中对data-layer-module 有依赖关系:

<dependencies>
      <dependency>
          <groupId>org.mygroup</groupId>
          <artifactId>data-layer-module</artifactId>
          <version>1.0-SNAPSHOT</version>
      </dependency>
</dependencies>

web-module 依赖于data-service-module

<dependency>
    <groupId>org.mygroup</groupId>
    <artifactId>data-service-module</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

一切都很好,但我不希望web-module 可以访问data-layer-module。我需要强制执行三层网络服务数据模型。此配置并非如此。
我显然尝试手动将其从 web-module pom.xml 中排除:

<dependency>
    <groupId>org.mygroup</groupId>
    <artifactId>data-service-layer</artifactId>
    <version>1.0-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>org.mygroup</groupId>
            <artifactId>data-layer-module</artifactId>
        </exclusion>
    </exclusions>
</dependency>  

但这会导致编译错误,因为data-service-module 找不到它的data-layer-module 依赖项。

这个配置怎么做?

【问题讨论】:

    标签: java maven


    【解决方案1】:

    如果 web 模块要在与数据服务层相同的 jvm 中运行,那么对数据层模块的临时依赖是必要的 - 这就是您添加的排除项导致应用程序失败的原因。

    可以考虑做一个简单的api,比如data-service-layer-api,明显不依赖data-layer-module,由data-service-layer正确实现。

    您仍然可以使用多模块 maven 项目,但现在您将拥有 2 个工件 - 一个 Web 模块和一个数据服务,它们必须分开部署。

    这基本上是严格依赖分析和项目复杂性之间的权衡。

    【讨论】:

    • 创建一个data-service-layer-api意味着添加一个新层?总结一下:web-module 与 data-service-layer-api 通信,data-service-layer-api 与 data-service-module 通信,data-service-module 又与 data-layer-module 通信。你是这个意思吗 ?这如何防止传递依赖?
    • 不,是这样的:web-module 通过 api 与 data-service-layer 进行通信。它不了解数据层。数据服务层是单独运行的,并且知道数据层。
    • 我会试试的。如果您知道 github 上的任何示例,请告诉我。
    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多