Reporting my experience setting up a module-info.java for a project using FOP.
By way of background, here's the maven dependency tree [INFO] +- org.apache.xmlgraphics:fop:jar:2.5:compile [INFO] | +- org.apache.xmlgraphics:fop-util:jar:2.5:compile [INFO] | +- org.apache.xmlgraphics:fop-events:jar:2.5:compile [INFO] | | +- com.thoughtworks.qdox:qdox:jar:1.12:compile [INFO] | | \- org.apache.ant:ant:jar:1.8.2:compile [INFO] | | \- org.apache.ant:ant-launcher:jar:1.8.2:compile [INFO] | \- org.apache.xmlgraphics:fop-core:jar:2.5:compile [INFO] | +- org.apache.xmlgraphics:batik-anim:jar:1.13:compile [INFO] | | +- org.apache.xmlgraphics:batik-css:jar:1.13:compile [INFO] | | +- org.apache.xmlgraphics:batik-dom:jar:1.13:compile [INFO] | | +- org.apache.xmlgraphics:batik-ext:jar:1.13:compile [INFO] | | +- org.apache.xmlgraphics:batik-parser:jar:1.13:compile [INFO] | | +- org.apache.xmlgraphics:batik-shared-resources:jar:1.13:compile [INFO] | | +- org.apache.xmlgraphics:batik-svg-dom:jar:1.13:compile [INFO] | | \- org.apache.xmlgraphics:batik-util:jar:1.13:compile [INFO] | | +- org.apache.xmlgraphics:batik-constants:jar:1.13:compile [INFO] | | \- org.apache.xmlgraphics:batik-i18n:jar:1.13:compile [INFO] | +- org.apache.xmlgraphics:batik-awt-util:jar:1.13:compile [INFO] | +- org.apache.xmlgraphics:batik-bridge:jar:1.13:compile [INFO] | | +- org.apache.xmlgraphics:batik-script:jar:1.13:compile [INFO] | | \- org.apache.xmlgraphics:batik-xml:jar:1.13:compile [INFO] | +- org.apache.xmlgraphics:batik-extension:jar:1.13:compile [INFO] | +- org.apache.xmlgraphics:batik-gvt:jar:1.13:compile [INFO] | +- org.apache.xmlgraphics:batik-transcoder:jar:1.13:compile [INFO] | | \- org.apache.xmlgraphics:batik-svggen:jar:1.13:compile [INFO] | +- javax.servlet:servlet-api:jar:2.2:compile [INFO] | +- org.apache.pdfbox:fontbox:jar:2.0.16:compile [INFO] | +- javax.media:jai-core:jar:1.1.3:compile [INFO] | \- com.sun.media:jai-codec:jar:1.1.3:compile The fop jar packages fop-util, fop-events, and fop-core, so you want either the all-in-one jar, or the other 3 jars, but not both. If you have both, you'll get an error like: The package org.apache.fop.configuration is accessible from more than one module: fop, fop.core So which way to go, the fop all-in-one jar. or the other three? The answer for now at least is to use the fop all-in-one jar. If you were to try using the other three jars as modules, you get: Error occurred during initialization of boot layer java.lang.module.ResolutionException: Modules fop.core and fop.events export package org.apache.fop.tools to module error.prone.annotations So here are the requires statements I ended up with: requires fop; // deps of org.apache.xmlgraphics:fop-core:jar:2.5 requires batik.anim; requires batik.css; requires batik.dom; requires batik.ext; requires batik.parser; requires batik.shared.resources; requires batik.svg.dom; requires batik.util; requires batik.constants; requires batik.i18n; requires batik.awt.util; requires batik.bridge; //requires batik.script; requires batik.extension; requires batik.gvt; requires batik.transcoder; requires batik.svggen; requires org.apache.fontbox; // has an Automatic-Module-Name in its MANIFEST.MF //requires jai.core; //requires jai.codec; batik.script is commented out, because including it results in the following error: Error occurred during initialization of boot layer java.lang.module.FindException: Unable to derive module descriptor for /home/jharrop/.m2/repository/org/apache/xmlgraphics/batik-script/1.13/batik-script-1.13.jar Caused by: java.lang.module.InvalidModuleDescriptorException: Provider class org.apache.batik.bridge.RhinoInterpreterFactory not in module Using fop all-in-one but excluding the duplicate classes is a bit of a pain from a Maven point of view, since you then have to explicitly include the fop-core deps. Here is what I ended up with: <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop</artifactId> <version>2.5</version> <exclusions> <!-- exclude duplicate classes --> <exclusion> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop-util</artifactId> </exclusion> <exclusion> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop-events</artifactId> </exclusion> <!-- other --> <exclusion> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> </exclusion> <exclusion> <groupId>xml-apis</groupId> <artifactId>xml-apis-ext</artifactId> </exclusion> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> <exclusion> <groupId>xalan</groupId> <artifactId>xalan</artifactId> </exclusion> <exclusion> <groupId>xalan</groupId> <artifactId>serializer</artifactId> </exclusion> </exclusions> </dependency> <!-- so we need to include fop-core deps directly --> <!-- batik deps --> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-anim</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-awt-util</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-bridge</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-extension</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-gvt</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-transcoder</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.19</version> </dependency> <!-- <dependency> <groupId>javax.media</groupId> <artifactId>jai-core</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>com.sun.media</groupId> <artifactId>jai-codec</artifactId> <version>1.1.3</version> </dependency> -->