CINXE.COM
Decoupling | Open Microscopy Environment (OME)
<!doctype html> <html class="no-js" lang="en" dir="ltr"> <head> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-49953125-6"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-49953125-6'); </script> <meta charset="utf-8" /> <meta http-equiv="x-ua-compatible" content="ie=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="description" content="" /> <meta property="og:image" content="/img/logos/ome-logo_fb.png" /> <meta property="og:type" content="website" /> <meta property="og:url" content="" /> <meta property="og:title" content="The Open Microscopy Environment" /> <meta property="og:description" content="A consortium of universities, research labs, industry and developers producing open-source software and format standards for microscopy data." /> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="The Open Microscopy Environment"> <meta name="twitter:image" content="https://www.openmicroscopy.org/img/logos/ome-logomark_twitter.png"> <title>Decoupling | Open Microscopy Environment (OME)</title> <!-- favicon from https://realfavicongenerator.net/ --> <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=2"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png?v=2"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png?v=2"> <link rel="manifest" href="/site.webmanifest?v=2"> <link rel="mask-icon" href="/safari-pinned-tab.svg?v=2" color="#5bbad5"> <link rel="shortcut icon" href="/favicon.ico?v=2"> <meta name="msapplication-TileColor" content="#2b5797"> <meta name="theme-color" content="#ffffff"> <!-- Mastodon --> <link rel="me" href="https://fosstodon.org/@ome"/> <link rel="stylesheet" type="text/css" media="all" href="https://fonts.googleapis.com/css?family=Open+Sans:400,600,700,400italic,600italic,700italic"> <link rel="stylesheet" type="text/css" media="all" href="https://fonts.googleapis.com/css?family=Montserrat:400,500"> <link rel="stylesheet" type="text/css" media="all" href="/css/font-awesome.min.css"> <link rel="stylesheet" type="text/css" media="all" href="/css/foundation.min.css"> <link rel="stylesheet" type="text/css" media="all" href="/css/responsive-tables.css"> <link rel="stylesheet" type="text/css" media="all" href="/css/openmicroscopy.css"> </head> <body> <div class="title-bar" data-responsive-toggle="main-menu" data-hide-for="medium"> <button class="menu-icon" type="button" data-toggle></button> <div class="title-bar-title"></div> </div> <!--<div data-sticky-container> <div class="main-nav-bar top-bar" id="main-menu" data-sticky data-options="marginTop:0;">--> <div class="main-nav-bar top-bar" id="main-menu"> <div class="top-bar-left"> <ul class="vertical medium-horizontal dropdown menu" data-responsive-menu="accordion medium-dropdown"> <li class="hide-for-small-only"><a class="logo" href="/index.html"><img src="/img/logos/ome-main-nav.svg" alt="OME logo" /></a></li> <li class="show-for-small-only"><a href="/index.html"><img src="/img/logos/ome-logomark.svg" alt="OME logo" style="height:32px; width:32px;"/></a></li> <li class="has-submenu"><a href="/about/">About Us</a> <ul class="submenu menu vertical" data-submenu> <li><a href="/about/">Overview</a></li> <li><a href="/teams/">OME Teams</a></li> <li><a href="/contributors/">Contributors</a></li> <li><a href="/commercial-partners/">Commercial Partners</a></li> <li><a href="/licensing/">Licensing</a></li> <li><a href="/citing-ome/">Citing OME</a></li> <li><a href="/artwork/">Artwork</a></li> <li><a href="/training/">Training</a></li> <li><a href="/events/ome-community-meeting-2024/">OME 2024</a></li> </ul> </li> <li class="has-submenu"><a href="/news/">News</a> <ul class="submenu menu vertical" data-submenu> <li><a href="/news/">Overview</a></li> <li><a href="/announcements/">Announcements</a></li> <li><a href="/events/">Events</a></li> <li><a href="/minutes/">Minutes</a></li> <li><a href="/security/">Security</a></li> <li><a href="/careers/">Careers</a></li> <li><a href="/blog/">Blog</a></li> </ul> </li> </ul> </div> <div class="top-bar-right"> <ul class="vertical medium-horizontal dropdown menu" data-responsive-menu="accordion medium-dropdown"> <li class="has-submenu"><a href="/products/">Products</a> <ul class="submenu menu vertical" data-submenu> <li><a href="/products/">Overview</a></li> <li><a href="/omero/">OMERO</a></li> <li><a href="/bio-formats/">Bio-Formats</a></li> <li><a href="/ome-files/">OME Files</a></li> </ul> </li> <li class="has-submenu"><a href="/support/">Support</a> <ul class="submenu menu vertical" data-submenu> <li><a href="/support/">Overview</a></li> <li><a href="/security/">Security</a></li> <li><a href="/training/">Training</a></li> </ul> </li> <li><a href="/docs/">Docs</a></li> <li class="hide-for-small-only"><a href="/explore/" class="button btn-indigo" style="color: #eceff1; margin-left: 10px;">Explore</a></li> <li class="show-for-small-only"><a href="/explore/">Explore</a></li> </ul> </div> </div> <!--</div> make header sticky? --> <a name="top-of-page"></a> <!-- begin Post --> <div class="callout large primary" id="bg-image-blog"> <div class="row column text-center"> <h1>Decoupling</h1> <p></p> </div> </div> <hr class="invisible"> <div class="text-center"> <a id="back-to-top" href="/blog/"><i class="fa fa-arrow-left"></i> back to Blog</a> </div> <hr class="invisible"> <div class="row"> <div class="columns"> <p>We are in the process of getting rid of submodules and separating our code into smaller repositories. Why? And why should developers and users care?</p> <p>The OME development workflow has been following a single, integrated approach for the last couple of years. This means that all components of the OME stack, including <a href="http://www.openmicroscopy.org/site/products/omero">OMERO</a> and <a href="http://www.openmicroscopy.org/site/products/bio-formats">Bio-Formats</a> are versioned globally and released simultaneously. The only notable exception to this rule is the <a href="https://www.openmicroscopy.org/site/support/ome-model/">OME Data Model</a> which is released on its own release cycle to be consumed by major versions of Bio-Formats and OMERO.</p> <p>While such a global approach can simplify both internal and external communication to a certain extent, it does have several limitations for developers and users. For example, the increasingly-frequent security vulnerabilities (see the <a href="http://blog.openmicroscopy.org/tech-issues/2015/07/21/java-issue/">recent blog post about the Java security issue</a>) usually require one of our software components to be released with a very fast turnaround without modifying other components. A second example is the release of urgent bug fixes or support for new file formats in Bio-Formats. In the current approach, these updates are held back until a full release of OMERO and Bio-Formats is ready, delaying access and use by a very large community. A single release cycle across all components also does not scale with the diversity, the needs and the size of our user community.</p> <p>Starting with the 5.1.3 release, we are separating our various software, both at the codebase and release level. We call this process <em>decoupling</em>. This follows a development pattern adopted by other open-source softwares - see for example <a href="http://imagej.net/Architecture">http://imagej.net/Architecture</a>.</p> <p>The first concrete application of decoupling is Bio-Formats which had been included as a Git submodule of the OMERO source code since <a href="https://github.com/openmicroscopy/openmicroscopy/commit/1d12ad1f44fc042edc22093741a57d38e1074724">2011</a>. As of OMERO 5.1.3, Bio-Formats is now treated as any other dependency of OMERO, like Hibernate or Spring. This means:</p> <ul> <li>Bio-Formats is now released independently of OMERO as was the case for <a href="https://www.openmicroscopy.org/community/viewtopic.php?f=11&t=7859">Bio-Formats 5.1.3</a> and <a href="https://www.openmicroscopy.org/community/viewtopic.php?f=11&t=7869">OMERO 5.1.3</a>.</li> <li>Bio-Formats source code is no longer embedded either directly or via a submodule.</li> <li>Bio-Formats is no longer built as part of the <a href="http://www.openmicroscopy.org/site/support/omero5.1/developers/build-system.html">OMERO build system</a>. Instead, the JARs are referenced by their version and consumed from the <a href="http://artifacts.openmicroscopy.org/">OME artifactory</a> as part of the build.</li> </ul> <p>Bio-Formats decoupling comes at some cost, it increases the testing burden and the complexity of our build system, but delivers important benefits to the communities that use Bio-Formats such as <a href="https://imagej.net/ij/">ImageJ</a>, <a href="http://fiji.sc/Fiji">Fiji</a>, <a href="http://www.cellprofiler.org/">CellProfiler</a>, <a href="https://www.knime.org/">KNIME</a>, <a href="http://icy.bioimageanalysis.org/">Icy</a>, <a href="http://www.mathworks.com/products/matlab/">Matlab</a>, and others.</p> <p>In the near future, other components of OMERO and Bio-Formats may undergo the same split process. Amongst potential decoupling candidates are:</p> <ul> <li>all C++ projects for both OMERO and Bio-Formats</li> <li>all Bio-Formats and OMERO code generation</li> <li>OME documentation</li> </ul> <p>We hope this change is useful for the community. One of the great things about open source software is the ability to learn, change, and adapt, especially as we integrate feedback from the <a href="https://www.openmicroscopy.org/site/community/">community</a>. We welcome comments from users and developers, and any ideas on how we can continue to improve the tools we deliver.</p> </div> </div> <div class="row"> <div class="column"> <p class="text-right"> — <i>July 30, 2015</i> </p> </div> </div> <!-- end Post --> <!-- begin anchor --> <div class="text-center"> <a id="back-to-top" href="#top-of-page"><i class="fa fa-arrow-up"></i> back to top</a> </div> <!-- end anchor --> <hr class="whitespace"> <div id="footer" class="callout large secondary"> <div class="row"> <div class="small-12 medium-4 columns"> <div class="medium-4"><a href="/index.html"><img class="footer-logo" src="/img/logos/ome-main-nav.svg" alt="OME logo" /></a></div> <p>© 2005-2024 University of Dundee & Open Microscopy Environment. <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank">Creative Commons Attribution 4.0 International License</a></p> <p>OME source code is available under the <a href="https://www.gnu.org/copyleft/gpl.html">GNU General public license</a> or more permissive open source licenses, or through commercial license from <a href="https://www.glencoesoftware.com" target="_blank">Glencoe Software Inc.</a><br/>OME, Bio-Formats, OMERO, IDR and their associated logos are trademarks of <a href="https://www.glencoesoftware.com" target="_blank">Glencoe Software Inc.</a>, which holds these marks to protect them on behalf of the OME community.</p> <p class="tiny-print" style="float:left;">[ <a href="/site-map/">Site Map</a> ]</p> <p class="tiny-print" style="float:right;">Version: 2024.11.21</p> </div> <div class="medium-2 columns"> <h6>Learn About Us</h6> <ul class="menu vertical"> <li><a href="/about/">Who We Are</a></li> <li><a href="/teams/">Our Team</a></li> <li><a href="/explore/">What We Can Do</a></li> <li><a href="/news/">What We鈥檙e Up To</a></li> <li><a href="/events/ome-community-meeting-2024/">OME 2024</a></li> <li class="hide-for-large-only"> </li> </ul> </div> <div class="medium-2 columns"> <h6>Try Our Products</h6> <ul class="menu vertical"> <li><a href="/omero/downloads/">OMERO <span class="badge">Download</span></a></li> <li><a href="/bio-formats/downloads">Bio-Formats <span class="badge">Download</span></a></li> <li><a href="/ome-files/downloads">OME Files <span class="badge">Download</span></a></li> <li class="hide-for-large-only"> </li> </ul> </div> <div class="medium-2 columns"> <h6>Knowledge Base</h6> <ul class="menu vertical"> <li><a href="/support/">Support</a></li> <li><a href="/docs/">Documentation</a></li> <li><a href="https://omero-guides.readthedocs.io/">User Guides</a></li> <li><a href="https://www.openmicroscopy.org/forums">Forum</a></li> <li><a href="https://www.openmicroscopy.org/security/advisories/">Security Advisories</a></li> <li class="hide-for-large-only"> </li> </ul> </div> <div class="medium-2 columns end"> <h6>OME Public</h6> <ul class="menu vertical"> <li><a href="https://twitter.com/openmicroscopy" target="_blank"><i class="fa fa-fw fa-twitter"></i> Twitter</a></li> <li><a href="https://www.linkedin.com/company/ome---open-microscopy-environment" target="_blank"><i class="fa fa-fw fa-linkedin"></i> LinkedIn</a></li> <li><a href="https://www.facebook.com/openmicroscopy" target="_blank"><i class="fa fa-fw fa-facebook"></i> Facebook</a></li> <!-- <li><a href="http://webchat.freenode.net/?channels=%23ome&uio=d4" target="_blank"><i class="fa fa-fw fa-comments"></i> IRC</a></li> --> <li><a href="/on-the-web/" target="_blank"><i class="fa fa-globe"></i> On the Web</a></li> <li class="hide-for-large-only"> </li> </ul> </div> </div> </div> <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> <script src="/js/vendor/jquery.js"></script> <script src="/js/vendor/what-input.js"></script> <script src="/js/vendor/foundation.js"></script> <script src="/js/app.js"></script> <script src="/js/responsive-tables.js"></script> <script> $(document).foundation(); try { // helper function to filter out empty paths (trailing slash) var omitEmpty = function(el) { return el.trim() !== ''}; // extract last path bit from url var paths = document.location.pathname.split('/').filter(omitEmpty); var path = paths[paths.length-1]; // helper function to find and set active option var setActiveNavOption = function(el) { var subPaths = el.href.split('/').filter(omitEmpty); var subPath = subPaths[subPaths.length-1]; if (subPath === path) { $(el).addClass('is-active'); return true } return false; } // check if we have a .header-subnav match? var hasSubMenu = false; $(".header-subnav li a").each(function(i, el) { var isMatch = setActiveNavOption(el); if (isMatch) { hasSubMenu = true; return false; } }); // find corresponding path bit for .menu-subnav option if (hasSubMenu && paths.length > 1) { var parentPath = paths[paths.length-2]; if (parentPath !== 'omero') path = parentPath; } // set .menu-subnav option $(".menu-subnav li a").each(function(i, el) { if (setActiveNavOption(el)) return false; }); } catch(ignored) {} </script> </body> </html>