I package sono contenitori, in generale, di elementi UML (spesso classi). Un package definisce un namespace, quindi i nomi degli elementi al suo interno devono essere diversi.
Graficamente, un package può essere rappresentato con vari livelli di dettaglio, come ad esempio:
I contenuti di un package si possono indicare anche con la notazione delle relazioni di annidamento:
I package permettono di modellare sistemi complessi in modo gerarchico.
Ciascun package deve avere:
In questo modo, esso fornisce una vista relativa a un determinato aspetto del problema, il quale può allora essere analizzato, sviluppato, ecc.. in modo (per quanto possibile) indipendente dal resto del problema.
Una relazione tra due package "riassume" relazioni multiple dello stesso tipo tra i singoli elementi che appartengono a tali package. In particolare, si possono definire relazioni di:
Esistono poi alcune relazioni che riguardano direttamente i package:
Annidamento: un package può contenere altri package.
Merge: è una relazione molto simile alla generalizzazione, con la quale i contenuti di due package vengono combinati in un unico package. Ad esempio, con il merge raffigurato nel diagramma seguente, il package A acquisisce anche le caratteristiche di B
Esso si può usare quando package diversi contengono elementi che hanno gli stessi nomi e rappresentano gli stessi concetti, ma (spesso) con definizioni diverse per scopi diversi.
Il merge permette di definire "delta" in package diversi e combinarli per ottenere un singolo package con tutte le caratteristiche necessarie.
Le relazioni di dipendenza tra package devono essere esplicite: non è sufficiente che gli elementi di un package siano pubblici perchè questi possano essere usati da altri package. Inoltre, le dipendenze non sono transitive: se il package A può accedere a B, e B può accedere a C, non è detto che A possa accedere a C.