The way you manage versions should probably depend on the kind of software you write. In any case whatever you export as a package is either an API (be it internal or public) or a library you want to share. You should only expose the minimum packages to achieve good decoupling.
Now as you mentioned there are two popular schemes of versioning:
- Versioning the whole bundle. This means every package export has the version of the bundle
- Versioning each package separately
Variant 1 is suitable if mainly your own application depends on the the shared packages. It is also popular for libraries as it is easy to add to existing libraries. The main advantage is that it is easy to achieve. Simply let the maven bundle plugin use its defaults. it works best if the bundles using you shared packages are released together with the bundle exporting the packages.
Variant 2 is good for APIs that are used by many loosely coupled other applications. Careful version management by package ensures that a change in the API has minimum impact on existing users. The price is that you need a lot more consideration and effort to manage the versions well. So a good example for this are the OSGi specs. They achieved a great level of compatibility while introducing new features over time.
I can share a case where versioning by bundle was not optimal. The first preview of the servlet API 3.0 only exported the 3.0 package version. So if this would have been the official release then every bundle that used the old API 2.5 would have had to switch as default import ranges always exclude the next major version. In the end the new and the old version was exported for all compatible packages. So that minimized the impact on users.
Btw. if you use the maven bundle plugin then the user of a bundle does not have to do much even in case of versioning by package. Bnd automatically looks into the version of each package and bases the import range on this information instead of the bundle version.
So basically think about the impact on users. Especially when you do a new major version. Test a user bundle compiled against the old version of your bundle.