Agree. Thanks.

> On Mar 19, 2015, at 3:38 PM, Curtis Rueden <ctrue...@wisc.edu> wrote:
> 
> Hi Jay,
> 
> > Likely the more straight forward approach would have been to directly
> > use the annotation index in the jar instead of searching jar entries.
> > Either way I suppose :-)
> 
> Less code, yeah. But also much more performant. Your way not only fully scans 
> the JAR but also needs to load all the classes so they can be inspected for 
> @Plugin annotations. The SciJava way (based on the SezPoz idea) is that you 
> don't have to scan JARs or load classes -- you just read a single resource 
> file out of each JAR and you have all the information you need.
> 
> -Curtis
> 
> On Thu, Mar 19, 2015 at 3:33 PM, Jay Warrick <jay.w.warr...@gmail.com 
> <mailto:jay.w.warr...@gmail.com>> wrote:
> After writing this. Likely the more straight forward approach would have been 
> to directly use the annotation index in the jar instead of searching jar 
> entries. Either way I suppose :-)
> 
>> On Mar 19, 2015, at 3:30 PM, Jay Warrick <jay.w.warr...@gmail.com 
>> <mailto:jay.w.warr...@gmail.com>> wrote:
>> 
>> Thanks man. It turns out that it isn't too bad to load the class files on 
>> the fly from a jar, check which jar entries are classes that extend 
>> JEXPlugin, load them, get the @Plugin annotation, create a PluginInfo, then 
>> create my JEXPluginInfo from that (something I already had code for) which 
>> parses the other annotations I made for my plugins. I can then use this 
>> JEXPluginInfo to instantiate my fully functional JEXCrunchablePlugin (also 
>> code I already had) that actually does the image processing and can be added 
>> to my list of plugins available in the software. I only demonstrated 
>> feasibility today for getting to the functional JEXCrunchablePlugin instance 
>> and will incorporate more fully soon.
>> 
>> Thanks for pointing out that I should likely just rely on compiled jars and 
>> pointing out the addPlugin method. It made this process much simpler.
>> 
>> Thanks Curtis and Mark for your help.
>> 
>> Best,
>> 
>> Jay
>> 
>> 
>>> On Mar 19, 2015, at 1:15 PM, Curtis Rueden <ctrue...@wisc.edu 
>>> <mailto:ctrue...@wisc.edu>> wrote:
>>> 
>>> Hi Jay,
>>> 
>>> > What might be the best way to include these compiled jars in my class
>>> > path upon launching the binary?
>>> 
>>> Well, one option would be to make JEX into a plugin for ImageJ, with a JEX 
>>> update site. Then JARs in the jars/ and plugins/ directories would 
>>> automatically be on the classpath, thanks to the ImageJ launcher.
>>> 
>>> Otherwise, deployment of Java applications is a rough issue, man. If you 
>>> don't want to use ImageJ's solution (the Launcher), then you can research 
>>> it yourself and go your own way. There are a million and one ways to do it, 
>>> and they all have their pros and cons. One popular option is launch4j [1]. 
>>> Actually, I would love to switch ImageJ to something more industry standard 
>>> like that, but it's quite a lot of effort and surely there would be some 
>>> serious backwards incompatibilities...
>>> 
>>> Regards,
>>> Curtis
>>> 
>>> [1] http://launch4j.sourceforge.net/ <http://launch4j.sourceforge.net/>
>>> 
>>> On Thu, Mar 19, 2015 at 12:50 PM, Jay Warrick <jay.w.warr...@gmail.com 
>>> <mailto:jay.w.warr...@gmail.com>> wrote:
>>> Sweet. Thanks for the clarification. I'm fine with requiring compiled jars. 
>>> I was prepared to use something like the addPlugins API but certainly see 
>>> the simplicity of the restart method and will likely try that for now.
>>> 
>>> What might be the best way to include these compiled jars in my class path 
>>> upon launching the binary? Would one option be to edit the simple launch 
>>> script for the software by adding a classpath argument to the "java ..." 
>>> command?
>>> 
>>> 
>>>> On Mar 19, 2015, at 11:36 AM, Curtis Rueden <ctrue...@wisc.edu 
>>>> <mailto:ctrue...@wisc.edu>> wrote:
>>>> 
>>>> 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.warr...@gmail.com 
>>>> <mailto:jay.w.warr...@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 <hi...@wisc.edu 
>>>>> <mailto:hi...@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
>>>>>  
>>>>> <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
>>>>>  
>>>>> <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
>>>>>  
>>>>> <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
>>>>>  
>>>>> <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
>>>>>  
>>>>> <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.warr...@gmail.com 
>>>>> <mailto:jay.w.warr...@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@imagej.net <mailto:ImageJ-devel@imagej.net>
>>>>> http://imagej.net/mailman/listinfo/imagej-devel 
>>>>> <http://imagej.net/mailman/listinfo/imagej-devel>
>>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> ImageJ-devel mailing list
>>>> ImageJ-devel@imagej.net <mailto:ImageJ-devel@imagej.net>
>>>> http://imagej.net/mailman/listinfo/imagej-devel 
>>>> <http://imagej.net/mailman/listinfo/imagej-devel>
>>>> 
>>>> 
>>> 
>>> 
>>> _______________________________________________
>>> ImageJ-devel mailing list
>>> ImageJ-devel@imagej.net <mailto:ImageJ-devel@imagej.net>
>>> http://imagej.net/mailman/listinfo/imagej-devel 
>>> <http://imagej.net/mailman/listinfo/imagej-devel>
>>> 
>>> 
>>> _______________________________________________
>>> ImageJ-devel mailing list
>>> ImageJ-devel@imagej.net <mailto:ImageJ-devel@imagej.net>
>>> http://imagej.net/mailman/listinfo/imagej-devel 
>>> <http://imagej.net/mailman/listinfo/imagej-devel>
>> 
>> _______________________________________________
>> ImageJ-devel mailing list
>> ImageJ-devel@imagej.net <mailto:ImageJ-devel@imagej.net>
>> http://imagej.net/mailman/listinfo/imagej-devel 
>> <http://imagej.net/mailman/listinfo/imagej-devel>
> 
> 
> _______________________________________________
> ImageJ-devel mailing list
> ImageJ-devel@imagej.net <mailto:ImageJ-devel@imagej.net>
> http://imagej.net/mailman/listinfo/imagej-devel 
> <http://imagej.net/mailman/listinfo/imagej-devel>
> 
> 

_______________________________________________
ImageJ-devel mailing list
ImageJ-devel@imagej.net
http://imagej.net/mailman/listinfo/imagej-devel

Reply via email to