Declaring element
@startuml
abstract        abstract
abstract class  "abstract class"
annotation      annotation
circle          circle
()              circle_short_form
class           class
diamond         diamond
<>              diamond_short_form
entity          entity
enum            enum
exception       exception
interface       interface
metaclass       metaclass
protocol        protocol
stereotype      stereotype
struct          struct
@endumlRelations between classes
Relations between classes are defined using the following symbols :
| Type | Symbol | Drawing | 
|---|---|---|
Extension  | 
`+<  | 
--+`  | 
image::extends01.png[]  | 
Composition  | 
  | 
image::sym03.png[]  | 
Aggregation  | 
  | 
It is possible to replace -- by .. to have a dotted
line.
Knowing those rules, it is possible to draw the following drawings:
@startuml
Class01 <|-- Class02
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
Class09 -- Class10
@endumlLabel on relations
It is possible to add a label on the relation, using :, followed
by the text of the label.
For cardinality, you can use double-quotes "" on each side
of the relation.
@startuml
Class01 "1" *-- "many" Class02 : contains
Class03 o-- Class04 : aggregation
Class05 --> "1" Class06
@endumlYou can add an extra arrow pointing at one object showing
which object acts on the other object, using < or >
at the begin or at the end of the label.
Using non-letters in element names and relation labels
If you want to use link::unicode[non-letters] in the class (or enum…) display name, you can either :
* Use the as keyword in the class definition to assign an alias
* Put quotes "" around the class name
@startuml
class "This is my class" as class1
class class2 as "It works this way too"
class2 *-- "foo/dummy" : use
@endumlIf an alias is assigned to an element, the rest of the file must refer to the element by the alias instead of the name.
Starting names with $
Note that names starting with $ cannot be hidden or removed later, because hide and remove command will consider the name a $tag instead of a component name. To later remove such elements they must have an alias or must be tagged.
@startuml
class $C1
class $C2 $C2
class "$C2" as dollarC2
remove $C1
remove $C2
remove dollarC2
@endumlAlso note that names starting with $ are valid, but to assign an alias to such element the name must be put between quotes "".
Adding methods
To declare fields and methods, you can use the symbol
: followed by the field’s or method’s name.
The system checks for parenthesis to choose between methods and fields.
@startuml
Object <|-- ArrayList
Object : equals()
ArrayList : Object[] elementData
ArrayList : size()
@endumlIt is also possible to group between brackets
{} all fields and methods.
Note that the syntax is highly flexible about type/name order.
@startuml
class Dummy {
  String data
  void methods()
}
class Flight {
   flightNumber : Integer
   departureTime : Date
}
@endumlYou can use {field} and {method} modifiers to
override default behaviour of the parser about fields and methods.
Defining visibility
When you define methods or fields, you can use characters to define the visibility of the corresponding item:
| Character | Icon for field | Icon for method | Visibility | 
|---|---|---|---|
  | 
image::private-field.png[]  | 
image::private-method.png[]  | 
  | 
  | 
image::protected-field.png[]  | 
image::protected-method.png[]  | 
  | 
  | 
image::package-private-field.png[]  | 
image::package-private-method.png[]  | 
  | 
  | 
image::public-field.png[]  | 
image::public-method.png[]  | 
  | 
You can turn off this feature using the skinparam classAttributeIconSize 0 command :
@startuml
skinparam classAttributeIconSize 0
class Dummy {
 -field1
 #field2
 ~method1()
 +method2()
}
@endumlVisibility indicators are optional and can be ommitted individualy without turning off the icons globally using skinparam classAttributeIconSize 0.
In such case if you’d like to use methods or fields that start with -, #, ~ or + characters such as a destructor in some languages for Dummy class ~Dummy(), escape the first character with a \ character:
Advanced class body
By default, methods and fields are automatically regrouped by PlantUML.
You can use separators to define your own way of ordering fields and methods.
The following separators are possible : -- .. == __.
You can also use titles within the separators:
@startuml
class Foo1 {
  You can use
  several lines
  ..
  as you want
  and group
  ==
  things together.
  __
  You can have as many groups
  as you want
  --
  End of class
}
class User {
  .. Simple Getter ..
  + getName()
  + getAddress()
  .. Some setter ..
  + setName()
  __ private data __
  int age
  -- encrypted --
  String password
}
@endumlNotes and stereotypes
Stereotypes are defined with the class keyword, << and >>.
You can also define notes using note left of , note right of , note top of , note bottom of
keywords.
You can also define a note on the last defined class using note left, note right,
note top, note bottom.
A note can be also define alone with the note
keywords, then linked to other objects using the .. symbol.
More on notes
It is also possible to use few HTML tags (See link::creole[Creole expression]) like :
- 
<b> - 
<u> - 
<i> - 
<s>,<del>,<strike> - 
<font color="#AAAAAA">or<font color="colorName"> - 
<color:#AAAAAA>or<color:colorName> - 
<size:nn>to change font size - 
<img src="file">or<img:file>: the file must be accessible by the filesystem 
You can also have a note on several lines.
You can also define a note on the last defined class using note left, note right,
note top, note bottom.
Note on field (field, attribute, member) or method
It is possible to add a note on field (field, attribute, member) or on method.
⚠ Constraint
- 
This cannot be used with
toporbottom(onlyleftandrightare implemented) - 
This cannot be used with namespaceSeparator
:: 
Note on method with the same name
@startuml
class A {
{static} int counter
+void {abstract} start(int timeoutms)
+void {abstract} start(Duration timeout)
}
note left of A::counter
  This member is annotated
end note
note right of A::"start(int timeoutms)"
  This method with int
end note
note right of A::"start(Duration timeout)"
  This method with Duration
end note
@endumlNote on links
It is possible to add a note on a link, just after the link definition, using note on link.
You can also use note left on link, note right on link, note top on link,
note bottom on link if you want to change the relative position of the note with the label.
Abstract class and interface
You can declare a class as abstract using abstract or abstract class keywords.
The class will be printed in italic.
You can use the interface, annotation and enum keywords too.
@startuml
abstract class AbstractList
abstract AbstractCollection
interface List
interface Collection
List <|-- AbstractList
Collection <|-- AbstractCollection
Collection <|- List
AbstractCollection <|- AbstractList
AbstractList <|-- ArrayList
class ArrayList {
  Object[] elementData
  size()
}
enum TimeUnit {
  DAYS
  HOURS
  MINUTES
}
annotation SuppressWarnings
annotation Annotation {
  annotation with members
  String foo()
  String bar()
}
@enduml[Ref. 'Annotation with members' Issue#458]
Hide attributes, methods…
You can parameterize the display of classes using the hide/show
command.
The basic command is: hide empty members. This
command will hide attributes or methods if they are empty.
Instead of empty members, you can use:
* empty fields or empty attributes for empty fields,
* empty methods for empty methods,
* fields or attributes which will hide fields, even if they are described,
* methods which will hide methods, even if they are described,
* members which will hide fields and methods, even if they are described,
* circle for the circled character in front of class name,
* stereotype for the stereotype.
You can also provide, just after the hide or show
keyword:
* class for all classes,
* interface for all interfaces,
* enum for all enums,
* <<foo1>> for classes which are stereotyped with foo1,
* an existing class name.
You can use several show/hide commands to define rules and
exceptions.
Hide, Remove or Restore tagged element or wildcard
You can put $tags (using $) on elements, then remove, hide or restore components either individually or by tags.
By default, all components are displayed:
But you can:
* hide $tag13 components:
- 
or
remove $tag13components: 
@startuml class C1 $tag13 enum E1 interface I1 $tag13 C1 -- I1 remove $tag13 @enduml
- 
or
remove $tag13 and restore $tag1components: 
@startuml class C1 $tag13 $tag1 enum E1 interface I1 $tag13 C1 -- I1 remove $tag13 restore $tag1 @enduml
- 
or
remove * and restore $tag1components: 
@startuml class C1 $tag13 $tag1 enum E1 interface I1 $tag13 C1 -- I1 remove * restore $tag1 @enduml
Hide or Remove unlinked class
By default, all classes are displayed:
But you can:
* hide @unlinked classes:
- 
or
remove @unlinkedclasses: 
@startuml class C1 class C2 class C3 C1 -- C2 remove @unlinked @enduml
[Adapted from QA-11052]
Specific Spot
Usually, a spotted character (C, I, E or A) is used for classes, interface, enum and abstract classes.
But you can define your own spot for a class when you define the stereotype, adding a single character and a color, like in this example:
Packages
You can define a package using the
package keyword, and optionally declare a background color
for your package (Using a html color code or name).
Note that package definitions can be nested.
Packages style
There are different styles available for packages.
You can specify them either by setting a default style with the command : skinparam packageStyle,
or by using a stereotype on the package:
@startuml
scale 750 width
package foo1 <> {
  class Class1
}
package foo2 <> {
  class Class2
}
package foo3 <> {
  class Class3
}
package foo4 <> {
  class Class4
}
package foo5 <> {
  class Class5
}
package foo6 <> {
  class Class6
}
@enduml     You can also define links between packages, like in the following example:
Namespaces
Starting with version 1.2023.2 (which is online as a beta), PlantUML handles differently namespaces and packages.
There won’t be any difference between namespaces and packages anymore: both keywords are now synonymous.
Automatic package creation
You can define another separator (other than the dot) using
the command : set separator ???.
You can disable automatic namespace creation using the command
set separator none.
Changing arrows orientation
By default, links between classes have two dashes -- and are vertically oriented.
It is possible to use horizontal link by putting a single dash (or dot) like this:
You can also change directions by reversing the link:
It is also possible to change arrow direction by adding left, right, up
or down keywords inside the arrow:
@startuml
foo -left-> dummyLeft
foo -right-> dummyRight
foo -up-> dummyUp
foo -down-> dummyDown
@endumlYou can shorten the arrow by using only the first character of the direction (for example, -d- instead of
-down-)
or the two first characters (-do-).
Please note that you should not abuse this functionality : Graphviz gives usually good results without tweaking.
And with the link::use-case-diagram#d551e48d272b2b07[left to right direction] parameter:
Association classes
Association on same class
@startuml
class Station {
    +name: string
}
class StationCrossing {
    +cost: TimeInterval
}
<> diamond
StationCrossing . diamond
diamond - "from 0..*" Station
diamond - "to 0..* " Station
@enduml[Ref. Incubation: Associations]
Skinparam
You can use the link::skinparam[skinparam] command to change colors and fonts for the drawing.
You can use this command : * In the diagram definition, like any other commands, * In an link::preprocessing[included file], * In a configuration file, provided in the link::command-line[command line] or the link::ant-task[ANT task].
Skinned Stereotypes
You can define specific color and fonts for stereotyped classes.
@startuml
skinparam class {
BackgroundColor PaleGreen
ArrowColor SeaGreen
BorderColor SpringGreen
BackgroundColor<> Wheat
BorderColor<> Tomato
}
skinparam stereotypeCBackgroundColor YellowGreen
skinparam stereotypeCBackgroundColor<< Foo >> DimGray
Class01 <>
Class03 <>
Class01 "1" *-- "many" Class02 : contains
Class03 o-- Class04 : aggregation
@enduml    Color gradient
You can declare individual colors for classes, notes etc using the # notation.
You can use standard color names or RGB codes in various notations, see link::color[Colors].
You can also use color gradient for background colors, with the following syntax:
two colors names separated either by:
* |,
* /,
* \, or
* -
depending on the direction of the gradient.
For example:
Help on layout
Sometimes, the default layout is not perfect…
You can use together keyword to group some classes together :
the layout engine will try to group them (as if they were in the same package).
You can also use hidden links to force the layout.
Splitting large files
Sometimes, you will get some very large image files.
You can use the page (hpages)x(vpages) command to split the generated image into several files :
hpages is a number that indicated the number of horizontal pages,
and vpages is a number that indicated the number of vertical pages.
You can also use some specific skinparam settings to put borders on splitted pages (see example).
@startuml
' Split into 4 pages
page 2x2
skinparam pageMargin 10
skinparam pageExternalColor gray
skinparam pageBorderColor black
class BaseClass
namespace net.dummy #DDDDDD {
    .BaseClass <|-- Person
    Meeting o-- Person
    .BaseClass <|- Meeting
}
namespace net.foo {
  net.dummy.Person  <|- Person
  .BaseClass <|-- Person
  net.dummy.Meeting o-- Person
}
BaseClass <|-- net.unused.Person
@endumlBracketed relations (linking or arrow) style
Line style
It’s also possible to have explicitly bold, dashed, dotted, hidden or plain relation, links or arrows:
- 
without label
 
@startuml
title Bracketed line style without label
class foo
class bar
bar1 : [bold]
bar2 : [dashed]
bar3 : [dotted]
bar4 : [hidden]
bar5 : [plain]
foo --> bar
foo -[bold]-> bar1
foo -[dashed]-> bar2
foo -[dotted]-> bar3
foo -[hidden]-> bar4
foo -[plain]-> bar5
@enduml- 
with label
 
@startuml
title Bracketed line style with label
class foo
class bar
bar1 : [bold]
bar2 : [dashed]
bar3 : [dotted]
bar4 : [hidden]
bar5 : [plain]
foo --> bar          : ∅
foo -[bold]-> bar1   : [bold]
foo -[dashed]-> bar2 : [dashed]
foo -[dotted]-> bar3 : [dotted]
foo -[hidden]-> bar4 : [hidden]
foo -[plain]-> bar5  : [plain]
@enduml[Adapted from QA-4181]
Line thickness
@startuml
title Bracketed line thickness
class foo
class bar
bar1 : [thickness=1]
bar2 : [thickness=2]
bar3 : [thickness=4]
bar4 : [thickness=8]
bar5 : [thickness=16]
foo --> bar                 : ∅
foo -[thickness=1]-> bar1   : [1]
foo -[thickness=2]-> bar2   : [2]
foo -[thickness=4]-> bar3   : [4]
foo -[thickness=8]-> bar4   : [8]
foo -[thickness=16]-> bar5  : [16]
@enduml[Ref. QA-4949]
Mix
@startuml
title Bracketed line style mix
class foo
class bar
bar1 : [#red,thickness=1]
bar2 : [#red,dashed,thickness=2]
bar3 : [#green,dashed,thickness=4]
bar4 : [#blue,dotted,thickness=8]
bar5 : [#blue,plain,thickness=16]
foo --> bar                             : ∅
foo -[#red,thickness=1]-> bar1          : [#red,1]
foo -[#red,dashed,thickness=2]-> bar2   : [#red,dashed,2]
foo -[#green,dashed,thickness=4]-> bar3 : [#green,dashed,4]
foo -[#blue,dotted,thickness=8]-> bar4  : [blue,dotted,8]
foo -[#blue,plain,thickness=16]-> bar5  : [blue,plain,16]
@endumlChange relation (linking or arrow) color and style (inline style)
You can change the link::color[color] or style of individual relation or arrows using the inline following notation:
- 
#color;line.[bold|dashed|dotted];text:color 
@startuml
class foo
foo --> bar : normal
foo --> bar1 #line:red;line.bold;text:red  : red bold
foo --> bar2 #green;line.dashed;text:green : green dashed
foo --> bar3 #blue;line.dotted;text:blue   : blue dotted
@enduml[See similar feature on link::deployment-diagram#0b2e57c3d4eafdda[deployment]]
Change class color and style (inline style)
You can change the link::color[color] or style of individual class using the two following notations:
- 
#color ##[style]color 
With background color first (#color), then line style and line color (##[style]color )
@startuml
abstract   abstract
annotation annotation #pink ##[bold]red
class      class      #palegreen ##[dashed]green
interface  interface  #aliceblue ##[dotted]blue
@enduml[Ref. QA-1487]
- 
#[color|back:color];header:color;line:color;line.[bold|dashed|dotted];text:color 
@startuml
abstract   abstract
annotation annotation #pink;line:red;line.bold;text:red
class      class      #palegreen;line:green;line.dashed;text:green
interface  interface  #aliceblue;line:blue;line.dotted;text:blue
@endumlFirst original example:
@startuml
class bar #line:green;back:lightblue
class bar2 #lightblue;line:green
class Foo1 #back:red;line:00FFFF
class FooDashed #line.dashed:blue
class FooDotted #line.dotted:blue
class FooBold #line.bold
class Demo1 #back:lightgreen|yellow;header:blue/red
@enduml[Ref. QA-3770]
Arrows from/to class members
@startuml
class Foo {
+ field1
+ field2
}
class Bar {
+ field3
+ field4
}
Foo::field1 --> Bar::field3 : foo
Foo::field2 --> Bar::field4 : bar
@enduml[Ref. QA-3636]
@startuml
left to right direction
class User {
  id : INTEGER
  ..
  other_id : INTEGER
}
class Email {
  id : INTEGER
  ..
  user_id : INTEGER
  address : INTEGER
}
User::id *-- Email::user_id
@enduml[Ref. QA-5261]
Grouping inheritance arrow heads
Display JSON Data on Class or Object diagram
Simple example
@startuml
class Class
object Object
json JSON {
   "fruit":"Apple",
   "size":"Large",
   "color": ["Red", "Green"]
}
@enduml[Ref. QA-15481]
For another example, see on link::json#jinnkhaa7d65l0fkhfec[JSON page].