1. A method for describing software components, comprising: creating one or more component descriptors, each component descriptor containing information, including both static and dynamic attributes, about a corresponding software component of a plurality of software components, wherein the information about a particular software component concerns a frequency with which the particular software component is employed in conjunction with software applications; creating one or more aggregate descriptors, each aggregate descriptor containing information about a relationship between a particular software component and at least one other software component, wherein the information about the relationship between a particular software component and at the least one other software component concerns a frequency with which the respective software components are employed in conjunction with each other; defining a component hierarchy based upon hierarchical interrelationships among software components and aggregate components; managing software and aggregate component lifecycles, access controls, interrelationships and versioning to maintain the component hierarchy; scoring software components based upon the component hierarchy; selecting a software component for inclusion into an application based upon the scoring of software components; modifying the component hierarchy based upon the selection of the software component and the selection of other software components for inclusion in the application.