CINXE.COM

Development Lifecycle

<!DOCTYPE html> <html> <head> <title>Development Lifecycle</title> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=3" /> <meta content="ImageJ Wiki" property="og:site_name"> <meta content="Development Lifecycle" property="og:title"> <meta content="article" property="og:type"> <meta content="The ImageJ wiki is a community-edited knowledge base on topics relating to ImageJ, a public domain program for processing and analyzing scientific images, and its ecosystem of derivatives and variants, including ImageJ2, Fiji, and others." property="og:description"> <meta content="https://imagej.github.io/develop/releasing" property="og:url"> <meta content="https://imagej.github.io/media/icons/imagej2.png" property="og:image"> <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> <link rel="manifest" href="/site.webmanifest"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="theme-color" content="#ffffff"> <link rel="stylesheet" href="/assets/css/lightbox.min.css" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/instantsearch.css@7/themes/algolia-min.css"/> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dygraphs@2.1.0/dist/dygraph.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dygraphs@2.1.0/dist/dygraph.min.css" /> <link rel="stylesheet" href="/assets/css/main.css" /> <link rel="stylesheet" href="/assets/css/layout.css"/> <link rel="stylesheet" href="/assets/css/includes.css" /> <link rel="stylesheet" href="/assets/css/timeline.css"/> <link rel="stylesheet" href="/assets/css/dock.css"/> <noscript><link rel="stylesheet" href="/assets/css/noscript.css" /></noscript> <link rel="stylesheet" href="/assets/css/page.css" /> </head> <body class="is-preload"> <!-- Top bar --> <section id="top-bar"> <a href="/"><img id="site-logo" src="/media/icons/imagej2.png"></a> <div id="search-panel"> <div id="search-box"></div> </div> </section> <!-- Page-info --> <div class="page-info"> <a href="https://github.com/imagej/imagej.github.io/commits/main/_pages/develop/releasing.md">Page history</a> <a href="https://github.com/imagej/imagej.github.io/edit/main/_pages/develop/releasing.md">Edit this page</a> <a href="/editing">How do I edit this website?</a></div> <section id="left-column" class="sidebar dock"> <!-- Menu --> <div class="menu dockable"> <div class="drag-handle"></div><h3>ImageJ Docs</h3> <ul> <li><a href="/downloads">Download</a></li> <li><details><summary>Learn</summary><ul> <li><details><summary><a href="/learn">ImageJ Basics</a></summary><ul> <li><a href="/tutorials">Tutorials</a></li> <li><a href="/learn/user-guides">User Guides</a></li> <li><a href="/learn/keyboard-shortcuts">Keyboard Shortcuts</a></li> <li><a href="/learn/tips-and-tricks">Tips and Tricks</a></li> <li><a href="/learn/troubleshooting">Troubleshooting</a></li> <li><a href="/learn/faq">Frequently Asked Questions</a></li> <li><details><summary><a href="/platforms">Supported Platforms</a></summary><ul> <li><a href="/platforms/windows">Windows</a></li> <li><a href="/platforms/macos">MacOS</a></li> <li><a href="/platforms/linux">Linux</a></li> <li><a href="/platforms/pi">Raspberry Pi</a></li> <li><a href="/platforms/android">Android</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/Supported Platforms --> <li><details><summary><a href="/formats">File Formats</a></summary><ul> <li><a href="/formats/bio-formats">Bio-Formats</a></li> <li><a href="/formats/video">Video formats</a></li> <li><a href="/formats/quicktime">QuickTime</a></li> <li><a href="/formats/tiff">TIFF</a></li> <li><a href="/formats/pdf">PDF</a></li> <li><a href="/formats/dicom">DICOM</a></li> <li><a href="/formats/lsm">Zeiss LSM</a></li> <li><a href="/formats/olympus">Olympus VSI</a></li> <li><a href="/formats/lurawave">Opera Flex</a></li> <li><a href="/formats/fib-sem">FIB-SEM</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/File Formats --> </ul></details></li> <!-- Learn/ImageJ --> <li><details><summary><a href="/imaging">Scientific Imaging</a></summary><ul> <li><a href="/imaging/principles">Principles of Scientific Imaging</a></li> <li><a href="/imaging/annotating-images">Annotating Images</a></li> <li><a href="/imaging/colocalization-analysis">Colocalization</a></li> <li><a href="/imaging/color-image-processing">Color Image Processing</a></li> <li><a href="/imaging/deconvolution">Deconvolution</a></li> <li><a href="/imaging/image-intensity-processing">Image Intensity Processing</a></li> <li><a href="/imaging/particle-analysis">Particle Analysis</a></li> <li><a href="/imaging/registration">Registration</a></li> <li><a href="/imaging/segmentation">Segmentation</a></li> <li><a href="/imaging/stack-slice-manipulations">Stack-slice Manipulations</a></li> <li><a href="/imaging/t-functions">T-functions</a></li> <li><a href="/imaging/tracking">Tracking</a></li> <li><a href="/imaging/visualization">Visualization</a></li> <li><a href="/imaging/z-functions">Z-functions</a></li> </ul></details></li> <!-- Learn/Scientific Imaging --> </ul></details></li> <!-- Learn --> <li><details open><summary><a href="/plugins">Extend</a></summary><ul> <li><a href="/list-of-extensions">List of Extensions</a></li> <li><details><summary><a href="/update-sites">Update Sites</a></summary><ul> <li><a href="/list-of-update-sites">List of Update Sites</a></li> <li><a href="/update-sites/following">Following an Update Site</a></li> <li><a href="/update-sites/setup">Creating an Update Site</a></li> <li><a href="/update-sites/tos">Terms of Service</a></li> <li><a href="/update-sites/automatic-uploads">Automatic Upload</a></li> <li><a href="/update-sites/core-uploads">Uploading to Core Sites</a></li> <li><a href="/update-sites/faq">Update Sites FAQ</a></li> <li><a href="/update-sites/stats">Statistics</a></li> </ul></details></li> <!-- Extend/Update Sites --> <li><details><summary><a href="/scripting">Scripting</a></summary><ul> <li><a href="/scripting/basics">Scripting Basics</a></li> <li><a href="/scripting/script-editor">Script Editor</a></li> <li><a href="/scripting/parameters">Parameters</a></li> <li><a href="/scripting/user-input">User Input</a></li> <li><a href="/scripting/auto-imports">Auto Import</a></li> <li><a href="/scripting/templates">Templates</a></li> <li><a href="/scripting/batch">Batch Processing</a></li> <li><a href="/scripting/headless">Running Headlessly</a></li> <li><a href="/scripting/comparisons">Scripting Comparisons</a></li> <li><a href="/scripting/toolbox">Toolbox</a></li> <li><details><summary>Languages</summary><ul> <li><a href="/scripting/beanshell">BeanShell Scripting</a></li> <li><a href="/scripting/groovy">Groovy Scripting</a></li> <li><a href="/scripting/macro">ImageJ Macro</a></li> <li><a href="/scripting/javascript">JavaScript</a></li> <li><a href="/scripting/clojure">Lisp (Clojure)</a></li> <li><a href="/scripting/matlab">MATLAB</a></li> <li><a href="/scripting/jython">Python (Jython)</a></li> <li><a href="/scripting/python">Python (native)</a></li> <li><a href="/scripting/renjin">R (Renjin)</a></li> <li><a href="/scripting/jruby">Ruby (JRuby)</a></li> <li><a href="/scripting/scala">Scala Scripting</a></li> </ul></details></li> <!-- Extend/Scripting/Languages --> </ul></details></li> <!-- Extend/Scripting --> <li><details open><summary><a href="/develop">Development</a></summary><ul> <li><a href="/develop/philosophy">Philosophy</a></li> <li><a href="/develop/architecture">Architecture</a></li> <li><a href="/develop/source">Source code</a></li> <li><a href="/develop/project-management">Project management</a></li> <li><a href="/develop/coding-style">Coding style</a></li> <li><a href="/develop/javadoc">Using Javadoc</a></li> <li><a href="/develop/debugging">Debugging</a></li> <li><a href="/develop/wish-list">Wish list</a></li> <li><details><summary>Tools</summary><ul> <li><a href="/develop/github">GitHub</a></li> <li><a href="/develop/maven">Maven</a></li> <li><a href="/develop/ci">CI/CD</a></li> <li><a href="/develop/dotfiles">Dotfiles</a></li> <li><details><summary><a href="/develop/ides">IDEs</a></summary><ul> <li><a href="/develop/eclipse">Eclipse</a></li> <li><a href="/develop/netbeans">NetBeans</a></li> <li><a href="/develop/intellij">IntelliJ IDEA</a></li> <li><a href="/develop/command-line">Command Line</a></li> </ul></details></li> </ul></details></li> <!-- Extend/Development/Tools --> <li><details open><summary>Guides</summary><ul> <li><a href="/develop/plugins">Writing plugins</a></li> <li><a href="/develop/improving-the-code">Contributing to a plugin</a></li> <li><a class="current-page">Development lifecycle</a></li> <li><a href="/develop/building-a-pom">Building a POM</a></li> <li><a href="/develop/debugging-exercises">Hands-on debugging</a></li> <li><a href="/develop/writing-ops">Adding new ops</a></li> <li><a href="/develop/formats">Adding new formats</a></li> <li><a href="/develop/native-libraries">Using native libraries</a></li> <li><a href="/develop/tips">Tips for developers</a></li> <li><a href="/develop/cpp-tips">Tips for C++ developers</a></li> <li><a href="/develop/ij1-plugins">ImageJ 1.x plugins</a></li> <li><a href="/develop/versioning">Versioning</a></li> <li><a href="/develop/logging">Logging</a></li> <li><a href="/develop/uber-jars">Uber-JARs</a></li> </ul></details></li> <!-- Extend/Development/Guides --> <li><details><summary><a href="/develop/git">Git</a></summary><ul> <li><a href="/develop/git/eclipse">Git in Eclipse (EGit)</a></li> <li><a href="/develop/git/mini-howto">Git mini howto</a></li> <li><a href="/develop/git/workshop">Git workshop</a></li> <li><a href="/develop/git/conflicts">Git conflicts</a></li> <li><a href="/develop/git/topic-branches">Git topic branches</a></li> <li><a href="/develop/git/notes">Git notes</a></li> <li><a href="/develop/git/reflogs">Git reflogs</a></li> <li><a href="/develop/git/submodules">Git submodules</a></li> <li><a href="/develop/git/pinpoint-regressions">How to pinpoint regressions</a></li> <li><a href="/develop/git/publish-a-repository">How to publish a git repository</a></li> <li><a href="/develop/git/extract-a-subproject">How to extract a subproject</a></li> </ul></details></li> <!-- Extend/Development/Git --> </ul></details></li> <!-- Extend/Development --> </ul></details></li> <!-- Extend --> <li><details><summary><a href="/contribute">Contribute</a></summary><ul> <li><a href="/contribute/citing">Citing</a></li> <li><a href="/people">Contributors</a></li> <li><a href="/orgs">Organizations</a></li> <li><a href="/contribute/governance">Governance</a></li> <li><a href="/contribute/funding">Funding</a></li> <li><a href="/contribute/fiji">Contributing to Fiji</a></li> <li><details><summary><a href="/licensing">Licensing</a></summary><ul> <li><details><summary><a href="/licensing/open-source">Open Source</a></summary><ul> <li><a href="/licensing/apache">Apache</a></li> <li><a href="/licensing/bsd">BSD</a></li> <li><a href="/licensing/epl">EPL</a></li> <li><a href="/licensing/gpl">GPL</a></li> <li><a href="/licensing/lgpl">LGPL</a></li> <li><a href="/licensing/mit">MIT</a></li> <li><a href="/licensing/public-domain">Public domain</a></li> <li><a href="/licensing/big">BIG</a></li> </ul></details></li> <!-- Contribute/Licensing/Open Source --> <li><a href="/licensing/closed-source">Proprietary</a></li> </ul></details></li> <!-- Contribute/Licensing --> <li><details><summary><a href="/editing">Editing the Wiki</a></summary><ul> <li><a href="/editing/advanced">Advanced Editing</a></li> <li><a href="/editing/buttons">Buttons</a></li> <li><a href="/editing/citations">Citations</a></li> <li><a href="/editing/code">Source Code</a></li> <li><a href="/editing/debugging">Debugging</a></li> <li><a href="/editing/headers">Headers</a></li> <li><a href="/editing/icons">Icons</a></li> <li><a href="/editing/images">Images</a></li> <li><a href="/editing/keys">Keyboard Shortcuts</a></li> <li><a href="/editing/linking">Linking</a></li> <li><a href="/editing/math">Math Expressions</a></li> <li><a href="/editing/menu-paths">Menu Paths</a></li> <li><a href="/editing/navigation">Navigation</a></li> <li><a href="/editing/notices">Notices</a></li> <li><a href="/editing/people">People</a></li> <li><a href="/editing/pitfalls">Pitfalls</a></li> <li><a href="/editing/quizzes">Quizzes</a></li> <li><a href="/editing/statbox">Statbox</a></li> <li><a href="/editing/symbols">Symbols</a></li> <li><a href="/editing/tables">Tables</a></li> <li><a href="/editing/timelines">Timelines</a></li> <li><a href="/editing/tooltips">Tooltips</a></li> <li><a href="/editing/videos">Videos</a></li> <li><a href="/editing/whitespace">Whitespace</a></li> </ul></details></li> <!-- Contribute/Editing the Wiki --> </ul></details></li> <!-- Contribute --> <li><details><summary><a href="/discuss">Discuss</a></summary><ul> <li><a href="/discuss/bugs">Reporting Issues</a></li> <li><a href="/discuss/mailing-lists">Mailing Lists</a></li> <li><a href="/discuss/chat">Chat</a></li> </ul></details></li> <!-- Discuss --> <li><details><summary>Explore</summary><ul> <li><a href="/news">News</a></li> <li><details><summary><a href="/events">Events</a></summary><ul> <li><a href="/events/presentations">Presentations</a></li> <li><a href="/events/conferences">Conferences</a></li> <li><a href="/events/hackathons">Hackathons</a></li> <li><a href="/events">More...</a></li> </ul></details></li> <!-- Discuss/Events --> <li><details><summary><a href="/libs">Libraries</a></summary><ul> <li><a href="/libs/imagej-ops">ImageJ Ops</a></li> <li><a href="/libs/imagej-common">ImageJ Common</a></li> <li><a href="/libs/imagej-legacy">ImageJ Legacy</a></li> <li><a href="/libs/scijava">SciJava</a></li> <li><a href="/libs/scifio">SCIFIO</a></li> <li><details><summary><a href="/libs/imglib2">ImgLib2</a></summary><ul> <li><a href="/libs/imglib2/getting-started">Getting Started</a></li> <li><a href="/libs/imglib2/accessors">Accessors</a></li> <li><a href="/libs/imglib2/accessibles">Accessibles</a></li> <li><a href="/libs/imglib2/examples">Examples</a></li> <li><a href="/libs/imglib2/workshop-introductory">Introductory Workshop</a></li> <li><a href="/libs/imglib2/workshop-advanced">Advanced Workshop</a></li> <li><a href="/libs/imglib2/matlab">ImgLib2 images in MATLAB</a></li> <li><a href="/libs/imglib2/benchmarks">Benchmarks</a></li> <li><a href="/libs/imglib2/faq">FAQ</a></li> <li><a href="/libs/imglib2/developing">Developing ImgLib2</a></li> <li><a href="/libs/imglib2/discussion">ImgLib2 Discussion</a></li> </ul></details></li> <!-- Explore/Libraries/ImgLib2 --> <li><a href="/libs">More...</a></li> </ul></details></li> <!-- Explore/Libraries --> <li><details><summary><a href="/software">Software</a></summary><ul> <li><a href="/software/nih-image">NIH Image</a></li> <li><a href="/software/imagej">ImageJ</a></li> <li><a href="/software/imagej2">ImageJ2</a></li> <li><a href="/software/fiji">Fiji</a></li> <li><a href="/software">More...</a></li> </ul></details></li> <!-- Explore/Software --> </ul></details></li> <!-- Explore --> </ul> </div> </section> <section id="right-column" class="sidebar dock"> <!-- Vital stats --> <!-- Table of contents --> <div id="toc" class="toc menu dockable"> <div class="drag-handle"></div> <h3>Page contents</h3> <ul data-toc="#content" data-toc-headings="h1,h2,h3,h4,h5,h6"></ul> </div> </section> <!-- Page title --> <div class="container"> <header class="major special"> <a class="project-icon shadowed-box" href="/libs/scijava"><span class="tooltip"><img src="/media/icons/scijava.svg"><span class="tooltiptext" style="top: 80%; left: 25%; width: 20em">This page describes content relating to the core SciJava software libraries. Click the logo for details.</span></span></a> <h1>Development Lifecycle</h1> <span class="project-counterweight"> </span> </header> </div> <!-- Nav bar --> <!-- Main content --> <section id="page" class="main style1"> <div class="container"> <div class="box alt"></div> <div id="content" class="page-content"> <div class="notice" style="font-size: 2; background: #ebf2f8; border-left: 10px solid #67a1fe"><div class="notice-icon"><img src="/media/icons/info.svg" width="32" /></div><div class="notice-content"><p>This page describes the core <a href="/libs/scijava">SciJava</a> <em>software release process</em>.</p> <ul> <li>For an overview of <em>distribution methods</em>, see <a href="/contribute/distributing">Distribution</a>.</li> <li>To <em>download</em> software releases, see <a href="/downloads">Downloads</a>.</li> </ul> </div> </div> <p>The SciJava <a href="/develop/philosophy">philosophy</a> is to <a href="/develop/philosophy#release-early-release-often">release early, release often</a>. At the same time, we always want to preserve <a href="/develop/architecture#reproducible-builds">scientific reproducibility</a>. To make this possible we lean on several <a href="/develop/project-management">project management</a> tools. The purpose of this guide is to take you through the process of using these tools with the goal of releasing new versions of your software, and then providing those releases to users.</p> <h1 id="phases-of-development">Phases of development</h1> <p><a href="/software/imagej2">ImageJ2</a> and <a href="/software/fiji">Fiji</a> are developed according to the <a href="/develop/philosophy">SciJava philosophy</a>, thus these applications are used throughout this tutorial to illustrate the development lifecycle.</p> <p>Whether adding new features, fixing bugs, improving performance, etc… <strong>development</strong> is the process of making changes, with the goal of exposing these changes to users. To accomplish this, actively developed projects cycle through five general “phases”:</p> <aside class="sidebox"> <strong><p>What are Maven artifacts?</p> </strong> <div> <p>Artifacts are files, most commonly a <strong><a href="https://en.wikipedia.org/wiki/JAR_(file_format)">JAR</a></strong> encapsulating the compiled classes for a component. Other files that may be produced as artifacts include:</p> <ul> <li>The project’s <strong><a href="https://maven.apache.org/pom.html">POM</a></strong></li> <li>A jar with the original source files</li> <li>A jar with any generated javadoc</li> <li>A jar with any test files</li> </ul> </div> </aside> <ol> <li><strong>In development.</strong> The source code is modified to add new features, fix bugs, etc… these modifications are expressed as <em>commits</em> by <a href="/develop/git">Git</a>, whether on your local filesystem, a topic branch, or a repository fork.</li> <li><strong>On master.</strong> When you have a set of one or more <em>commits</em> that you are happy with (i.e. the feature is complete, or the bug is fixed) they are moved to the <code class="language-plaintext highlighter-rouge">master</code> branch of the project’s repository on GitHub. This ensures the <code class="language-plaintext highlighter-rouge">master</code> branch is always <em>release ready</em>.</li> <li><strong>Released.</strong> When there is a need to make the current <code class="language-plaintext highlighter-rouge">master</code> branch public (i.e. it has a critical bug fix or cool new feature that users have requested) <a href="/develop/maven">Maven</a> is used to <em>cut a release</em>, which is then <em>deployed as an artifact</em> to the <a href="https://maven.scijava.org/">SciJava Maven repository</a>. Developers can now use the new version in their own projects.</li> <li><strong>Managed.</strong> The new release artifact must be verified to work in the combined runtime environment with other SciJava components. Once it has been tested to work, the version listed in the SciJava component collection <a href="/develop/architecture#bill-of-materials">Bill of Materials (BOM)</a> can be updated accordingly.</li> <li><strong>Uploaded.</strong> Finally, the new release artifact can be uploaded to its associated ImageJ <a href="/update-sites">update site</a>, making it available to end users.</li> </ol> <p>The following sections will discuss these phases, and their associated tools and workflows, in more depth.</p> <h1 id="relationship-with-maven-snapshots">Relationship with Maven SNAPSHOTs</h1> <p>Another way of thinking about the development cycle is through the Maven version number given associated with the code. The idea behind reproducible builds is that from a given version of a plugin, the state of the code producing that version can be determined unambiguously. Typically, that state is determined by a unique <a href="/develop/git">Git</a> commit. However, it would be impractical and unrealistic to change the Maven version with every single Git commit.</p> <p>This is why <a href="https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN401">SNAPSHOT</a> versions are used while “in development” (phases 1 and 2 - “SNAPSHOT coupling”). Using a SNAPSHOT version is saying “no guarantees are made as to the reproducibility of this artifact.” For this reason, to best facilitate reproducible science, SNAPSHOT versions of code are not provided to users (except potentially for testing).</p> <p>To provide users with an updated version of an artifact (phases 3, 4 and 5) the version is changed to a unique, non-SNAPSHOT, version for a single Git commit. Then the next commit returns to SNAPSHOT versioning for further development. Thus the cycle repeats.</p> <h1 id="phases-in-depth">Phases in-depth</h1> <aside class="sidebox"> <strong><p>When to use a topic branch?</p> </strong> <div><p><a href="/develop/architecture">Core SciJava components</a> employ a “release ready main branch” approach:</p> <ul> <li>The tip of the main branch is always stable enough to be released, “as good or better” than the state of its last release.</li> <li>Each commit on the main branch should compile with passing tests. This has several advantages—e.g., better <a href="https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git#Binary-Search">bisect-style debugging</a>.</li> </ul> <p>Topic branches are great for isolating potentially disruptive and/or unfinished changes from the main branch, so that it always remains release ready. However, pushing directly to main has a huge time savings over filing a PR and awaiting review for days, weeks or months. Getting changes onto main quickly has many advantages:</p> <ul> <li><strong>Fewer conflicts.</strong> It avoids conflicts between multiple long-running topic branches.</li> <li><strong>SNAPSHOT builds.</strong> <a href="/develop/github-actions">GitHub Actions</a> builds the change into the latest SNAPSHOT build, making it available from the <a href="/develop/project-management#maven">SciJava Maven repository</a>.</li> <li><strong>Faster support.</strong> Supporting the community is less convoluted, with changes released to users more rapidly. Yes, you can link to changes on a topic branch. And yes, you can upload binary builds from that branch. But each extra manual step costs time—better to link directly to the latest SNAPSHOT build. There are even ImageJ <a href="/update-sites">update sites</a> which serve the latest builds from main, to make it easier for non-technical users to test changes.</li> <li><strong>Less complex.</strong> The more topic branches you have—and in particular, the more integration branches you have—the more complex the system becomes, the more supporting tooling, CI jobs, etc. are needed. And the more developer time is needed to maintain the tooling, sort through topic branches, keep track of open PRs… leaving less time for developing new features and fixing bugs.</li> </ul> <p>Hence, when exactly to use a topic branch is a judgment call, but some good times to use a topic branch are:</p> <ul> <li><strong>Breaking.</strong> The changes break <a href="/libs/imagej-legacy">backwards compatibility</a>.</li> <li><strong>New API.</strong> The changes introduce significant new API which will need to remain backwards compatible in the future, and review is desired before committing to that API.</li> <li><strong>Unfinished.</strong> The changes are unfinished.</li> <li><strong>Regressing.</strong> The changes leave the codebase in a “worse” state somehow.</li> <li><strong>Discussion.</strong> To solicit discussion from the <a href="/discuss">community</a>, especially if the changes might be contentious.</li> </ul> <p>Conversely, some situations to push directly to main:</p> <ul> <li><strong>Correct.</strong> Bug-fixes where the developer is confident the fix is correct.</li> <li><strong>No new API.</strong> Small new additions which do not introduce significant future maintenance burden.</li> <li><strong>Unstable.</strong> Changes to unstable or experimental components still in their “incubation” period of development (i.e., versioned at 0.x), since there is no promise of backwards compatibility.</li> <li><strong>Unsupported.</strong> Changes to “unsupported” components which make no guarantee of backwards compatibility.</li> </ul> <p>Lastly, keep in mind that SciJava favors the <a href="/develop/philosophy#release-early-release-often">release early, release often</a> style of development, to maximize iterations of community feedback. Just because a change makes it to the main branch, does not mean it is set in stone: if a problem is later found, the change can be amended or reverted as quickly as it was added—easy come, easy go.</p> </div> </aside> <h2 id="phase-1-in-development">Phase 1: In development</h2> <p>Repositories on GitHub are referred to as <strong>remotes</strong>; when you <em><a href="https://help.github.com/articles/cloning-a-repository/">clone</a></em>, or <em>check out</em>, a remote you get a local copy of the repository. Development progresses by making changes to your local copy and pushing them back to the remote. GitHub provides tools for controlling <a href="https://help.github.com/articles/permission-levels-for-a-user-account-repository/">user permission levels</a> for each remote repository, therefore how you develop a project depends on whether you are able to <em>push</em> (write) to that project’s remote repository or not.</p> <ul> <li><strong>Collaborating developer.</strong> If you have permission to push directly to the project’s remote repository, then you can simply use <a href="/develop/git">Git</a> and <a href="/develop/github">GitHub</a> to <a href="https://help.github.com/articles/cloning-a-repository/">clone the repository</a> and make your changes. For non-trivial changes, you will typically <a href="/develop/git/topic-branches">create a topic branch</a> to develop and test the changes. This also provides a forum for discussion and review with your fellow developers.</li> </ul> <!-- --> <ul> <li><strong>External developer.</strong> If you do not have push rights, then you need to go through an additional step called <strong><a href="http://www.dataschool.io/simple-guide-to-forks-in-github-and-git/">Forking the repository</a></strong>. This will create a remote copy of the repository, to which you have push rights. Your remote fork is referred to as <em>downstream</em> of the original remote repository (which is <em>upstream</em> of your fork). Your development will then take place on your fork, with an additional step later to reconcile with the upstream repository.</li> </ul> <h2 id="phase-2-on-master">Phase 2: On master</h2> <p>Once a feature or fix is complete it can move to the <code class="language-plaintext highlighter-rouge">master</code> branch of the repository. How you accomplish this depends on how the changes were developed in Phase 1.</p> <ul> <li><strong>Collaborating developer.</strong> Minimal changes can be pushed back directly to <code class="language-plaintext highlighter-rouge">master</code> on the remote repository. If your work is on a <a href="/develop/git/topic-branches">topic branch</a> then you should use a <a href="https://help.github.com/articles/using-pull-requests/">pull request</a> (PR) so that the topic branch can be reviewed before being merged to <code class="language-plaintext highlighter-rouge">master</code>.</li> </ul> <!-- --> <ul> <li><strong>External developer.</strong> First push your changes back to a branch of your forked repository (it doesn’t necessarily have to be <code class="language-plaintext highlighter-rouge">master</code>). Then you can file a <a href="https://help.github.com/articles/using-pull-requests/">pull request</a> (PR) on <a href="/develop/github">GitHub</a> to merge your branch back to the official repository. This invites code review from other interested developers. Reviewers might ask for changes to the code to address any issues. After any needed revisions have been made, a <a href="/contribute/governance">project maintainer</a> will accept your changes and then merge to the official <code class="language-plaintext highlighter-rouge">master</code> branch.</li> </ul> <h2 id="phase-3-released">Phase 3: Released</h2> <p>Once the <code class="language-plaintext highlighter-rouge">master</code> branch of a component has your desired new functionality, the next step is to cut a <em>release</em> version of the component. Normally, the Maven version (in the <a href="https://maven.apache.org/pom.html#Introduction">pom.xml</a>) on master is a <a href="http://stackoverflow.com/q/5901378"><em>SNAPSHOT</em> version</a>, meaning it is <a href="/develop/architecture#reproducible-builds">unstable</a> and not yet released. However, a <a href="/develop/architecture#reproducible-builds">stable</a> <em>release</em> artifact can be deployed to the appropriate remote Maven repository.</p> <p>The <a href="https://github.com/scijava/scijava-scripts/blob/-/release-version.sh">release-version.sh</a> script automates the steps to performing a release. It relies on the <a href="http://maven.apache.org/maven-release/maven-release-plugin/">Maven Release plugin</a> to do most of the heavy lifting, but also does some extra work (e.g., to ensure releases are deployed to the correct repository).</p> <h3 id="advantages">Advantages</h3> <ul> <li>A tag is created on GitHub to easily reference the release commit.</li> <li>The “bump to next release cycle” commit is done automatically.</li> <li>The Maven POM references the correct tag rather than <code class="language-plaintext highlighter-rouge">HEAD</code>.</li> <li><a href="/develop/github-actions">GitHub Actions</a> performs the actual release for you, using credentials which are encrypted in the repository itself.</li> </ul> <h3 id="prerequisites">Prerequisites</h3> <ul> <li>Install the <code class="language-plaintext highlighter-rouge">release-version.sh</code> script. The best way to do this is to clone the <a href="https://github.com/scijava/scijava-scripts">SciJava-scripts</a> repository. That will give you access to other useful scripts and help keep them all up to date.</li> <li>(<strong>optional</strong>) If you want to easily use these scripts from any directory, you can <a href="http://askubuntu.com/q/97897">add the scijava-scripts folder to your PATH</a>.</li> <li>Verify that your project’s parent is pom-scijava version 17.1.1 or newer. If the parent version is too old, or is not pom-scijava, then upgrade it. Ask on the <a href="/discuss">forum</a> if you need assistance.</li> <li>If your component is to be released to the SciJava Maven repository, then add the following line to the properties section of your POM: <releaseProfiles>`deploy-to-imagej`</releaseProfiles></li> <li>Ensure the repository for your project is linked with a <a href="/develop/github-actions">GitHub Actions</a> workflow that automatically builds and deploys Maven artifacts in response to changes on GitHub. If you’re not sure if your project has this automation, ask for help on the <a href="/discuss">forum</a>.</li> </ul> <h3 id="steps-to-release">Steps to release</h3> <p>From your project’s directory, simply run:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>release-version.sh </code></pre></div></div> <p>The script will verify that your master branch is ready to go, then create and push a <a href="http://git-scm.com/book/en/v2/Git-Basics-Tagging">tag</a> for the release. <a href="/develop/github-actions">GitHub Actions</a> will then notice the tag and complete the release for you. You should receive an email from GitHub after the release is complete indicating whether the build was successful.</p> <div class="notice" style="font-size: 2; background: #ebf2f8; border-left: 10px solid #67a1fe"><div class="notice-icon"><img src="/media/icons/info.svg" width="32" /></div><div class="notice-content"><p>If your project is a <a href="https://maven.apache.org/guides/mini/guide-multiple-modules.html">multi-module build</a>, first make a commit commenting out any modules that should not be released. Then run the script from the aggregator pom directory.</p> </div> </div> <h2 id="phase-4-managed">Phase 4: Managed</h2> <p>For core projects, there is an intermediate layer tying User-facing and Developer-facing components together: the <a href="/develop/architecture#bill-of-materials">Bill of Materials</a> (BOM). To ensure users and developers see the same functionality, components should only be uploaded to the core update sites when their version is also updated in the <a href="https://github.com/scijava/pom-scijava/">pom-scijava</a> BOM.</p> <p>To update the version of your component listed in the <a href="https://github.com/scijava/pom-scijava/">pom-scijava</a> BOM, you should follow the <a href="#Phase_1:_In_development">External developer</a> instructions for contributing to <a href="https://github.com/scijava/pom-scijava/">pom-scijava</a>. By <a href="https://help.github.com/articles/using-pull-requests/">submitting a pull request</a> that simply modifies the managed version of your component, you will signal to the core SciJava developers that your project is ready for upload. For example, <a href="https://github.com/scijava/pom-scijava/pull/40">this PR</a> updates the managed version of <a href="/formats/bio-formats">Bio-Formats</a> to 5.5.0.</p> <h2 id="phase-5-uploaded">Phase 5: Uploaded</h2> <aside class="sidebox"> <strong><p>What are ImageJ update sites?</p> </strong> <div><p>ImageJ <a href="/update-sites">update sites</a> are what ImageJ actually queries to download updates. These update sites are versioned, but do not rely on other tools (e.g., <a href="/develop/git">Git</a> or <a href="/develop/maven">Maven</a>) in order to function. Rather, component developers upload new versions of their component(s) using the <a href="/plugins/updater">ImageJ Updater</a>, which makes them available to end users. Typically, update sites are available as websites via HTTP, with uploads functioning via <a href="https://github.com/imagej/imagej-plugins-uploader-webdav">WebDAV</a> or <a href="https://github.com/imagej/imagej-plugins-uploader-ssh">SSH/SFTP/SCP</a>.</p> </div> </aside> <p>Deploying to the Maven repository creates a stable release artifact of a software component usable by other developers. But for ImageJ-related components, that alone does not put it into the hands of users. To do that, the component must then be <em>uploaded</em> to an ImageJ <a href="/update-sites">update site</a>.</p> <h3 id="imagej-and-fiji-update-sites">ImageJ and Fiji update sites</h3> <ul> <li>The core ImageJ update site reflects the state of the newest <a href="https://github.com/imagej/imagej/">net.imagej:imagej</a> release.</li> <li>The core Fiji update site reflects the state of the newest <a href="https://github.com/fiji/fiji/">sc.fiji:fiji</a> release.</li> <li>Actually, for the moment, both of the above statements are untrue, but they represent the direction we are heading. Right now, core components of both ImageJ and Fiji are distributed manually via the Java-8 update site. See the <a href="/news/2016-05-10-imagej-howto-java-8-java-6-java-3d">Java 8</a> page for details.</li> </ul> <h3 id="external-update-sites">External update sites</h3> <p>An update site can be hosted anywhere, although <code class="language-plaintext highlighter-rouge">sites.imagej.net</code> provides a <a href="/update-sites/setup#creating-a-hosted-update-site">hosted update site</a> service.</p> <p>See the <strong><a href="/contribute/distributing">distribution</a></strong> page for a discussion of pros and cons of distributing your plugin on a core versus a separate update site.</p> <p>If you do manage <a href="/update-sites/setup">your own update site</a>, you can upload your release yourself.</p> <p>See the <a href="/update-sites">documentation on update sites</a> for further instructions.</p> <h1 id="further-reading">Further reading</h1> <ul> <li>The SciJava <a href="/develop/architecture#versioning">versioning guidelines</a> will help you choose appropriate version numbers for your software when performing Maven releases.</li> </ul> </div> </div> </section> <!-- Footer --> <section id="footer"> <ul class="icons"> <li><a href="https://forum.image.sc/tag/imagej" class="icon alt"><img src="/media/icons/image-sc.png" width="24" style="vertical-align: middle; margin-top: -10px"><span class="label">Forum</span></a></li> <li><a href="https://twitter.com/hashtag/ImageJ" class="icon brands alt fa-twitter"><span class="label">Twitter</span></a></li> <li><a href="https://github.com/imagej" class="icon brands alt fa-github"><span class="label">GitHub</span></a></li> </ul> <ul class="copyright"> <li>Design: <a href="http://html5up.net">HTML5 UP</a></li> </ul> </section> <!-- Hamburger menu --> <nav role="navigation"> <div id="ham-toggle"> <input type="checkbox" /> <span></span> <!-- top bun --> <span></span> <!-- hamburger --> <span></span> <!-- bottom bun --> <ul id="ham-menu"> <div class="menu"><h3>ImageJ Docs</h3> <ul> <li><a href="/downloads">Download</a></li> <li><details><summary>Learn</summary><ul> <li><details><summary><a href="/learn">ImageJ Basics</a></summary><ul> <li><a href="/tutorials">Tutorials</a></li> <li><a href="/learn/user-guides">User Guides</a></li> <li><a href="/learn/keyboard-shortcuts">Keyboard Shortcuts</a></li> <li><a href="/learn/tips-and-tricks">Tips and Tricks</a></li> <li><a href="/learn/troubleshooting">Troubleshooting</a></li> <li><a href="/learn/faq">Frequently Asked Questions</a></li> <li><details><summary><a href="/platforms">Supported Platforms</a></summary><ul> <li><a href="/platforms/windows">Windows</a></li> <li><a href="/platforms/macos">MacOS</a></li> <li><a href="/platforms/linux">Linux</a></li> <li><a href="/platforms/pi">Raspberry Pi</a></li> <li><a href="/platforms/android">Android</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/Supported Platforms --> <li><details><summary><a href="/formats">File Formats</a></summary><ul> <li><a href="/formats/bio-formats">Bio-Formats</a></li> <li><a href="/formats/video">Video formats</a></li> <li><a href="/formats/quicktime">QuickTime</a></li> <li><a href="/formats/tiff">TIFF</a></li> <li><a href="/formats/pdf">PDF</a></li> <li><a href="/formats/dicom">DICOM</a></li> <li><a href="/formats/lsm">Zeiss LSM</a></li> <li><a href="/formats/olympus">Olympus VSI</a></li> <li><a href="/formats/lurawave">Opera Flex</a></li> <li><a href="/formats/fib-sem">FIB-SEM</a></li> </ul></details></li> <!-- Learn/ImageJ Basics/File Formats --> </ul></details></li> <!-- Learn/ImageJ --> <li><details><summary><a href="/imaging">Scientific Imaging</a></summary><ul> <li><a href="/imaging/principles">Principles of Scientific Imaging</a></li> <li><a href="/imaging/annotating-images">Annotating Images</a></li> <li><a href="/imaging/colocalization-analysis">Colocalization</a></li> <li><a href="/imaging/color-image-processing">Color Image Processing</a></li> <li><a href="/imaging/deconvolution">Deconvolution</a></li> <li><a href="/imaging/image-intensity-processing">Image Intensity Processing</a></li> <li><a href="/imaging/particle-analysis">Particle Analysis</a></li> <li><a href="/imaging/registration">Registration</a></li> <li><a href="/imaging/segmentation">Segmentation</a></li> <li><a href="/imaging/stack-slice-manipulations">Stack-slice Manipulations</a></li> <li><a href="/imaging/t-functions">T-functions</a></li> <li><a href="/imaging/tracking">Tracking</a></li> <li><a href="/imaging/visualization">Visualization</a></li> <li><a href="/imaging/z-functions">Z-functions</a></li> </ul></details></li> <!-- Learn/Scientific Imaging --> </ul></details></li> <!-- Learn --> <li><details open><summary><a href="/plugins">Extend</a></summary><ul> <li><a href="/list-of-extensions">List of Extensions</a></li> <li><details><summary><a href="/update-sites">Update Sites</a></summary><ul> <li><a href="/list-of-update-sites">List of Update Sites</a></li> <li><a href="/update-sites/following">Following an Update Site</a></li> <li><a href="/update-sites/setup">Creating an Update Site</a></li> <li><a href="/update-sites/tos">Terms of Service</a></li> <li><a href="/update-sites/automatic-uploads">Automatic Upload</a></li> <li><a href="/update-sites/core-uploads">Uploading to Core Sites</a></li> <li><a href="/update-sites/faq">Update Sites FAQ</a></li> <li><a href="/update-sites/stats">Statistics</a></li> </ul></details></li> <!-- Extend/Update Sites --> <li><details><summary><a href="/scripting">Scripting</a></summary><ul> <li><a href="/scripting/basics">Scripting Basics</a></li> <li><a href="/scripting/script-editor">Script Editor</a></li> <li><a href="/scripting/parameters">Parameters</a></li> <li><a href="/scripting/user-input">User Input</a></li> <li><a href="/scripting/auto-imports">Auto Import</a></li> <li><a href="/scripting/templates">Templates</a></li> <li><a href="/scripting/batch">Batch Processing</a></li> <li><a href="/scripting/headless">Running Headlessly</a></li> <li><a href="/scripting/comparisons">Scripting Comparisons</a></li> <li><a href="/scripting/toolbox">Toolbox</a></li> <li><details><summary>Languages</summary><ul> <li><a href="/scripting/beanshell">BeanShell Scripting</a></li> <li><a href="/scripting/groovy">Groovy Scripting</a></li> <li><a href="/scripting/macro">ImageJ Macro</a></li> <li><a href="/scripting/javascript">JavaScript</a></li> <li><a href="/scripting/clojure">Lisp (Clojure)</a></li> <li><a href="/scripting/matlab">MATLAB</a></li> <li><a href="/scripting/jython">Python (Jython)</a></li> <li><a href="/scripting/python">Python (native)</a></li> <li><a href="/scripting/renjin">R (Renjin)</a></li> <li><a href="/scripting/jruby">Ruby (JRuby)</a></li> <li><a href="/scripting/scala">Scala Scripting</a></li> </ul></details></li> <!-- Extend/Scripting/Languages --> </ul></details></li> <!-- Extend/Scripting --> <li><details open><summary><a href="/develop">Development</a></summary><ul> <li><a href="/develop/philosophy">Philosophy</a></li> <li><a href="/develop/architecture">Architecture</a></li> <li><a href="/develop/source">Source code</a></li> <li><a href="/develop/project-management">Project management</a></li> <li><a href="/develop/coding-style">Coding style</a></li> <li><a href="/develop/javadoc">Using Javadoc</a></li> <li><a href="/develop/debugging">Debugging</a></li> <li><a href="/develop/wish-list">Wish list</a></li> <li><details><summary>Tools</summary><ul> <li><a href="/develop/github">GitHub</a></li> <li><a href="/develop/maven">Maven</a></li> <li><a href="/develop/ci">CI/CD</a></li> <li><a href="/develop/dotfiles">Dotfiles</a></li> <li><details><summary><a href="/develop/ides">IDEs</a></summary><ul> <li><a href="/develop/eclipse">Eclipse</a></li> <li><a href="/develop/netbeans">NetBeans</a></li> <li><a href="/develop/intellij">IntelliJ IDEA</a></li> <li><a href="/develop/command-line">Command Line</a></li> </ul></details></li> </ul></details></li> <!-- Extend/Development/Tools --> <li><details open><summary>Guides</summary><ul> <li><a href="/develop/plugins">Writing plugins</a></li> <li><a href="/develop/improving-the-code">Contributing to a plugin</a></li> <li><a class="current-page">Development lifecycle</a></li> <li><a href="/develop/building-a-pom">Building a POM</a></li> <li><a href="/develop/debugging-exercises">Hands-on debugging</a></li> <li><a href="/develop/writing-ops">Adding new ops</a></li> <li><a href="/develop/formats">Adding new formats</a></li> <li><a href="/develop/native-libraries">Using native libraries</a></li> <li><a href="/develop/tips">Tips for developers</a></li> <li><a href="/develop/cpp-tips">Tips for C++ developers</a></li> <li><a href="/develop/ij1-plugins">ImageJ 1.x plugins</a></li> <li><a href="/develop/versioning">Versioning</a></li> <li><a href="/develop/logging">Logging</a></li> <li><a href="/develop/uber-jars">Uber-JARs</a></li> </ul></details></li> <!-- Extend/Development/Guides --> <li><details><summary><a href="/develop/git">Git</a></summary><ul> <li><a href="/develop/git/eclipse">Git in Eclipse (EGit)</a></li> <li><a href="/develop/git/mini-howto">Git mini howto</a></li> <li><a href="/develop/git/workshop">Git workshop</a></li> <li><a href="/develop/git/conflicts">Git conflicts</a></li> <li><a href="/develop/git/topic-branches">Git topic branches</a></li> <li><a href="/develop/git/notes">Git notes</a></li> <li><a href="/develop/git/reflogs">Git reflogs</a></li> <li><a href="/develop/git/submodules">Git submodules</a></li> <li><a href="/develop/git/pinpoint-regressions">How to pinpoint regressions</a></li> <li><a href="/develop/git/publish-a-repository">How to publish a git repository</a></li> <li><a href="/develop/git/extract-a-subproject">How to extract a subproject</a></li> </ul></details></li> <!-- Extend/Development/Git --> </ul></details></li> <!-- Extend/Development --> </ul></details></li> <!-- Extend --> <li><details><summary><a href="/contribute">Contribute</a></summary><ul> <li><a href="/contribute/citing">Citing</a></li> <li><a href="/people">Contributors</a></li> <li><a href="/orgs">Organizations</a></li> <li><a href="/contribute/governance">Governance</a></li> <li><a href="/contribute/funding">Funding</a></li> <li><a href="/contribute/fiji">Contributing to Fiji</a></li> <li><details><summary><a href="/licensing">Licensing</a></summary><ul> <li><details><summary><a href="/licensing/open-source">Open Source</a></summary><ul> <li><a href="/licensing/apache">Apache</a></li> <li><a href="/licensing/bsd">BSD</a></li> <li><a href="/licensing/epl">EPL</a></li> <li><a href="/licensing/gpl">GPL</a></li> <li><a href="/licensing/lgpl">LGPL</a></li> <li><a href="/licensing/mit">MIT</a></li> <li><a href="/licensing/public-domain">Public domain</a></li> <li><a href="/licensing/big">BIG</a></li> </ul></details></li> <!-- Contribute/Licensing/Open Source --> <li><a href="/licensing/closed-source">Proprietary</a></li> </ul></details></li> <!-- Contribute/Licensing --> <li><details><summary><a href="/editing">Editing the Wiki</a></summary><ul> <li><a href="/editing/advanced">Advanced Editing</a></li> <li><a href="/editing/buttons">Buttons</a></li> <li><a href="/editing/citations">Citations</a></li> <li><a href="/editing/code">Source Code</a></li> <li><a href="/editing/debugging">Debugging</a></li> <li><a href="/editing/headers">Headers</a></li> <li><a href="/editing/icons">Icons</a></li> <li><a href="/editing/images">Images</a></li> <li><a href="/editing/keys">Keyboard Shortcuts</a></li> <li><a href="/editing/linking">Linking</a></li> <li><a href="/editing/math">Math Expressions</a></li> <li><a href="/editing/menu-paths">Menu Paths</a></li> <li><a href="/editing/navigation">Navigation</a></li> <li><a href="/editing/notices">Notices</a></li> <li><a href="/editing/people">People</a></li> <li><a href="/editing/pitfalls">Pitfalls</a></li> <li><a href="/editing/quizzes">Quizzes</a></li> <li><a href="/editing/statbox">Statbox</a></li> <li><a href="/editing/symbols">Symbols</a></li> <li><a href="/editing/tables">Tables</a></li> <li><a href="/editing/timelines">Timelines</a></li> <li><a href="/editing/tooltips">Tooltips</a></li> <li><a href="/editing/videos">Videos</a></li> <li><a href="/editing/whitespace">Whitespace</a></li> </ul></details></li> <!-- Contribute/Editing the Wiki --> </ul></details></li> <!-- Contribute --> <li><details><summary><a href="/discuss">Discuss</a></summary><ul> <li><a href="/discuss/bugs">Reporting Issues</a></li> <li><a href="/discuss/mailing-lists">Mailing Lists</a></li> <li><a href="/discuss/chat">Chat</a></li> </ul></details></li> <!-- Discuss --> <li><details><summary>Explore</summary><ul> <li><a href="/news">News</a></li> <li><details><summary><a href="/events">Events</a></summary><ul> <li><a href="/events/presentations">Presentations</a></li> <li><a href="/events/conferences">Conferences</a></li> <li><a href="/events/hackathons">Hackathons</a></li> <li><a href="/events">More...</a></li> </ul></details></li> <!-- Discuss/Events --> <li><details><summary><a href="/libs">Libraries</a></summary><ul> <li><a href="/libs/imagej-ops">ImageJ Ops</a></li> <li><a href="/libs/imagej-common">ImageJ Common</a></li> <li><a href="/libs/imagej-legacy">ImageJ Legacy</a></li> <li><a href="/libs/scijava">SciJava</a></li> <li><a href="/libs/scifio">SCIFIO</a></li> <li><details><summary><a href="/libs/imglib2">ImgLib2</a></summary><ul> <li><a href="/libs/imglib2/getting-started">Getting Started</a></li> <li><a href="/libs/imglib2/accessors">Accessors</a></li> <li><a href="/libs/imglib2/accessibles">Accessibles</a></li> <li><a href="/libs/imglib2/examples">Examples</a></li> <li><a href="/libs/imglib2/workshop-introductory">Introductory Workshop</a></li> <li><a href="/libs/imglib2/workshop-advanced">Advanced Workshop</a></li> <li><a href="/libs/imglib2/matlab">ImgLib2 images in MATLAB</a></li> <li><a href="/libs/imglib2/benchmarks">Benchmarks</a></li> <li><a href="/libs/imglib2/faq">FAQ</a></li> <li><a href="/libs/imglib2/developing">Developing ImgLib2</a></li> <li><a href="/libs/imglib2/discussion">ImgLib2 Discussion</a></li> </ul></details></li> <!-- Explore/Libraries/ImgLib2 --> <li><a href="/libs">More...</a></li> </ul></details></li> <!-- Explore/Libraries --> <li><details><summary><a href="/software">Software</a></summary><ul> <li><a href="/software/nih-image">NIH Image</a></li> <li><a href="/software/imagej">ImageJ</a></li> <li><a href="/software/imagej2">ImageJ2</a></li> <li><a href="/software/fiji">Fiji</a></li> <li><a href="/software">More...</a></li> </ul></details></li> <!-- Explore/Software --> </ul></details></li> <!-- Explore --> </ul> </div> </ul> </div> </nav> <div id="dock-overlay-left" class="dock-overlay" data-dock-target="left-column"></div> <div id="dock-overlay-right" class="dock-overlay" data-dock-target="right-column"></div> <!-- Search results --> <div id="search-results"> <div id="search-hits"></div> <div id="pagination"></div> </div> <!-- Scripts --> <!-- Libraries --> <script src="/assets/js/jquery.min.js"></script> <script src="/assets/js/jquery.scrolly.min.js"></script> <script src="/assets/js/browser.min.js"></script> <script src="/assets/js/breakpoints.min.js"></script> <script src="/assets/js/util.js"></script> <script src="/assets/js/jquery.toc.js"></script> <script src="/assets/js/lightbox.min.js"></script> <!-- Extensions --> <!-- Site code --> <script src="/assets/js/main.js"></script> <script src="/assets/js/dock.js"></script> <script src="/assets/js/code.js"></script> <!-- Anchors --> <script src="https://cdn.jsdelivr.net/npm/anchor-js/anchor.min.js"></script> <script>anchors.add('#page h1, #page h2, #page h3, #page h4, #page h5, #page h6');</script> <!-- Citations --> <script src="https://cdn.jsdelivr.net/npm/citation-js@0.4.0-9"></script> <script src="/assets/js/cite.js"></script> <!-- Search --> <script src="https://cdn.jsdelivr.net/npm/algoliasearch@4.13.0/dist/algoliasearch-lite.umd.js"></script> <script src="https://cdn.jsdelivr.net/npm/instantsearch.js@4.40.3/dist/instantsearch.production.min.js"></script> <script src="/assets/js/search.js"></script> <script src="/assets/js/search-tweaks.js"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10