Jde to docela snadno:
- klient si vytvoří třídu, která implementuje určené rozhraní
- klient si třídu zkompiluje, vytvoří jar soubor a nahraje ho do aplikace
- v konfiguraci té aplikace uvede, jaká třída se má použít jako ten plugin
- aplikace pak už sama pomocí reflexe vyhledá třídu, vytvoří její instanci a volá libovolné metody rozhraní
Pokud by vadila tvorba jar souboru, lze javu zkompilovat a použít za běhu, používal jsem na to Janino
http://unkrig.de/w/Janino V novější jave to už jde udělat bez pomoci externích knihoven (nezkoušel jsem).
Nebo jde použít jednodužšší postup, kdy si klient může psát skripty, osvědčil se mi Beanshell
http://www.beanshell.org/ resp.
https://github.com/beanshell/beanshell/releases Aplikace pak například do skriptu vloží určité proměnné, které budou ve skriptu dostupné, tělo skriptu se vyhodnotí evalem a po skončení skriptu si aplikace vyzvedne návratovou hodnotu skriptu anebo přečte hodnoty proměnných. Stejně to bude fungovat i u jiných jazyků, ale neměl jsem potřebu zkoušet něco jiného než Beanshell.
Počítejte, že spuštění klientského kódu může představovat různá rizika - bezpečnostní (získání nebo zápis dat mimo oprávnění), výkonová (např. vyčerpání paměti v případě memory leaků). Dále může být problém stanovit, kdo za problém může, pokud například poskytujete servis nebo zaručujete funkčnost na určité úrovni.