I am in the process of designing a build system and the directory structure for a large software system developed with Java EE 5. The build system will be implemented using ant.

We have multiple different services, which are grouped thematically. Each service offers either a web service or EJBs. Each service runs on a dedicated application server cluster. Thus, we have multiple clusters and some of these clusters can be grouped logically by topics.

I did read generic definitions and examples, but I am still confused about the Java EE terminology:

* What is a Java EE application? And thus, what is the content of an EAR file?
* What is a Java EE Project? (the term is used by Netbeans as well as in the Java Blueprints Guidelines Project Conventions for Enterprise Applications)

Do I have to put all EJB and WAR-module-package-files into one single EAR, so that this single EAR contains our complete system?

Or do I put each group of services into one EAR, despite the fact that these services are only grouped logically but not technically?

Or do I assemble a separate EAR for each service, i.e. most often only containing a single EJB jar file and sometimes and EJB and a WAR file?

Or do I dismiss the concept of applications and merely build EJB and WAR files, so that I have exactly one deployment file for each application server cluster?

I guess, my main question is: What are the advantages of packaging EAR files?

As I see it at the moment, there is only the need for EAR-EJB and WAR files and additionally the concept of nested subproject in the ant-build-system and the directory structure of our source?

Edit: Thanks a lot for the answers! It seems to me that an application packaged into an ear is a rather atomic subsystem. So I guess, that I will have a nested subproject-structure (only logical, visible only to the build system and in the directory structure of the source) and a rather large amount of EARs, each of those containing mostly only one ejb-jar and/or war module and implementing a single service (which is deployed on a single application server cluster).