Eclipse is a maze of twisty build dependencies, all different. As best as I can tell there's the following:
- Build path: this affects compiling and possibly running your project. Split into separate widgets for dependent projects and for libraries/jars.
- Order and export: the same widget handles both the build order and "exporting" stuff to dependent projects, which may or may not actually achieve anything. Certainly the export option doesn't affect what appears in your .WAR.
- Deployment assembly: this doesn't affect your build path, but instead controls what ends up in your .WAR should you generate one. This is also present in non-web projects and mostly works, except not all items are propagated to the web projects (e.g. if A is a web project and B and C are normal Java projects with a dependency A -> B -> C, the dependency from B to C isn't picked up by A. So A needs to explicitly require projects B and C even though it doesn't directly use C). Oh, and if you have a web project then I lied and any direct dependencies here are actually included in your build path.
- Project references: the Java toolchain completely ignores this and makes no attempt to keep it synchronised with the other dependencies. Which is a shame, as the Eclipse interface uses this to work out which projects depend on other projects.
It all seems massively overcomplicated when what's really needed is a way to list libraries/projects and mark them as either "build-time", "run-time", or both. Then when compiling it uses just the items listed as build-time, and when running or creating .WARs it uses everything listed as run-time and includes transitive run-time dependencies as well.