pom.xml dependencies
This dependency graph shows all FOLIO software libraries that are referenced from at least one pom.xml file of the platform-complete modules. An arrow X → Y means that module X depends on module Y. Last updated: February 2023.
It lists all maven/pom.xml based FOLIO code libraries and suggests in which order they should be released for a platform flower release (for example Poppy): Bottom row on day 1, second row from bottom on day 2, etc.
The color indicates the development team, see FOLIO Module/JIRA project-Team-PO-Dev Lead responsibility matrix.
Why are many modules missing from the graph? It only shows code libraries to reduce the noise. It doesn't shows modules that only use FOLIO code libraries but don't provide some FOLIO code library.
Why are mod-configuration and several other mod-* modules shown? A released mod-configuration version always consists of two maven sub-modules: mod-configuration-server (the actual back-end module) and mod-configuration-client, a code library used by many other modules to access mod-configuration-server.
Generate graph
How to generate the dependency graph:
set -e get-install() { wget https://raw.githubusercontent.com/folio-org/platform-complete/master/install.json -O install.json } modules() { MODULES=` cat install.json \ | jq '.[].id' \ | sed '/^"folio_/d; # remove front-end modules s/"//; # remove heading quote s/-[[:digit:]].*//; # remove the version number suffix ' ` } pull() { ln -s Net-Z3950-FOLIO mod-z3950 >/dev/null 2>&1 || true for MODULE in $MODULES ; do echo $MODULE cd $MODULE git checkout master git pull cd .. done } dependencytrees() { for MODULE in $MODULES ; do cd $MODULE if [ -e pom.xml ] then echo "$MODULE" >&2 # -Dverbose disables -DoutputType=dot so we cannot use the latter mvn dependency:tree -B -Dverbose "-Dincludes=org.folio,org.folio.*,org.olf,org.olf.*" fi cd .. done } convert() { grep -E ' \(?(org\.folio|org\.folio\.[^:]+|org.olf|org\.olf\.[^:]+):[^:]+:jar:' \ | sed -E 's/org.folio:(cql2pgjson|cql2pgjson-cli|dbschema|domain-models-api-aspects|domain-models-api-interfaces|domain-models-interface-extensions|domain-models-maven-plugin|domain-models-runtime|domain-models-runtime-it|postgres-runner|postgres-testing|rules|testing|util):/org.folio:RMB:/g' \ | sed -E 's/org.folio:(vertx-lib|vertx-lib-pg-testing|mod-example):/org.folio:folio-vertx-lib:/g' \ | sed -E 's/:okapi-[^:]+:/:okapi:/g' \ | sed -E 's/:([^:]+)-(server|client):/:\1:/g' \ | sed -E 's/:(mod-erm-usage-counter|mod-erm-usage-harvester|folio-service-tools)[^:]+:/:\1:/g' \ | gawk 'match($0, /^[^:]{6} [^: ]+:([^:]+):/, arr) { L1 = "\"" arr[1] "\"" } match($0, /^[^:]{8}- [^: ]+:([^:]+):/, arr) { L2 = "\"" arr[1] "\""; print L1 " -> " L2 } match($0, /^[^:]{11}- [^: ]+:([^:]+):/, arr) { L3 = "\"" arr[1] "\""; print L2 " -> " L3 } match($0, /^[^:]{14}- [^: ]+:([^:]+):/, arr) { L4 = "\"" arr[1] "\""; print L3 " -> " L4 } match($0, /^[^:]{17}- [^: ]+:([^:]+):/, arr) { L5 = "\"" arr[1] "\""; print L4 " -> " L5 } match($0, /^[^:]{20}- [^: ]+:([^:]+):/, arr) { L6 = "\"" arr[1] "\""; print L5 " -> " L6 } match($0, /^[^:]{23}- [^: ]+:([^:]+):/, arr) { L7 = "\"" arr[1] "\""; print L6 " -> " L7 } match($0, /^[^:]{26}- [^: ]+:([^:]+):/, arr) { L8 = "\"" arr[1] "\""; print L7 " -> " L8 } match($0, /^[^:]{29}- [^: ]+:([^:]+):/, arr) { L9 = "\"" arr[1] "\""; print L8 " -> " L9 }' \ | grep -v -E '"([^"]+)" -> "\1"' \ | sed 's/"data-import-processing-core"/"data-import-\\nprocessing-core"/g' \ | sed 's/"data-import-utils"/"data-import-\\nutils"/g' \ | sed 's/"edge-common-spring"/"edge-common-\\nspring"/g' \ | sed 's/"folio-custom-fields"/"folio-custom-\\nfields"/g' \ | sed 's/"folio-di-support"/"folio-di-\\nsupport"/g' \ | sed 's/"folio-holdingsiq"/"folio-\\nholdingsiq"/g' \ | sed 's/"folio-kafka-wrapper"/"folio-kafka-\\nwrapper"/g' \ | sed 's/"folio-liquibase-util"/"folio-liquibase-\\nutil"/g' \ | sed 's/"folio-service-tools"/"folio-service-\\ntools"/g' \ | sed 's/"folio-vertx-lib"/"folio-\\nvertx-lib"/g' \ | sed 's/"mod-configuration"/"mod-\\nconfiguration"/g' \ | sed 's/"mod-data-import-converter-storage"/"mod-data-import-\\nconverter-storage"/g' \ | sed 's/"mod-di-converter-storage"/"mod-di-converter-\\nstorage"/g' \ | sed 's/"mod-source-record-storage"/"mod-source-\\nrecord-storage"/g' \ | sed 's/"mod-source-record-manager"/"mod-source-\\nrecord-manager"/g' \ | sort -u } # Filter reused libraries, we don't want modules that are not used by any other module filter() { DEPENDENCIES=`cat` LIBRARIES=`echo "$DEPENDENCIES" | sed -E 's/.* -> ("[^"]+").*/\1 ->/' | sort -u` echo "$DEPENDENCIES" | grep -F -f <(echo "$LIBRARIES") } wrap() { echo "digraph {" echo "graph [ rankdir=TB ]" echo "node [ shape=rectagle ]" cat echo "}" } get-install modules pull dependencytrees > dependencytrees cat dependencytrees | convert | filter | wrap > complete.graphviz
Use Graphviz to generate the visualisation, for example https://dreampuf.github.io/GraphvizOnline
Use https://www.yworks.com/yed-live/ to manually move nodes and add color.