Maven多模块项目的包名命名规范

5
我希望能够帮助您更好地理解和使用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)

现在,我们有了这些东西后,将创建以下演示类。
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
我通常选择选项1,因为我发现它更清晰。 - Koby
2个回答

2

很好,你考虑了不同的选项,因为没有模块命名的标准;这是个人偏好的问题。只要你保持一致并使你的模块名称简洁,并遵循Maven naming conventions中的groupID和artifactID,你就可以行动。

不管怎样,我认为选项 #1 是最好的选择。通常,尝试在Java packagesclasses之间,以及Maven groupIDsartifactIDs之间建立类比是一个不错的方法。


0

通常我会假设所有东西都以“类”名称形式从项目父级开始。

这是因为我认为带有projectname_前缀的模块是多模块开发/构建和项目组织相关目的中的一个单一模块。基本上意味着它在项目外部没有什么用处,而且它的“API”根本不是一个可尊重的API。现在,随着我们的进展,它可能会变得更加结构化,但它并不是从那样开始的。因此,当一个真正的Java包代码层次结构还没有形成时,我不会假设它有一个。

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

  • projectname-pom
    • projectname-parent-pom
    • projectname-core
    • projectname-app

所有这些都将使用根com.example.projectname,至少对于每个模块的起点来说是这样,尽管有些可能有Java子包。

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

  • projectname-pom:
    • projectname-parent-pom
    • projectname-lib-pom
      • projectname-lib-parent-pom
      • projectname-lib-core: com.example.projectname.lib
      • projectname-lib-extra: com.example.projectname.lib.extras
    • projectname-app: com.example.projectname.app

如果事情刚开始,还很平坦,我会从选项3开始,最终到达选项1,如果/当模块开始实际反映底层的Java包代码层次结构。

现在假设您有一个周到的Java包代码层次结构,那么使其与Maven模块匹配是理想的,但这需要更多的工作,如果在事情没有定型之前就这样做,结果比完全平坦还要糟糕。 良好的层次结构胜过没有层次结构,但没有层次结构胜过糟糕的层次结构。


我喜欢 lib / lib-parent / lib-core / lib-extra / app 命名规则。 - ThomasFrancart
为了避免包冲突(如果以后使用Java9模块),我建议避免在模块之间嵌套包,而是将所有内容分开,如下:
  • 项目名-lib-核心:com.example.项目名.lib.核心
- undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接