GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Migrate many SciJava Common subsystems by ctrueden · Pull Request #295 · scijava/scijava

Migrate many SciJava Common subsystems #295

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Sign up for GitHub

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
ctrueden wants to merge 59 commits into main
base: main
Loading
Loading
from scijava-common-migration

Uh oh!

There was an error while loading. Please reload this page.

Open

Migrate many SciJava Common subsystems #295

Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
5e9836a
docs: add SciJava Common migration plan
ctrueden Sep 16, 2026
82cd7c8
scijava-ops-image: stop using SciJava Common utilities
ctrueden Sep 16, 2026
71852f7
scijava-discovery: make Discoverer yield lazy descriptors
ctrueden Sep 16, 2026
0771222
Pin scijava-discovery and scijava-priority versions
ctrueden Sep 16, 2026
4b8feff
Pin every consumed SciJava artifact version
ctrueden Sep 16, 2026
9084574
scijava-spi: add a module of framework-free interfaces
ctrueden Sep 16, 2026
9a5b15e
scijava-common3: absorb general utilities from SciJava Common
ctrueden Sep 16, 2026
24ba06b
scijava-common3: add FilePaths, from SciJava Common's FileUtils
ctrueden Sep 16, 2026
7d73482
scijava-index: port annotation indexing, with a lazy Discoverer
ctrueden Sep 16, 2026
313843f
docs: correct the Phase 2 injection design
ctrueden Sep 16, 2026
790ec74
scijava-io3: port locations, standalone on plain ServiceLoader
ctrueden Sep 16, 2026
c7842b0
scijava-io3: port data handles
ctrueden Sep 16, 2026
ea1ac3c
Make cancellation thread interruption
ctrueden Sep 16, 2026
ef68624
scijava-concurrent: let cancellation survive a parallel section
ctrueden Sep 16, 2026
df12101
docs: do not port io.nio
ctrueden Sep 16, 2026
80f4333
scijava-io3: port ByteBufferByteBank, keeping direct banks off-heap
ctrueden Sep 16, 2026
5039837
scijava-events: a typed event bus, written clean
ctrueden Sep 16, 2026
e09d280
docs: record incarnational versioning, and defer scijava-persist
ctrueden Sep 17, 2026
f65c690
scijava-io3: start at 3.0.0-SNAPSHOT
ctrueden Sep 17, 2026
caa9640
scijava-context: the container core
ctrueden Sep 17, 2026
7822074
scijava-context: the plugin tier
ctrueden Sep 17, 2026
394b956
scijava-context: declarative dependency injection
ctrueden Sep 17, 2026
de2e89f
scijava-context: @EventHandler scanning
ctrueden Sep 17, 2026
2e01213
docs: scrutinize the core services, and settle the preferences design
ctrueden Sep 17, 2026
9156ef6
docs: use TOML rather than YAML for the settings store
ctrueden Sep 17, 2026
634d940
scijava-execute: run things that declare their inputs and outputs
ctrueden Sep 17, 2026
1e1e662
scijava-execute: the pre/postprocessor chain
ctrueden Sep 17, 2026
95b4e57
docs: say how Fiji gets built on SciJava3
ctrueden Sep 17, 2026
0138735
scijava-execute: generalize beyond Java classes, for scripts
ctrueden Sep 17, 2026
0e4ac38
scijava-command: discoverable commands, and the metadata menus need
ctrueden Sep 17, 2026
80bab69
One opens, to the container
ctrueden Sep 17, 2026
cfead6d
Add the menu tree, and make Access a static utility
ctrueden Sep 17, 2026
b6ff554
scijava-harvest: prototype the parameter dialog model
ctrueden Sep 17, 2026
df48f01
Support computed parameter choices, closing the DynamicCommand gap
ctrueden Sep 17, 2026
58fd161
scijava-ui3 and scijava-swing: widgets, and dialogs to click on
ctrueden Sep 17, 2026
0a57e16
Fix the widget bugs the demos turned up, and fill in the gaps
ctrueden Sep 17, 2026
1384996
Ignore Eclipse's .factorypath
ctrueden Sep 17, 2026
46a5f3e
migration.md: the command row was ported two commits ago
ctrueden Sep 17, 2026
193a373
A Swing shell: menus, search, status -- the first whole-stack demo
ctrueden Sep 18, 2026
19e9d00
scijava-javafx: a second binding, and what it proved
ctrueden Sep 18, 2026
ad4ed60
scijava-awt: a third binding, and where the shared code belongs
ctrueden Sep 18, 2026
ada9894
scijava-convert3: one question, and it sits below the container
ctrueden Sep 18, 2026
22c0dc6
scijava-script3: a script is an Executable like any other
ctrueden Sep 18, 2026
40d687d
Scripts declare their presentation, and menus take more than one source
ctrueden Sep 18, 2026
7c100d4
Name the general thing what users call it: CommandInfo
ctrueden Sep 18, 2026
477a544
The legacy bridge, and the split package it found
ctrueden Sep 18, 2026
1f0084d
One name per foreign library: scijava-compat, -ops-compat, -imagej-co…
ctrueden Sep 18, 2026
1d8efbd
migration.md: say what the presentation metadata actually does
ctrueden Sep 18, 2026
3a2aa7e
scijava-cli: run the same commands without a display
ctrueden Sep 18, 2026
eccf33e
scijava-settings: one TOML file a person can read and edit
ctrueden Sep 19, 2026
7f4e5fa
Shorten submodule folder names
ctrueden Sep 20, 2026
680d702
Make Context.doDispose() less deadlock-prone
ctrueden Sep 25, 2026
a641987
Migrate incarnational versioning writeup to here
ctrueden Oct 26, 2026
e625d35
README: fix build badge
ctrueden Oct 26, 2026
ee70467
Fix wrong suggested scijava-ops-indexer version
ctrueden Oct 26, 2026
a3f8e24
Pin the migration plan's scijava-persist version
ctrueden Oct 26, 2026
289a91c
Fix javadoc errors
ctrueden Oct 26, 2026
e197fad
Make DiscoveryLazinessTest independent of test order
ctrueden Oct 28, 2026
ba91881
Address Copilot review feedback
ctrueden Oct 28, 2026
File filter
Filter by extension


Clear filters
Conversations
Failed to load comments.
Loading

Uh oh!

There was an error while loading. Please reload this page.

Jump to
Jump to file
Failed to load files.
Loading

Uh oh!

There was an error while loading. Please reload this page.

Diff view
Diff view
Prev Previous commit
Next Next commit
scijava-script3: a script is an Executable like any other
It runs through the same Runner, meets the same preprocessors, harvests
its inputs through the same dialog in whichever toolkit, and can sit in a
menu beside a Java command. Nothing above this layer knows which it is --
a claim now tested rather than asserted: ScriptWidgetsTest renders a
Groovy script's parameters with the Swing widgets and drives its
callbacks through an actual JSpinner.

javax.script is the first backend, not the only one. ScriptLanguage and
ScriptSession are the SPI; JsrLanguage turns every JSR-223 engine on the
classpath into one, so Groovy, Jython, JRuby, Clojure and BeanShell cost
nothing and declare nothing. GraalVM polyglot and Appose become further
ScriptLanguages without this layer changing.

Callbacks work for scripts, which SciJava Common never managed. It
resolved `callback = "foo"` by reflecting a Java method, leaving a script
nothing to name; here the name is resolved by whatever kind of code the
executable is, and for a script that means a function it defined. Three
things make it work:

- a *session* rather than a one-shot eval, so the functions still exist
  when a parameter changes;
- what the function changed is converted back into the parameters --
  Groovy's `celsius * 9 / 5 + 32` is a BigDecimal, and convert3 knows
  what the parameter's declared type wants;
- every declared parameter is bound, including unfilled ones, since a
  language that resolves names at run time fails on an unbound name
  rather than seeing null.

Validators and choicesFrom come along for the same ride.

The #@ header syntax is unchanged, because tens of thousands of scripts
are written in it. Declaration lines are blanked rather than removed, so
the language's own error messages keep pointing at the line the author is
looking at -- #@ being a comment in Python and a syntax error in Groovy,
leaving it in was not an option.

Not ported: the ScriptProcessor chain, which existed to rewrite a script
before evaluation and was used for parameters and a shebang, both of
which the header reader does directly. ScriptService has no equivalent.
ScriptREPL, ScriptInterpreter, AutoCompleter and CodeGenerator belong
with the script editor.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013gJpzGd3ksbME4CN6Tu2ni
  • Loading branch information

Uh oh!

There was an error while loading. Please reload this page.

@ctrueden @claude
ctrueden and claude committed Oct 28, 2026
commit 22c0dc6f2cc1be3938fd4abbfdd757ac5af809b0

There are no files selected for viewing

43 changes: 43 additions & 0 deletions 43 docs/migration-plan.md
Show comments
View file
Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,49 @@ converted into this parameter) is what a chooser widget wants, and is a
separate question from what conversions are possible. It lands with the object
widget.

### Scripting

**`scijava-script3`** (`org.scijava.script3`) is built, and the shape of it is
one claim: **a script is an `Executable` like any other**. It runs through the
same `Runner`, meets the same preprocessors, harvests its inputs through the
same dialog in whichever toolkit, and can sit in a menu beside a Java command.
Nothing above this layer knows which it is - a claim now tested, in
`scijava-swing`, by rendering a Groovy script's parameters with the Swing
widgets and watching its callbacks fire.

- **`javax.script` is the first backend, not the only one.** `ScriptLanguage`
and `ScriptSession` are the SPI; `JsrLanguage` turns every JSR-223 engine on
the classpath into one, so Groovy, Jython, JRuby, Clojure and BeanShell cost
nothing and need declare nothing. GraalVM polyglot and Appose are further
`ScriptLanguage` implementations when they are wanted, and neither needs this
layer to change.
- **Callbacks work for scripts**, which SciJava Common never managed.
`ExecutableInstance.behavior(String)` resolves a name however that kind of
code does, and for a script that means a function the script defined - so
`#@ double(callback = "celsiusChanged") celsius` behaves exactly as the Java
annotation does. What the function changed is converted back into the
parameters afterwards, because a callback exists precisely to change other
parameters. Validators and `choicesFrom` come along for the same ride.
- **A session, not an `eval`.** Keeping the interpreter is what makes the
functions callable afterwards, and it is why `ScriptSession` exists rather
than a one-shot evaluation.
- **Declarations are blanked, not removed**, so the language's own error
messages still point at the line the author is looking at. `#@` is a comment
in Python and a syntax error in Groovy, so leaving it in was not an option.
- **Every declared parameter is bound, including the unfilled ones.** A
language that resolves names at run time fails on an unbound name rather
than seeing null, so a callback mentioning a parameter the user has not
reached would otherwise blow up instead of behaving.
- **Not ported**: the `ScriptProcessor` chain, which existed to rewrite a
script before evaluation and was used for parameters and a shebang, both of
which the header reader does directly. `ScriptService` has no equivalent -
`Scripts.get().of(path)` is a line. `ScriptREPL`, `ScriptInterpreter`,
`AutoCompleter` and `CodeGenerator` belong with the script editor.
- **Open**: whether a parameter with declared choices and no value should
preselect the first. SciJava Common does; the model here leaves it unset,
which is honest but shows an empty chooser. It is a one-line change in
either direction and wants a look at real dialogs before being made.

### Phase 4 — UI and desktop

- **`scijava-harvest`** (`org.scijava.harvest`): the model behind a parameter
Expand Down
2 changes: 1 addition & 1 deletion 2 docs/migration.md
Show comments
View file
Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ A **dropped** row is a successful outcome, not a gap.
| `convert` | `org.scijava.convert3`: `Converter` asks one question - can you turn *this value* into *that type* - where SciJava Common had eight `canConvert` overloads and a `ConversionRequest` to carry the combinations. `ConvertService` becomes `Converters`, backed by plain `ServiceLoader` so that conversion sits *below* the container: parameter binding converts, and a script or command line supplies strings for everything. `DefaultConverter`'s pile of special cases becomes one converter per concern (cast, number, string, to-string, array, collection, constructor, file/path), each contributable and orderable by priority. `Converter.of(String.class, Foo.class, Foo::parse)` covers the common case in a line | ported |
| `module`, `module.process` | `org.scijava.execute`: `@Parameter` on fields, `Executables` for the plain case, and `Runner` for the processor chain. `ModuleService.run` becomes `Runner.run`, still returning a future, but of an `ExecutionResult` that reports a declined run with its reason and its author rather than through `ModulePreprocessor.isCanceled()` | ported |
| `command` | `org.scijava.command`: `Command` is a `Runnable` whose `@Parameter` fields are its struct; `@Menu` (repeatable) carries the presentation metadata, read from the annotation index without loading the class. `CommandInfo` replaces `ModuleInfo` and needs no `Context`; `MenuTree` replaces `ShadowMenu`. There is no `DynamicCommand`: see `choicesFrom` and `@Group(membersFrom)` | ported |
| `script`, `script.process` | scripting facade + `javax.script` / GraalVM polyglot / Appose adapters (Phase 3) | planned |
| `script`, `script.process` | `org.scijava.script3`: `ScriptLanguage`/`ScriptSession` are the SPI, with `JsrLanguage` making every JSR-223 engine on the classpath available for free; GraalVM polyglot and Appose are further languages, not replacements. `ScriptInfo`/`ScriptModule` become `ScriptExecutable`, an ordinary `Executable`, so a script runs through the same `Runner`, preprocessors, dialogs and menus as a Java command. `ScriptService` has no equivalent: `Scripts.get().of(path)` is a line. The `#@` header syntax is unchanged, and declaration lines are blanked rather than removed so the language's error messages keep pointing at the right line. The processor chain (`ScriptProcessor` and friends) is not ported: it existed to rewrite scripts before evaluation, and parameters plus a shebang are all it was actually used for. `ScriptREPL`, `ScriptInterpreter`, `AutoCompleter` and `CodeGenerator` await the script editor | ported |
| `widget` (`InputWidget`, `InputPanel`, `InputHarvester`, `WidgetModel`, `WidgetStyle`) | `org.scijava.ui3`: `Widget` is a view of a `ParameterNode`, `WidgetFactory` a discoverable `@Plugin`, `WidgetPanel` a widget holding widgets (so a group nests with no special case), and `WidgetPanels` walks the tree for every toolkit. `WidgetModel` has no equivalent - a widget reads the `ParameterModel` and the node directly, and `WidgetStyle`'s parsing is `Widgets.isStyle`/`styleValue`. `InputHarvester` is a `Preprocessor` that declines the run when the user dismisses the dialog, rather than setting a `canceled` flag on itself | ported |
| `ui.awt` (satellite repo `scijava-ui-awt`) | `org.scijava.awt`: the widget set in pure `java.awt` - no spinner, so the number widget is a field and a scroll bar - plus `Edt`, the first of the AWT platform layer that the Swing binding shares. `AWTColors`, `AWTWindows`, `AWTClipboard`, `AWTInputEventDispatcher` and the drag-and-drop dispatchers belong there too, when the `input`/`tool` layer arrives; the `AWTUI`/`AWTApplicationFrame`/`AWTStatusBar` shell classes await the application layer | ported |
| `ui.javafx` (satellite repo `scijava-ui-javafx`) | `org.scijava.javafx`: the same widget set as the Swing binding, plus `FxThread` for JavaFX's application thread. `JavaFXKeys`'s key-code mapping is worth keeping when the `input`/`tool` layer arrives; `JavaFXMenuCreator` is superseded by `FxMenus`, some 40 lines against `MenuCreator` | ported |
Expand Down
1 change: 1 addition & 0 deletions 1 pom.xml
Show comments
View file
Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
<module>scijava-ops-tutorial</module>
<module>scijava-priority</module>
<module>scijava-progress</module>
<module>scijava-script3</module>
<module>scijava-spi</module>
<module>scijava-struct</module>
<module>scijava-swing</module>
Expand Down
185 changes: 185 additions & 0 deletions 185 scijava-script3/pom.xml
Show comments
View file
Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.scijava</groupId>
<artifactId>pom-scijava</artifactId>
<version>44.0.0</version>
<relativePath />
</parent>

<artifactId>scijava-script3</artifactId>
<!--
NB: the major version tracks the incarnation, per the incubator README.
The 1.x.y of the other components is a legacy of the first monoversioned
release, not the intended scheme.
-->
<version>3.0.0-SNAPSHOT</version>

<name>SciJava Script</name>
<description>Running scripts as things that declare their inputs and outputs.</description>
<url>https://github.com/scijava/scijava</url>
<inceptionYear>2026</inceptionYear>
<organization>
<name>SciJava</name>
<url>https://scijava.org/</url>
</organization>
<licenses>
<license>
<name>Simplified BSD License</name>
<distribution>repo</distribution>
</license>
</licenses>

<developers>
<developer>
<id>ctrueden</id>
<name>Curtis Rueden</name>
<roles>
<role>founder</role>
<role>lead</role>
<role>reviewer</role>
<role>support</role>
<role>maintainer</role>
</roles>
</developer>
<developer>
<id>gselzer</id>
<name>Gabriel Selzer</name>
<roles>
<role>founder</role>
<role>debugger</role>
<role>reviewer</role>
<role>support</role>
</roles>
</developer>
</developers>
<contributors>
<contributor>
<name>Johannes Schindelin</name>
<properties><id>dscho</id></properties>
</contributor>
</contributors>

<mailingLists>
<mailingList>
<name>Image.sc Forum</name>
<archive>https://forum.image.sc/tag/scijava</archive>
</mailingList>
</mailingLists>

<scm>
<connection>scm:git:https://github.com/scijava/scijava</connection>
<developerConnection>scm:git:[email protected]:scijava/scijava</developerConnection>
<tag>HEAD</tag>
<url>https://github.com/scijava/scijava</url>
</scm>
<issueManagement>
<system>GitHub Issues</system>
<url>https://github.com/scijava/scijava/issues</url>
</issueManagement>
<ciManagement>
<system>GitHub Actions</system>
<url>https://github.com/scijava/scijava/actions</url>
</ciManagement>

<properties>
<package-name>org.scijava.script3</package-name>

<license.licenseName>bsd_2</license.licenseName>
<license.copyrightOwners>SciJava developers.</license.copyrightOwners>

<!-- Note: These versions must match across all component POMs! -->
<scijava-common3.version>1.0.1-SNAPSHOT</scijava-common3.version>
<scijava-convert3.version>3.0.0-SNAPSHOT</scijava-convert3.version>
<scijava-execute.version>1.0.0-SNAPSHOT</scijava-execute.version>
<scijava-priority.version>1.0.1-SNAPSHOT</scijava-priority.version>
<scijava-struct.version>1.0.1-SNAPSHOT</scijava-struct.version>
</properties>

<dependencies>
<!--
NB: no container here either. A script is an Executable like any
other, and languages come from plain ServiceLoader.
-->
<dependency>
<groupId>org.scijava</groupId>
<artifactId>scijava-common3</artifactId>
<version>${scijava-common3.version}</version>
</dependency>
<dependency>
<groupId>org.scijava</groupId>
<artifactId>scijava-convert3</artifactId>
<version>${scijava-convert3.version}</version>
</dependency>
<dependency>
<groupId>org.scijava</groupId>
<artifactId>scijava-execute</artifactId>
<version>${scijava-execute.version}</version>
</dependency>
<dependency>
<groupId>org.scijava</groupId>
<artifactId>scijava-priority</artifactId>
<version>${scijava-priority.version}</version>
</dependency>
<dependency>
<groupId>org.scijava</groupId>
<artifactId>scijava-struct</artifactId>
<version>${scijava-struct.version}</version>
</dependency>

<!-- Test scope dependencies -->
<!--
NB: a real engine, so that the tests exercise a language rather than a
stand-in. Any JSR-223 engine on the classpath is discovered the same
way; Groovy is simply the one Fiji users meet first.
-->
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy-jsr223</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-package-rules</id>
<goals>
<goal>enforce</goal>
</goals>
<phase>test</phase>
<configuration>
<rules>
<NoPackageCyclesRule implementation="org.scijava.maven.plugin.enforcer.NoPackageCyclesRule" />
<NoSubpackageDependenceRule implementation="org.scijava.maven.plugin.enforcer.NoSubpackageDependenceRule" />
</rules>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<links>
<link>https://javadoc.scijava.org/Java11/</link>
</links>
</configuration>
</plugin>
</plugins>
</build>
</project>
43 changes: 43 additions & 0 deletions 43 scijava-script3/src/main/java/module-info.java
Show comments
View file
Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* #%L
* Running scripts as things that declare their inputs and outputs.
* %%
* Copyright (C) 2026 SciJava developers.
* %%
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* #L%
*/

module org.scijava.script3 {

exports org.scijava.script3;

requires transitive java.scripting;
requires transitive org.scijava.execute;
requires transitive org.scijava.struct;
requires org.scijava.common3;
requires org.scijava.convert3;
requires org.scijava.priority;

uses org.scijava.script3.ScriptLanguage;

}
Loading
Oops, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Add this suggestion to a batch that can be applied as a single commit. This suggestion is invalid because no changes were made to the code. Suggestions cannot be applied while the pull request is closed. Suggestions cannot be applied while viewing a subset of changes. Only one suggestion per line can be applied in a batch. Add this suggestion to a batch that can be applied as a single commit. Applying suggestions on deleted lines is not supported. You must change the existing code in this line in order to create a valid suggestion. Outdated suggestions cannot be applied. This suggestion has been applied or marked resolved. Suggestions cannot be applied from pending reviews. Suggestions cannot be applied on multi-line comments. Suggestions cannot be applied while the pull request is queued to merge. Suggestion cannot be applied right now. Please check back later.
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.