包含多个模块的Maven包名



我正在努力学习更好地理解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;

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

很好,你已经考虑了不同的选择,因为没有实际的模块命名标准;这是个人喜好的问题。只要您保持一致并保持模块名称简洁,并遵循Maven对groupID和artifactID的命名约定,您就可以开始了。

在任何情况下,我认为#1是最好的选择。一般来说,将Java 与Maven groupid artifactIDs进行类比是一种很好的方法。

通常我假设一切都以"类"名的形式从项目父项开始。

这是因为我认为具有projectname_前缀的模块是用于开发/构建和项目组织相关目的的多模块中的一个。本质上意味着它在项目之外不是很有用,而且它的"API"根本不是一个值得尊敬的API。现在,随着我们继续,它可能会变得更有条理,但它并不是这样开始的。因此,在还没有形成真正的java包代码层次结构时,我不假设它具有真正的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开始,如果/当模块开始实际反映底层java包代码层次结构时,我以选项1结束。

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

最新更新