How can I write my own plugins/modules?

Put into the installation directory, subdirectory lib, a JAR named UserServices.jar with one ore more implementations of org.jphototagger.api.plugin.Plugin or org.jphototagger.api.modules.Module or other interfaces called e.g. for thumbnails generation or reading/writing XMP sidecar files and publish them through the Java Service Provider Interface (SPI).

To avoid compiler errors, the minimum JAR file in the class path you need, is API.jar. If you do not want manually create the META-INF/services folder and keep relaxed during refactorings, you should include org-openide-util-lookup.jar and use the @ServiceProvider annotations. If you want receive messages, include eventbus.jar. To access domain objects, such as stored metadata info, include Domain.jar. Some other common used library is jsl.jar. All JARs located in the lib sub directory of JPhotoTagger's installation directory.

User Services' project skeleton

A project named JPhotoTagger: UserServices is located in the version control repository. It has already dependencies to the most important projects/libraries and builds the file UserServices.jar. You cann add/remove dependencies in NetBeans through right clicking on the project and selecting Properties > Libraries.

After building JPhotoTagger: UserServices , you can add the generated UserServices.jar to the installation directory as described obove. Every build of JPhotoTagger: Program deletes UserServices.jar from it's dist/lib directory through build.xml! So either use a separate directory or always re-copy it from JPhotoTagger: UserServices after building JPhotoTagger: Program or modify build.xml.


The best way to find reference implementations, is browsing the source code. Even better is, clone it and open in in the NetBeans IDE. The clone contains all source code and libraries.

Minimum Example for a user defined Module (Displays a message as soon as the module is loaded):

Within the UserServices.jar you can implement as many Plugins/Modules as you need.

package org.myorg.jphototaggerplugin;

import javax.swing.JOptionPane;
import org.openide.util.lookup.ServiceProvider;
import org.jphototagger.api.modules.Module;

@ServiceProvider(service = Module.class)
public final class MyModule implements Module {

    public void init() {
        JOptionPane.showMessageDialog(null, "My module");

    public void remove() {

Author: Elmar
Write e-Mail
Status of this document: 2012-07-30