If I was you, I will organize my code base as the following way:
1. if the server module and common module developed/maintained by the same team, I will create a build (that is, a directory tree) contain two projects, one for the server moudule and one for the common module:
projectRoot
project --- the directory to defined the build
server -- the source directory contains the source for the server moudle
common -- the source directory contians the source for the common module
build.sbt --- if you do not want to place your build definition in the above project directory, you could define it here.
You 'd better have a root project definition in your build definition.
On the Sbt console, you could run "projects" task to list your projects in the build
a) you could build all projects (compile/test/pacakge/publish) at the root project, or
b) run "project <project-name>" to build a specific project, for example, run "project server" to go to the server project, then build only this project, for examle, only publish this project's artifacts
Then any other teams for the client module can reference the server module as the 3rd dependencies in their projects (for transitive dependency, common module is referenced automatically), like you reference 3rd library in your build.
if you also want to develop your own client module:
1) if you want to share the source code of the client module to public, you could defined it as a separate build (I say a separate build).
2) if you do not want to share your client source code, you may add your client module as a PROJECT to your above build (that is, now the build contains 3 projects).
If your common module is developed internally by a different team, and you want to reference the source as a dependency in your build, see ProjectRef (google it for detail).
https://github.com/guofengzh/mp-aggr is a simpe demo for it.
Hope the above is helpful to you.