This appears to be correct, yes, although it's difficult to say for sure without more details of the code.
To answer your specific questions:
Yes, it is absolutely necessary to do this, because you cannot know that the packages are never going to be exported by another bundle. For one thing, bnd doesn't know this because it only looks at one bundle at a time. More importantly, there will probably be future versions of this bundle, in which case you are going to get multiple exports of the same packages. The
uses
constraint is then essential to ensure that users of the packages cannot get hold of an inconsistent set of types.To illustrate this, suppose you were to modify a class in one package, and then pass an instance of that class as a parameter into an old version of a class in another package. That old class would not understand the object you had given it. Actually the JVM itself will not let this happen, you will get a ClassCastException or a LinkageError... the OSGi
uses
constraint just prevents us from getting this far.I wouldn't say the packages are incorrectly defined as such. They are perhaps not well defined. The large number of
uses
constraints indicates that the packages are highly coupled to each other and might benefit from some reorganising, i.e. moving tightly-coupled classes/interfaces into the same package, maybe merging some packages, etc. Also you don't really want circular dependencies between packages because that makes it difficult to factor out packages into separate modules. There is nothing OSGi-specific about this advice, incidentally.