# Search Paths

## Introduction

If you install the official binary distribution of Micro-Manager, you will not need to configure any search paths. However, if you have built Micro-Manager yourself from the source, or are running Micro-Manager in a special way (e.g. from MATLAB or from your own application), then you need to ensure that the Core library and device adapters are correctly located.

There are two sections in this page: how device adapters are loaded by the Core, and how the MMCoreJ_wrap native library is loaded. The latter, of course, only applies if you are using the Core from Java.

Each of the two sections is divided into two parts: the Old Mechanism and the New Mechanism. The New Mechanism is available since SVN r12743, the nightly build of 20140210, or release 1.4.17. It has not been clarified when the Old Mechanism took its current shape. The Old Mechanism still works (except for a few corner cases that were essentially bugs), but its use in new code is discouraged.

A quick summary: If you are using a version of MM after the New Mechanism was added, and are using MMCoreJ, simply set the Java system property mmcorej.library.path to the path to the directory containing MMCoreJ_wrap and the device adapters. This can be done by passing the command-line argument

 -Dmmcorej.library.path=/path/to/libraries


to Java, or by calling

 System.setProperty("mmcorej.library.path", "/path/to/libraries");


#### The Old Mechanism

The Core searches a list of paths. Paths can be added to the list by calling the static method CMMCore::addSearchPath() (mmcorej.CMMCore.addSearchPath() in Java). There is no way to remove or reorder the paths.

The list of device adapters located in the search paths can be queried with CMMCore::getDeviceLibraries().

If you are running the Core by itself, the list of search paths is initially empty. However, if you are using MMCoreJ (i.e. running from Java), this is not the case.

In the case of MMCoreJ only, the search path is initially populated with some default paths. Before the New Mechanism was introduced, the default paths were the following ($JARPATH represents the directory containing MMCoreJ.jar, and $FIJIPLATFORM is one of win32, win64, macosx, linux32, or linux64):

• $JARPATH • $JARPATH/..
• $JARPATH/../mm/$FIJIPLATFORM
• $JARPATH/../.. • $JARPATH/../../mm/$FIJIPLATFORM • On Linux only, a compile-time hard-coded path where libraries are expected to be located Java code that was written to work with the Old Mechanism should still work for the time being, as long as the device adapters are located wither in the same directory as MMCoreJ_wrap (i.e. MMCoreJ_wrap.dll or libMMCoreJ_wrap.jnilib or libMMCoreJ_wrap.so) or in a directory explicitly added by calling CMMCore::addSearchPath(). If you are placing your device adapters in a different directory from MMCoreJ_wrap, you need to either add that directory to the search path or switch to using the New Mechanism. #### The New Mechanism In the New Mechanism, the static methods CMMCore::addSearchPath() and CMMCore::getDeviceLibraries() are deprecated. Instead, there are new instance methods: CMMCore::setDeviceAdapterSearchPaths(), CMMCore::getDeviceAdapterSearchPaths(), and CMMCore::getDeviceAdapterNames(). To ensure consistent behavior, the Old (deprecated) and New methods should not be mixed within the same program. Regardless of whether you are running from Java or not, the list of search paths initially includes the path where the library (or executable) containing the Core is located. So, for example, if your device adapters are in the same directory as the MMCoreJ_wrap native library, they will be found without the need to set the search paths. ### MMCoreJ_wrap Search Paths #### The Old Mechanism MMCoreJ_wrap (MMCoreJ_wrap.dll, libMMCoreJ_wrap.jnilib, or libMMCoreJ_wrap.so) is searched for in the following directories ($JARPATH represents the directory containing MMCoreJ.jar, and $FIJIPLATFORM is one of win32, win64, macosx, linux32, or linux64): • $JARPATH
• $JARPATH/.. • $JARPATH/../mm/$FIJIPLATFORM • $JARPATH/../..
• $JARPATH/../../mm/$FIJIPLATFORM
• On Linux only, a compile-time hard-coded path where libraries are expected to be located

If it is not found in any of the above directories, it is loaded from the system default native library paths, usually given by the Java system property java.library.path.

#### The New Mechanism

If the Java system property mmcorej.library.path is set, that path (and only that path) is searched for MMCoreJ_wrap. This is the preferred mechanism and should be used by any new launchers.

Otherwise, for backward compatibility, the following paths are searched:

• $JARPATH • $JARPATH/..
• $JARPATH/../mm/$FIJIPLATFORM
• $JARPATH/../.. • $JARPATH/../../mm/\$FIJIPLATFORM
• On Linux only, a compile-time hard-coded path where libraries are expected to be located

If it is not found in any of the above directories, it is loaded from the system default native library paths, usually given by the Java system property java.library.path.

(The “Linux only” hard-coded path may be made configurable in the future, so that it can be enabled or disabled at build time on both OS X and Linux.)