Maven包名称包含多个模块

时间:2015-08-28 19:15:10

标签: java maven package

我尝试并学习更​​好地理解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

将所有模块包命名为与模块相同的名称-name: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;

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

2 个答案:

答案 0 :(得分:2)

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

无论如何,我认为#1是最好的选择。通常,它是尝试在Java 之间绘制并行到Maven groupIDs artifactIDs的好方法。

答案 1 :(得分:0)

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

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

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

  • projectname-pom
    • projectname-parent-pom
    • 项目名称核心
    • 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
    • 项目名称应用: com.example.projectname.app

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

现在假设您有一个周到的Java程序包代码层次结构,那么使之匹配maven模块是理想的选择,但是这需要更多的工作,而且如果您在解决问题之前这样做,它最终会比完全平坦还要糟糕。良好的等级制不能胜过任何等级制,但是任何等级制都不能击败坏的等级制。