[ImageJ-devel] external plugins

Curtis Rueden ctrueden at wisc.edu
Thu Mar 19 11:36:56 CDT 2015


Hi Jay,

> Person (A) also downloads the .java/.class file of a just a plugin
> that would work within my software from third person (C).

This is the scenario we are trying to move away from: distributing bare
.java or .class files. As long as plugins are distributed as .jar files
which contain the plugin annotation metadata (in
META-INF/json/org.scijava.plugin.Plugin), then all is well.

> Person (A) wants to run my binary and load/use the plugin from person
> (C) at runtime. How would the SciJava plugin framework know how to
> automatically discover this plugin?

The plugin (as a .jar file) is placed somewhere where it will be included
in the classpath at launch time. As long as the new .jar file is on the
classpath, it will be discovered at runtime.

> I thought that if my program is already compiled and running before I
> specify where this "external plugin" resides and load the class, the
> PluginService would be unaware of the external plugin.

Is it really a requirement that users be able to load additional plugins
_after_ your program starts up, without restarting the program? If not,
then I wouldn't worry about making this work, as it adds complexity for
little gain. Just put the new plugin somewhere on the classpath, start JEX,
and all is well.

If you really need to be able to load plugins after startup, this _can_ be
done. But you have to manually add them to the plugin service via the
addPlugins API method.

Regards,
Curtis

On Thu, Mar 19, 2015 at 11:32 AM, Jay Warrick <jay.w.warrick at gmail.com>
wrote:

> Thanks, Mark. I should likely be using this Handler methodology in a few
> places in my software, including in this case. However, I'm still concerned
> about detection of the plugin given the scenario I'm thinking of. But,
> maybe you can help me understand. I have already been able to build my
> software project around the SciJava plugin framework and ImageJ's
> PluginService to automatically recognize the plugins that are part of my
> own software project. The SciJava framework does its job beautifully to
> automatically discover the plugins I've developed within my software.
> However, what about the following scenario?
>
> Person (A) downloads the binary of my software from me (B). Person (A)
> also downloads the .java/.class file of a just a plugin that would work
> within my software from third person (C). Person (A) wants to run my binary
> and load/use the plugin from person (C) at runtime. How would the SciJava
> plugin framework know how to automatically discover this plugin?
>
> My recollection is that the list of plugins loaded by the PluginService
> are determined from a java annotation index file that is created during
> early in the build process. Thus, I thought that if my program is already
> compiled and running before I specify where this "external plugin" resides
> and load the class, the PluginService would be unaware of the external
> plugin. Am I correct? If it can detect it, then it appears I'm home free
> and am worrying for nothing, which would be awesome.
>
> Thanks!
>
> Jay
>
>
> On Mar 19, 2015, at 8:51 AM, Mark Hiner <hiner at wisc.edu> wrote:
>
> Hi Jay,
>
> >One of the main things I can't quite envision is how to process the
> annotations of an external .java file at runtime so that I can utilize that
> information
>
> You shouldn't have to do this yourself. By using the SciJava plugin
> framework you get discovery of all annotated plugins on your classpath, and
> processing/indexing of those plugins, for free.
>
> I'm assuming the paradigm that would match your needs is a
> HandlerService[1]. The service would perform some function (e.g. opening a
> path) and the behavior of that function would be extensible via
> HandlerPlugins[2] (e.g. a plugin for handling URLs, files on disk, files in
> a database, etc...).
>
> The simplest example of "service chooses a plugin appropriate for the
> circumstances" is the AnimalService tutorial[3]. Note that it's not
> actually a HandlerService but could easily be converted to one. More
> complex examples would be the IOService[4] or SCIFIO's FormatService[5].
>
> Best,
> Mark
>
> [1]
> https://github.com/scijava/scijava-common/blob/scijava-common-2.39.0/src/main/java/org/scijava/plugin/HandlerService.java
> [2]
> https://github.com/scijava/scijava-common/blob/scijava-common-2.39.0/src/main/java/org/scijava/plugin/HandlerPlugin.java
> [3]
> https://github.com/imagej/imagej-tutorials/tree/00394f9f5010d1787b9bf584b6e90eed01beec0d/create-a-new-plugin-type/src/main/java
> [4]
> https://github.com/scijava/scijava-common/blob/scijava-common-2.39.0/src/main/java/org/scijava/io/IOService.java
> [5]
> https://github.com/scifio/scifio/blob/scifio-0.21.1/src/main/java/io/scif/services/FormatService.java
>
> On Wed, Mar 18, 2015 at 6:42 PM, Jay Warrick <jay.w.warrick at gmail.com>
> wrote:
>
>> Hi All,
>>
>> I am using the scijava plugin framework, ImageJ2, and its Plugin service.
>> I would like to allow other people to write a plugin for my software. I'm
>> open to suggestions but I'd probably like to enable them to place their
>> java/jar/class plugin file in a folder, and I could look into that folder
>> to load their plugin. I'm thinking along the lines of how how old ImageJ
>> did things. Does anyone have suggestions or example code (e.g., in FIJI
>> somewhere) for loading/compiling such plugin files during runtime. One of
>> the main things I can't quite envision is how to process the annotations of
>> an external .java file at runtime so that I can utilize that information
>> (e.g., in conjunction with the PluginService). If there is an inherent
>> problem in what I'm hoping to do, please let me know :-) (e.g., if I am
>> provided compiled code, I suspect I might need an annotation index to go
>> with it if I need that information).
>>
>> I figured you guys have tackled this problem thoroughly already and thus
>> would be a good resource. Thanks in advance!
>>
>> Regards,
>>
>> Jay
>>
>>
>> _______________________________________________
>> ImageJ-devel mailing list
>> ImageJ-devel at imagej.net
>> http://imagej.net/mailman/listinfo/imagej-devel
>>
>
>
>
> _______________________________________________
> ImageJ-devel mailing list
> ImageJ-devel at imagej.net
> http://imagej.net/mailman/listinfo/imagej-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://imagej.net/pipermail/imagej-devel/attachments/20150319/0eec9998/attachment-0001.html>


More information about the ImageJ-devel mailing list