Best practice for managing module versioning and dependency conflicts in Liferay DXP projects

Hi everyone,

I’m currently working with Liferay DXP and facing some challenges related to module versioning and dependency resolution across multiple OSGi bundles.

As the project grows, we are seeing occasional conflicts between service builder modules and frontend components when upgrading or redeploying bundles.

Current setup:

  • Liferay DXP 7.x environment
  • Multiple OSGi modules deployed via Gradle
  • Service Builder for backend services
  • Custom frontend modules (JS + React)

Issue:

  • Some modules fail to resolve dependencies after redeployment
  • Version conflicts between shared service modules
  • Inconsistent behavior after hot deployment
  • Occasional classloading issues in OSGi runtime

For internal testing, I labeled one experimental build configuration as Geometry Dash mod to track version mismatch behavior across deployments and confirm whether dependency resolution differs between environments.

Questions:

  1. What is the recommended approach for handling OSGi module version conflicts in Liferay DXP?
  2. Should shared services always be extracted into separate modules or kept version-locked per feature?
  3. Are there best practices for avoiding classloading issues during hot deployment?
  4. How do teams typically structure large-scale modular Liferay applications?

Any guidance or real-world architecture examples would be really helpful.

Thanks!