我尝试并学习更好地理解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;
欢迎所有反馈,建议等。提前谢谢!
答案 0 :(得分:2)
很好,您已经考虑过不同的选项,因为模块命名没有事实上的标准;这是个人喜好的问题。只要您保持一致并保持模块名称简洁,并按照Maven naming conventions获取groupID和artifactID,您就可以了。
无论如何,我认为#1是最好的选择。通常,它是尝试在Java 包和类之间绘制并行到Maven groupIDs 和 artifactIDs的好方法。
答案 1 :(得分:0)
通常,我首先假设一切都以“类”名称形式在项目父级开始。
这是因为我认为带有 projectname _ 前缀的模块是用于开发/构建和项目组织相关目的的多模块中的一个。本质上意味着它在项目外部不是很有用,并且它的“ API”根本不是一个受人尊敬的API。现在,随着我们的进行,它可能会变得更加结构化,但是它并不是那样开始的。因此,当一个人尚未成型时,我就不会假设它具有真正的Java包代码层次结构。
话虽如此,假设我的多模块约定如下:
所有这些都将使用根 com.example.projectname ,至少在每个开始的地方,尽管有些可能带有java子包。
现在随着项目的发展,我最终可能会创建一个子包,该子包应该是模块的主包。随着开发工作的继续,很明显代码结构应该演变为什么。那时该项目可能是:
所以,当事情刚开始并且非常平坦时,我从选项3开始,如果/当模块开始实际反映底层Java包代码层次结构时,我就从选项1结束。
现在假设您有一个周到的Java程序包代码层次结构,那么使之匹配maven模块是理想的选择,但是这需要更多的工作,而且如果您在解决问题之前这样做,它最终会比完全平坦还要糟糕。良好的等级制不能胜过任何等级制,但是任何等级制都不能击败坏的等级制。