The goal of Pi4J V.2 is to provide a solid base with all required “minimal functionality” while at the same time, promote third-party development and extensibility, thus enabling developers to build and maintain their extensions outside of the Pi4J core projects codebase.
This will enable us to deliver a stable, fully tested framework as the number of features inside of Pi4J can be limited and support for specific I/O hardware can be provided with an extension for Pi4J.
More info about how this extensibility is achieved:
Plugins are extensible service modules that interact with or augment the Pi4J infrastructure. The most common plugins are I/O Providers and Platforms. Other plugin examples could be a web app to view/control the Pi4J runtime state/status, some third-party observer to the Pi4J runtime state/status,…
Plugins are implemented as Java modules using Service Provider Interfaces (SPI).
Plugins must declare their pluggable interface in their “module-info.java” config file. Example from the Raspberry plugin:
module com.pi4j.plugin.raspberrypi {
requires com.pi4j;
exports com.pi4j.plugin.raspberrypi;
exports com.pi4j.plugin.raspberrypi.platform;
exports com.pi4j.plugin.raspberrypi.provider.gpio.digital;
exports com.pi4j.plugin.raspberrypi.provider.pwm;
exports com.pi4j.plugin.raspberrypi.provider.serial;
exports com.pi4j.plugin.raspberrypi.provider.spi;
exports com.pi4j.plugin.raspberrypi.provider.i2c;
provides com.pi4j.extension.Plugin with RaspberryPiPlugin;
}
ServiceLoader overview by Piotr Mińkowski.