I'm developing a really simple client-server CRM system in Java, which I call Crème. The architecture is as follows:


The client will be a command-line program, and will be called creme. The main idea is that it will have subcommands (like git) which will let the user manage the products and customers, in a REST-like fashion. For example:

$ creme products list


$ creme customers show 000001

There is a possibility that I may create a GUI client in the future, but that would be a nice-to-have after everything else is done.


My intention is to write three different servers, all in Java. These three servers will be fully compatible; this means that the client will be able to talk to any of them, and all of them will handle data storage in exactly the same way.

Classic Java EE server

The first server will be written in classic Java EE fashion: it will use EJBs to expose the functionality to the client, and will talk to the DB using JPA. This one will need to be deployed to a full application server, like Wildfly or Glassfish.

Spring Boot server

The second server will be written using Spring Boot, and will be launched as a standalone application. The intention here is to be able to use this second server in microservice deployments.

Microprofile server

The third server will be written using the Eclipse Microprofile, either with a compatible framework (probably Thorntail), or by using something really similar, like Micronaut. The intention of this server is to be able to scale up really well in Kubernetes (et. al.) environments.

Data storage

The CRM data will be saved in PostgreSQL, using well-normalized tables. At first glance, this system only needs three tables:

  1. Customers
  2. Products
  3. Customer-product relationship

However, I can expect more tables as the project evolves


The project will use Maven as the build tool. I expect to create the following artifacts: