There are several levels of customization for applications:
(1) to the operating system
(2) for the application
(4) user specific
Java tries to reduce (1) as much as possible, on the whole successfully by abstracting out features. It does however not easily allow applications to optionally support features which are specific to particular operating systems.
Customization at the application level (whatever makes this application seem different from another application on the same platform) is a wide topic and perhaps a subject for another post.
Many applications have need of sitewide customization for logos, standard settings, etc.
Individual users may have the ability to alter UI layouts, change settings and properties.
Many applications allow different settings for different projects (single user, across a workgroup or company).
As there is no standard way of performing these customizations each application has its own implementation, with varying standards of usability, completeness and reusability. It would be nice to have one method that could be learnt and reused across projects and transferable when moving jobs.