Publish a bom from a multi-module-project

后端 未结 2 616
予麋鹿
予麋鹿 2021-02-14 02:27

We are a large company with about 2000 separate Java projects. For historic reasons, we do not have multi-module projects, but we would like to introduce them.

Logically

2条回答
  •  情话喂你
    2021-02-14 02:46

    I've never seen 2K of commercial Java projects, so will base my answer on how open source works:

    • Libraries shouldn't be grouped by people - they should be grouped by the problems that they solve. Often open source projects have multiple libs e.g. Jackson has jackson-databind, jackson-datatype-jsr310, etc. These libs tightly relate to each and may depend on each other.
    • Such groups shouldn't be too big. Some projects may have 1, others - 5 or 10. 50 libs in a group sounds way too much.
    • It's easier if libs in a group are released all at the same time (even if only one is updated). This makes it straightforward to keep track of versions in the apps that use multiple libs from a group.
    • There should be no dependencies between groups! And this is probably the most important rule. Deep hierarchy of libraries that depend on each other is not acceptable because now you need to keep compatibility between many projects and libs. This just doesn't scale. Which means there will be occasional copy-paste code between libs - this is the lesser evil.
    • There could be some exceptions to the last rule (maybe a lib that is used everywhere) but those must keep backward compatibility of the public API until there are no projects that depend on the old API. Such libs are very hard to maintain and it's better to opensource them.

    Standalone projects now can depend on libraries from the same or different groups, but because the version within the group is the same, it's easy to set it as a property just once. Alternatively:

    • You can look at import which allows importing sections from other POM files like parent POMs within a group (for some reason never worked for me).
    • Or at xxx-all modules - a module that depends on all other modules within group and thus when you depend on it, you also depend on others transitively.

提交回复
热议问题