【问题标题】:Maven package names with multiple modules具有多个模块的 Maven 包名称
【发布时间】:2015-11-23 13:03:39
【问题描述】:

我正在努力学习更好地理解 Maven 的用法。 我对在多个模块中使用包名称的正确方法有疑问。

我会用一个例子来解释我的问题。

我们有以下项目。

project
    project-api             Interfaces (implemented by the modules)
    project-core            Logic
    project-persistence     Data (models, repository etc)
    project-utils           Utilities (hashing, calculating etc)
    project-gui             Graphical User Interface
    project-cli             Command Line Interface
    project-dist            Distribution (generate the JAR's together)

具有以下类。

project-api
    Repository              Interface

project-core
    AbstractRepository      Abstract class (implements Repository)
    Core                    Class

project-persistence
    SampleRepository        Class (extends AbstractRepository)
    Sample                  Class (model)

project-utils
    Calculator              Class

project-gui
    Demo                    Class (main)

现在,当我们有了这些东西后,我们将创建以下 Demo 类。

public class Demo() {

    public static void main(String[] args) {
        Core core = new Core();
        core.start();

        Repository sampleRepository = new SampleRepository();
        Sample sample = sampleRepository.get();

        Calculator.calc(sample);
    }

}

我们还需要导入包。 你应该在你的项目中使用哪个选项,或者如果选项不是听,那么正确的方法是什么?

选项 1

将所有模块包命名为与模块相同的名称:com.company.project.api

package com.company.project.gui

import com.company.project.api.persistence.repository.Repository;
import com.company.project.core.Core;
import com.company.project.persistence.repository.SampleRepository;
import com.company.project.persistence.models.Sample;
import com.company.project.utils.Calculator;

选项 2

将API模块包命名为与项目根名称相同:com.company.project

package com.company.project.gui

import com.company.project.persistence.repository.Repository;
import com.company.project.core.Core;
import com.company.project.persistence.repository.SampleRepository;
import com.company.project.persistence.models.Sample;
import com.company.project.utils.Calculator;

选项 3

将所有模块包命名为项目根包名:com.company.project

package com.company.project

import com.company.project.repository.Repository;
import com.company.project.Core;
import com.company.project.repository.SampleRepository;
import com.company.project.models.Sample;
import com.company.project.Calculator;

欢迎所有反馈、建议等。提前谢谢!

【问题讨论】:

  • 我通常坚持选项 1,因为我觉得它更清楚

标签: java maven package


【解决方案1】:

很好,您考虑了不同的选项,因为模块命名没有事实上的标准;这是个人喜好的问题。只要您保持一致并保持模块名称简洁,并按照 Maven naming conventions 获取 groupID 和 artifactID,您就可以开始了。

无论如何,我认为#1 是最好的选择。一般来说,尝试在 Java packagesclasses 与 Maven groupIDsartifactIDs 之间进行比较是一种很好的方法>.

【讨论】:

    【解决方案2】:

    通常,我假设一切都以“类”名称形式从项目父级开始。

    这是因为我认为带有 projectname_ 前缀的模块是用于开发/构建和项目组织相关目的的多模块中的一个。本质上意味着它在项目之外不是很有用,而且它的“API”根本不是一个受人尊敬的 API。现在,随着我们的继续,它可能会变得更有条理,但它并不是这样开始的。因此,当尚未成型时,我不会假设它具有真正的 java 包代码层次结构。

    话虽如此,假设我的多模块约定如下:

    • 项目名称-pom
      • 项目名称-父-pom
      • 项目名称-核心
      • 项目名称-应用程序

    所有这些都将使用根 com.example.projectname,至少对于每个开始的地方,尽管有些可能有 java 子包。

    现在随着项目的发展,我最终可能会创建一个子包,它应该是模块的主包。可能随着开发工作的继续,代码结构应该演变成什么变得很清楚。此时项目可能是:

    • 项目名称-pom:
      • 项目名称-父-pom
      • 项目名称-lib-pom
        • 项目名称-lib-parent-pom
        • projectname-lib-core:com.example.projectname.lib
        • projectname-lib-extra:com.example.projectname.lib.extras
      • 项目名称应用程序:com.example.projectname.app

    所以当事情刚刚开始并且非常平坦时,我从选项 3 开始,如果/当模块开始实际反映底层 java 包代码层次结构时,我在选项 1 结束。

    现在假设你有一个深思熟虑的 java 包代码层次结构,那么匹配 maven 模块是理想的,但是这需要更多的工作,如果你在事情解决之前就这样做了,它最终会比完全平坦更糟糕。好的等级胜过没有等级,但没有等级能打败坏的等级。

    【讨论】:

    • 我喜欢 lib/lib-parent/lib-core/lib-extra/app 命名规则
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 2012-05-03
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多