Skip to content

Fix Graal initialization - #21444

Draft
Nadahar wants to merge 1 commit into
openhab:mainfrom
Nadahar:graal-sync
Draft

Fix Graal initialization#21444
Nadahar wants to merge 1 commit into
openhab:mainfrom
Nadahar:graal-sync

Conversation

@Nadahar

@Nadahar Nadahar commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

This is a companion PR of openhab/openhab-core#5787. The build will fail because the changes from openhab/openhab-core#5787 aren't in core.

I've done multiple things to make Graal initialization work. I'm hopeful that this will also make it possible to install and uninstall Graal based add-ons without restarting.

The steps are:

  • Swapping the classloader while creating the engine
  • Using the core GraalUtil for thread-safe language resolution
  • Implementing isReady() to indicate when initialization is complete
  • Breaking the cyclic dependency caused by the dependency trackers

Together these things make this seem dead stable to me. I can't say for sure that every measure is required; I've just worked to solve the problems I've met along the way. Maybe some aren't ultimately necessary, but I've included it all. Some things might be "better" even if they weren't the direct cause of the initialization problems.

I'm creating this as a draft, because both this and the core PR need further evaluation/discussion/testing.

The fix consists of swapping the classloader while creating the engine, using the core GraalUtil for language resolution, implementing `isReady()` to indicate when initialization is complete, and breaking the cyclic dependency caused by the dependency trackers. In addition, the features have been modified to rely on the core defined Graal features.

Signed-off-by: Ravi Nadahar <nadahar@rediffmail.com>
@Nadahar

Nadahar commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

@florian-h05 @HolgerHees FYI.

@HolgerHees

Copy link
Copy Markdown
Contributor

How did you test it if the core component is missing?

I have to admit, I’ve never compiled and enabled parts of the core itself.

I’d like to test it.

@Nadahar

Nadahar commented Aug 23, 2026

Copy link
Copy Markdown
Contributor Author

I always work with both core and addons in parallel, so for me that's no problem.

To make this work, you must check-out and build openhab/openhab-core#5787. That installs "that version of core" into your local .m2 folder, so that when you then build this PR, it builds against that core.

I do however use the "demo app" to run OH. If you use Karaf, you must then build the distro itself, and then either use the -Pdev parameter to build to a local folder (which I don't think will build the add-ons, not sure), or do a full distro build that produces a compressed archive that you can unpack and run wherever you like.

Running the "demo app" is quite easy normally, just go to the launch/app folder, resolve, and run. But, in this case, it's not so easy, since you have to modify the .bndrun file quite a lot to get all the missing pieces in - and add dependencies to the POM.

If you want to try to "demo app" route (which is definitely quicker if it works, I can provide the files I used. They do include other stuff not relevant for this, like bindings I'm working on or use for testing etc., and you might need to remove some of them to make it resolve (because you don't have "my" bindings in your .m2 repo), but here they are:

pom.xml:

<?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>

  <groupId>org.openhab.demo</groupId>
  <artifactId>org.openhab.demo.app</artifactId>
  <version>5.3.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>openHAB Demo :: App</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <oh.java.version>21</oh.java.version>
    <maven.compiler.release>${oh.java.version}</maven.compiler.release>
    <bnd.version>7.1.0</bnd.version>
    <graalvm.version>25.0.1</graalvm.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.openhab.core.bom</groupId>
      <artifactId>org.openhab.core.bom.runtime</artifactId>
      <version>${project.version}</version>
      <type>pom</type>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.core.bom</groupId>
      <artifactId>org.openhab.core.bom.openhab-core</artifactId>
      <version>${project.version}</version>
      <type>pom</type>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.ui.bom</groupId>
      <artifactId>org.openhab.ui.bom.openhab-ui</artifactId>
      <version>${project.version}</version>
      <type>pom</type>
      <scope>runtime</scope>
    </dependency>

    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.milllan</artifactId>
      <version>1.0.2-SNAPSHOT</version>
      <scope>runtime</scope>
    </dependency>

    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.shelly</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>

    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.enocean</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.automation.jsscripting</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.automation.pythonscripting</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.automation.jrubyscripting</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.automation.groovyscripting</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.automation.jythonscripting</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.automation.pythonscripting</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.basicprofiles</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.bin2json</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.exec</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.jinja</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.jsonpath</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.map</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.regex</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.scale</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.xpath</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.transform.xslt</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.chromecast</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.exec</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.energidataservice</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.unifiprotect</artifactId>
      <version>4.0.0-SNAPSHOT</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.network</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.astro</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.onkyo</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.upnpcontrol</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.ecobee</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.ntfy</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.io.mcp</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.core.bundles</groupId>
      <artifactId>org.openhab.core.config.discovery.usbserial.windowsregistry</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.zwave</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.io.thingtypes</artifactId>
      <version>1.0.1-SNAPSHOT</version>
      <scope>runtime</scope>
    </dependency>

    <!-- GraalVM dependencies -->
    <dependency>
      <groupId>org.openhab.core.bundles</groupId>
      <artifactId>org.openhab.core.graal</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.polyglot.polyglot</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.js.js-scriptengine</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.js.js-language</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.python.python-language</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.python.python-resources</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.llvm.llvm-api</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.regex.regex</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.sdk.collections</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.sdk.nativeimage</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.sdk.jniutils</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.sdk.word</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.shadowed.icu4j</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.shadowed.json</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.shadowed.xz</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.tools.chromeinspector-tool</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.tools.profiler-tool</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.truffle.truffle-api</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.truffle.truffle-nfi</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.truffle.truffle-nfi-libffi</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.truffle.truffle-compiler</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openhab.osgiify</groupId>
      <artifactId>org.graalvm.truffle.truffle-runtime</artifactId>
      <version>${graalvm.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.shell.remote</artifactId>
      <version>1.2.0</version>
    </dependency>

<!-- uncomment this and add the name of your binding that you want to work on
    <dependency>
      <groupId>org.openhab.addons.bundles</groupId>
      <artifactId>org.openhab.binding.YOURBINDINGNAME</artifactId>
      <version>${project.version}</version>
      <scope>runtime</scope>
    </dependency>
-->

<!-- uncomment this if you want to work on the Zigbee binding
    <dependency>
      <groupId>org.openhab.addons.bom</groupId>
      <artifactId>org.openhab.addons.bom.zigbee</artifactId>
      <version>${project.version}</version>
      <type>pom</type>
      <scope>runtime</scope>
    </dependency>
-->

  </dependencies>

  <build>
    <pluginManagement>
      <plugins>
        <!-- Use the bnd-maven-plugin and assemble the symbolic names -->
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-maven-plugin</artifactId>
          <version>${bnd.version}</version>
          <executions>
            <execution>
              <goals>
                <goal>bnd-process</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <!-- Required to make the maven-jar-plugin pick up the bnd generated manifest. Also avoid packaging empty Jars -->
        <!-- Moved... -->

        <!-- Setup the indexer for running and testing -->
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-indexer-maven-plugin</artifactId>
          <version>${bnd.version}</version>
          <configuration>
            <localURLs>REQUIRED</localURLs>
            <attach>false</attach>
          </configuration>
          <executions>
            <execution>
              <id>index</id>
              <goals>
                <goal>index</goal>
              </goals>
              <configuration>
                <indexName>${project.artifactId}</indexName>
              </configuration>
            </execution>
            <execution>
              <id>test-index</id>
              <goals>
                <goal>index</goal>
              </goals>
              <configuration>
                <indexName>${project.artifactId}</indexName>
                <outputFile>${project.build.directory}/test-index.xml</outputFile>
                <scopes>
                  <scope>test</scope>
                </scopes>
              </configuration>
            </execution>
          </executions>
        </plugin>

        <!-- Define the version of the resolver plugin we use -->
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-resolver-maven-plugin</artifactId>
          <version>${bnd.version}</version>
          <configuration>
            <failOnChanges>false</failOnChanges>
            <bndruns>
            </bndruns>
          </configuration>
          <executions>
            <execution>
              <goals>
                <goal>resolve</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <!-- Define the version of the export plugin we use -->
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-export-maven-plugin</artifactId>
          <version>${bnd.version}</version>
          <configuration>
            <resolve>true</resolve>
            <failOnChanges>true</failOnChanges>
          </configuration>
          <executions>
            <execution>
              <goals>
                <goal>export</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <!-- Define the version of the testing plugin that we use -->
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-testing-maven-plugin</artifactId>
          <version>${bnd.version}</version>
          <executions>
            <execution>
              <goals>
                <goal>testing</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <!-- Define the version of the baseline plugin we use and avoid failing when no baseline jar exists. -->
        <!-- (for example before the first release) -->
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-baseline-maven-plugin</artifactId>
          <version>${bnd.version}</version>
          <configuration>
            <failOnMissing>false</failOnMissing>
          </configuration>
          <executions>
            <execution>
              <goals>
                <goal>baseline</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <!-- Allow running openHAB demo app from a Maven/bnd task -->
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-run-maven-plugin</artifactId>
          <version>${bnd.version}</version>
          <configuration>
            <includeDependencyManagement>true</includeDependencyManagement>
            <bndrun>app.bndrun</bndrun>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.4.0</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.13.0</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>3.1.3</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-enforcer-plugin</artifactId>
          <version>3.5.0</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-install-plugin</artifactId>
          <version>3.1.3</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.4.2</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>3.11.2</version>
          <configuration>
            <outputDirectory>${project.build.directory}/site</outputDirectory>
            <failOnError>!${quality.skip}</failOnError>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-plugin-plugin</artifactId>
          <version>3.15.1</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-release-plugin</artifactId>
          <version>3.1.1</version>
          <configuration>
            <preparationGoals>clean install</preparationGoals>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.13.0</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.21.0</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
          <version>3.3.1</version>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>3.5.2</version>
        </plugin>

        <!-- This plugin's configuration is used to store Eclipse m2e settings only. -->
        <!-- It has no influence on the Maven build itself. -->
        <plugin>
          <groupId>org.eclipse.m2e</groupId>
          <artifactId>lifecycle-mapping</artifactId>
          <version>1.0.0</version>
          <configuration>
            <lifecycleMappingMetadata>
              <pluginExecutions>
                <pluginExecution>
                  <pluginExecutionFilter>
                    <groupId>biz.aQute.bnd</groupId>
                    <artifactId>bnd-indexer-maven-plugin</artifactId>
                    <versionRange>[3.1.0,)</versionRange>
                    <goals>
                      <goal>index</goal>
                      <goal>local-index</goal>
                    </goals>
                  </pluginExecutionFilter>
                  <action>
                    <ignore></ignore>
                  </action>
                </pluginExecution>
              </pluginExecutions>
            </lifecycleMappingMetadata>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>

    <plugins>
      <plugin>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>bnd-run-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>bnd-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>bnd-export-maven-plugin</artifactId>
        <configuration>
          <failOnChanges>false</failOnChanges>
          <bndruns>
            <bndrun>app.bndrun</bndrun>
          </bndruns>
        </configuration>
      </plugin>
      <plugin>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>bnd-resolver-maven-plugin</artifactId>
        <configuration>
          <bndruns>
            <bndrun>app.bndrun</bndrun>
          </bndruns>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <repositories>
    <repository>
      <id>openhab-artifactory-release</id>
      <name>JFrog Artifactory Repository</name>
      <url>https://openhab.jfrog.io/openhab/libs-release</url>
      <releases>
        <enabled>true</enabled>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>openhab-artifactory-snapshot</id>
      <name>JFrog Artifactory Repository</name>
      <url>https://openhab.jfrog.io/openhab/libs-snapshot</url>
      <releases>
        <enabled>false</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>daily</updatePolicy>
      </snapshots>
    </repository>
  </repositories>

  <profiles>
    <profile>
      <id>with-bnd-resolver-resolve</id>
      <activation>
        <property>
          <name>withResolver</name>
        </property>
      </activation>
      <build>
        <pluginManagement>
          <plugins>
            <plugin>
              <groupId>biz.aQute.bnd</groupId>
              <artifactId>bnd-resolver-maven-plugin</artifactId>
              <version>${bnd.version}</version>
              <executions>
                <execution>
                  <goals>
                    <goal>resolve</goal>
                  </goals>
                  <phase>package</phase>
                </execution>
              </executions>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </profile>
    <profile>
      <id>j21</id>
      <properties>
        <oh.java.version>21</oh.java.version>
        <maven.compiler.release>${oh.java.version}</maven.compiler.release>
      </properties>
    </profile>
  </profiles>

</project>

app.bndrun:

-resolve.effective: active

feature.logging: \
	bnd.identity;id='org.ops4j.pax.logging.pax-logging-api',\
	bnd.identity;id='org.ops4j.pax.logging.pax-logging-log4j2'

feature.debug: \
	osgi.identity;filter:='(osgi.identity=org.apache.felix.webconsole)',\
	osgi.identity;filter:='(osgi.identity=org.apache.felix.webconsole.plugins.ds)',\
	osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)',\
	osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.runtime)',\
	osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)',\
	osgi.identity;filter:='(osgi.identity=org.apache.felix.shell.remote)'

feature.openhab-base: \
	bnd.identity;id='org.openhab.core',\
	bnd.identity;id='org.openhab.core.audio',\
	bnd.identity;id='org.openhab.core.auth.jaas',\
	bnd.identity;id='org.openhab.core.addon',\
	bnd.identity;id='org.openhab.core.config.core',\
	bnd.identity;id='org.openhab.core.config.discovery',\
	bnd.identity;id='org.openhab.core.config.dispatch',\
	bnd.identity;id='org.openhab.core.id',\
	bnd.identity;id='org.openhab.core.io.console',\
	bnd.identity;id='org.openhab.core.io.http',\
	bnd.identity;id='org.openhab.core.io.http.auth',\
	bnd.identity;id='org.openhab.core.io.monitor',\
	bnd.identity;id='org.openhab.core.io.net',\
	bnd.identity;id='org.openhab.core.io.rest',\
	bnd.identity;id='org.openhab.core.io.rest.auth',\
	bnd.identity;id='org.openhab.core.io.rest.core',\
	bnd.identity;id='org.openhab.core.io.rest.sse',\
	bnd.identity;id='org.openhab.core.model.yaml',\
	bnd.identity;id='org.openhab.core.semantics',\
	bnd.identity;id='org.openhab.core.storage.json',\
	bnd.identity;id='org.openhab.core.thing',\
	bnd.identity;id='org.openhab.core.transform',\
	bnd.identity;id='org.openhab.core.voice'

feature.openhab-model-runtime-all: \
	bnd.identity;id='org.openhab.core.model.item.runtime',\
	bnd.identity;id='org.openhab.core.model.persistence.runtime',\
	bnd.identity;id='org.openhab.core.model.rule.runtime',\
	bnd.identity;id='org.openhab.core.model.script.runtime',\
	bnd.identity;id='org.openhab.core.model.sitemap.runtime',\
	bnd.identity;id='org.openhab.core.model.thing.runtime'

feature.graalvm-core: bnd.identity;id='org.graalvm.polyglot.polyglot',bnd.identity;id='org.graalvm.regex.regex',bnd.identity;id='org.graalvm.sdk.collections',bnd.identity;id='org.graalvm.sdk.jniutils',bnd.identity;id='org.graalvm.sdk.nativeimage',bnd.identity;id='org.graalvm.sdk.word',bnd.identity;id='org.graalvm.shadowed.icu4j',bnd.identity;id='org.graalvm.shadowed.json',bnd.identity;id='org.graalvm.shadowed.xz',bnd.identity;id='org.graalvm.tools.chromeinspector-tool',bnd.identity;id='org.graalvm.tools.profiler-tool',bnd.identity;id='org.graalvm.truffle.truffle-api',bnd.identity;id='org.graalvm.truffle.truffle-compiler',bnd.identity;id='org.graalvm.truffle.truffle-runtime',bnd.identity;id='org.openhab.core.graal'

feature.jsscripting: bnd.identity;id='org.openhab.automation.jsscripting',bnd.identity;id='org.graalvm.js.js-language',bnd.identity;id='org.graalvm.js.js-scriptengine'

feature.pythonscripting: bnd.identity;id='org.openhab.automation.pythonscripting',bnd.identity;id='org.graalvm.python.python-language',bnd.identity;id='org.graalvm.python.python-resources',bnd.identity;id='org.graalvm.llvm.llvm-api',bnd.identity;id='org.graalvm.truffle.truffle-nfi',bnd.identity;id='org.graalvm.truffle.truffle-nfi-libffi'

-runrequires: \
	bnd.identity;id='org.eclipse.equinox.metatype',\
	${feature.logging},\
	${feature.debug},\
	${feature.openhab-base},\
	${feature.openhab-model-runtime-all},\
	${feature.graalvm-core},\
	${feature.jsscripting},\
	${feature.pythonscripting},\
	bnd.identity;id='org.openhab.core.addon.eclipse',\
	bnd.identity;id='org.openhab.core.addon.marketplace',\
	bnd.identity;id='org.openhab.core.automation',\
	bnd.identity;id='org.openhab.core.automation.module.media',\
	bnd.identity;id='org.openhab.core.automation.module.script',\
	bnd.identity;id='org.openhab.core.automation.module.script.providersupport',\
	bnd.identity;id='org.openhab.core.automation.module.script.rulesupport',\
	bnd.identity;id='org.openhab.core.automation.rest',\
	bnd.identity;id='org.openhab.core.io.console.rfc147',\
	bnd.identity;id='org.openhab.core.io.rest.sitemap',\
	bnd.identity;id='org.openhab.core.io.rest.swagger',\
	bnd.identity;id='org.openhab.core.io.rest.transform',\
	bnd.identity;id='org.openhab.core.io.rest.ui',\
	bnd.identity;id='org.openhab.core.io.websocket',\
	bnd.identity;id='org.openhab.ui',\
	bnd.identity;id='org.openhab.ui.basic',\
	bnd.identity;id='org.openhab.ui.iconset.classic',\
	bnd.identity;id='org.apache.aries.jax.rs.whiteboard',\
	bnd.identity;id='org.ops4j.pax.web.pax-web-extender-whiteboard',\
	bnd.identity;id='org.openhab.transform.basicprofiles',\
	bnd.identity;id='org.openhab.transform.exec',\
	bnd.identity;id='org.openhab.transform.map',\
	bnd.identity;id='org.openhab.transform.regex',\
	bnd.identity;id='org.openhab.transform.scale',\
	bnd.identity;id='org.openhab.transform.xpath',\
	bnd.identity;id='org.openhab.transform.xslt',\
	bnd.identity;id='org.openhab.core.io.rest.transform',\
	bnd.identity;id='org.openhab.core.transform',\
	bnd.identity;id='org.openhab.core.io.rest.audio',\
	bnd.identity;id='org.openhab.core.io.rest',\
	bnd.identity;id='org.openhab.core.io.rest.core',\
	bnd.identity;id='org.openhab.core.io.rest.log',\
	bnd.identity;id='org.openhab.core.io.rest.mdns',\
	bnd.identity;id='org.openhab.core.io.rest.sse',\
	bnd.identity;id='org.openhab.core.io.rest.voice',\
	bnd.identity;id='org.openhab.automation.groovyscripting',\
	bnd.identity;id='org.openhab.binding.unifiprotect',\
	bnd.identity;id='org.openhab.binding.shelly',\
	bnd.identity;id='org.openhab.binding.enocean',\
	bnd.identity;id='org.openhab.core.model.yaml',\
	bnd.identity;id='org.openhab.binding.milllan',\
	bnd.identity;id='org.openhab.binding.exec',\
	bnd.identity;id='org.openhab.binding.astro',\
	bnd.identity;id='org.openhab.binding.chromecast',\
	bnd.identity;id='org.openhab.core.config.discovery.addon.usb',\
	bnd.identity;id='org.openhab.core.config.discovery.usbserial',\
	bnd.identity;id='org.openhab.core.config.discovery',\
	bnd.identity;id='org.openhab.core.config.discovery.addon',\
	bnd.identity;id='org.openhab.core.config.discovery.usbserial.windowsregistry',\
	bnd.identity;id='org.openhab.binding.upnpcontrol',\
	bnd.identity;id='org.openhab.core.config.discovery.addon.upnp',\
	bnd.identity;id='org.openhab.core.config.discovery.upnp',\
	bnd.identity;id='org.openhab.core.io.transport.upnp',\
	bnd.identity;id='org.jupnp',\
	bnd.identity;id='org.openhab.binding.onkyo',\
	bnd.identity;id='org.openhab.binding.zwave',\
	bnd.identity;id='org.openhab.io.thingtypes',\
	bnd.identity;id='org.openhab.core.automation.module.script.providersupport',\
	bnd.identity;id='org.openhab.binding.energidataservice',\
	bnd.identity;id='org.openhab.core.model.sitemap',\
	bnd.identity;id='org.openhab.core.sitemap',\
	bnd.identity;id='org.openhab.core.ephemeris',\
	bnd.identity;id='org.openhab.core.semantics',\
	bnd.identity;id='org.openhab.binding.ecobee',\
	bnd.identity;id='org.openhab.binding.ntfy'

-runfw: org.eclipse.osgi

-runee: JavaSE-21

-runrequires.ee: \
	bnd.identity;id='jakarta.xml.bind-api',\
	bnd.identity;id='org.apache.servicemix.specs.activation-api-1.2.1',\
	bnd.identity;id='org.apache.servicemix.specs.annotation-api-1.3',\
	bnd.identity;id='org.glassfish.hk2.osgi-resource-locator'

-runproperties: \
	felix.cm.dir=${.}/runtime/userdata/config,\
	org.osgi.framework.bootdelegation=*,\
	org.osgi.service.http.port=8080,\
	osgi.console=,\
	osgi.console.enable.builtin=false,\
	org.apache.cxf.osgi.http.transport.disable=true,\
	org.ops4j.pax.logging.DefaultServiceLog.level=ERROR,\
	openhab.servicecfg=${.}/runtime/services.cfg,\
	openhab.runtime=${.}/runtime/runtime,\
	openhab.conf=${.}/runtime/conf,\
	openhab.userdata=${.}/runtime/userdata,\
	openhab.logdir=${.}/runtime/userdata/logs,\
	org.osgi.framework.system.packages.extra=jdk.internal.access,\
	equinox.osgi.unnamed.modules=true,\
	osgi.shell.telnet.ip=0.0.0.0,\
	osgi.shell.telnet.port=1111

-runblacklist: \
	bnd.identity;id='jakarta.ws.rs-api',\
	bnd.identity;id='org.apache.aries.jpa.container',\
	bnd.identity;id='org.apache.karaf.kar.core',\
	bnd.identity;id='org.openhab.core.addon.marketplace.karaf',\
	bnd.identity;id='org.openhab.core.io.console.karaf',\
	bnd.identity;id='org.openhab.core.karaf',\
	bnd.identity;id='org.openhab.core.test',\
	bnd.identity;id='osgi.annotation',\
	bnd.identity;id='osgi.cmpn',\
	bnd.identity;id='osgi.core',\
	bnd.identity;id='slf4j.api',\
	bnd.identity;id='slf4j.simple'

-runvm: \
	-Djdk.util.zip.disableZip64ExtraFieldValidation=true,\
	-Djava.io.tmpdir=C:\\temp\\EclipseOpenHAB,\
	-Dpolyglotimpl.DisableClassPathIsolation=true,\
	--add-opens=java.base/java.io=ALL-UNNAMED,\
	--add-opens=java.base/java.lang=ALL-UNNAMED,\
	--add-opens=java.base/java.lang.reflect=ALL-UNNAMED,\
	--add-opens=java.base/java.net=ALL-UNNAMED,\
	--add-opens=java.base/java.security=ALL-UNNAMED,\
	--add-opens=java.base/java.text=ALL-UNNAMED,\
	--add-opens=java.base/java.time=ALL-UNNAMED,\
	--add-opens=java.base/java.util=ALL-UNNAMED,\
	--add-opens=java.desktop/java.awt.font=ALL-UNNAMED,\
	--add-opens=java.naming/javax.naming.spi=ALL-UNNAMED,\
	--add-opens=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED,\
	--add-exports=java.base/jdk.internal.access=ALL-UNNAMED,\
	--add-opens=java.base/jdk.internal.access=ALL-UNNAMED,\
	--add-opens=java.base/sun.misc=ALL-UNNAMED,\
	--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED,\
	--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED,\
	--add-opens=jdk.unsupported/sun.misc=ALL-UNNAMED

-runbootdelegation: \
	jdk.internal.access.*,\
	jdk.internal.access

-runsystempackages: \
	jdk.internal.access,\
	sun.misc;from="jdk.unsupported"

-runsystemcapabilities: \
	osgi.serviceloader;osgi.serviceloader="org.graalvm.polyglot.impl.LanguageProvider",\
	osgi.serviceloader;osgi.serviceloader="org.graalvm.polyglot.spi.PolyglotEngineProvider"

#
# done
#
-runbundles: \
	org.ops4j.pax.logging.pax-logging-api;version='[2.3.3,2.3.4)',\
	org.ops4j.pax.logging.pax-logging-log4j2;version='[2.3.3,2.3.4)',\
	com.fasterxml.jackson.core.jackson-annotations;version='[2.21.0,2.21.1)',\
	com.fasterxml.woodstox.woodstox-core;version='[6.6.2,6.6.3)',\
	com.google.gson;version='[2.13.2,2.13.3)',\
	com.google.guava;version='[33.6.0,33.6.1)',\
	com.google.guava.failureaccess;version='[1.0.3,1.0.4)',\
	com.google.inject;version='[7.0.0,7.0.1)',\
	com.sun.jna;version='[5.18.1,5.18.2)',\
	com.sun.xml.bind.jaxb-osgi;version='[2.3.9,2.3.10)',\
	io.github.classgraph.classgraph;version='[4.8.184,4.8.185)',\
	io.methvin.directory-watcher;version='[0.19.1,0.19.2)',\
	io.swagger.core.v3.swagger-annotations;version='[2.2.49,2.2.50)',\
	io.swagger.core.v3.swagger-core;version='[2.2.49,2.2.50)',\
	io.swagger.core.v3.swagger-integration;version='[2.2.49,2.2.50)',\
	io.swagger.core.v3.swagger-jaxrs2;version='[2.2.49,2.2.50)',\
	io.swagger.core.v3.swagger-models;version='[2.2.49,2.2.50)',\
	jakarta.annotation-api;version='[2.1.1,2.1.2)',\
	jakarta.inject.jakarta.inject-api;version='[2.0.1,2.0.2)',\
	jakarta.validation.jakarta.validation-api;version='[2.0.2,2.0.3)',\
	jakarta.xml.bind-api;version='[2.3.3,2.3.4)',\
	javax.measure.unit-api;version='[2.2.0,2.2.1)',\
	org.antlr.runtime;version='[3.2.0,3.2.1)',\
	org.apache.aries.component-dsl.component-dsl;version='[1.2.2,1.2.3)',\
	org.apache.aries.javax.jax.rs-api;version='[1.0.4,1.0.5)',\
	org.apache.aries.jax.rs.whiteboard;version='[2.0.2,2.0.3)',\
	org.apache.aries.spifly.dynamic.bundle;version='[1.3.7,1.3.8)',\
	org.apache.commons.commons-fileupload;version='[1.6.0,1.6.1)',\
	org.apache.commons.commons-io;version='[2.22.0,2.22.1)',\
	org.apache.commons.lang3;version='[3.20.0,3.20.1)',\
	org.apache.cxf.cxf-core;version='[3.6.10,3.6.11)',\
	org.apache.cxf.cxf-rt-frontend-jaxrs;version='[3.6.10,3.6.11)',\
	org.apache.cxf.cxf-rt-rs-client;version='[3.6.10,3.6.11)',\
	org.apache.cxf.cxf-rt-rs-sse;version='[3.6.10,3.6.11)',\
	org.apache.cxf.cxf-rt-security;version='[3.6.10,3.6.11)',\
	org.apache.cxf.cxf-rt-transports-http;version='[3.6.10,3.6.11)',\
	org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\
	org.apache.felix.gogo.command;version='[1.1.2,1.1.3)',\
	org.apache.felix.gogo.runtime;version='[1.1.6,1.1.7)',\
	org.apache.felix.gogo.shell;version='[1.1.4,1.1.5)',\
	org.apache.felix.http.servlet-api;version='[1.2.0,1.2.1)',\
	org.apache.felix.inventory;version='[1.1.0,1.1.1)',\
	org.apache.felix.scr;version='[2.2.18,2.2.19)',\
	org.apache.felix.webconsole;version='[4.8.12,4.8.13)',\
	org.apache.felix.webconsole.plugins.ds;version='[2.2.0,2.2.1)',\
	org.apache.servicemix.specs.activation-api-1.2.1;version='[1.2.1,1.2.2)',\
	org.apache.servicemix.specs.annotation-api-1.3;version='[1.3.0,1.3.1)',\
	org.apache.ws.xmlschema.core;version='[2.3.2,2.3.3)',\
	org.bitbucket.b_c.jose4j;version='[0.9.6,0.9.7)',\
	org.eclipse.emf.common;version='[2.30.0,2.30.1)',\
	org.eclipse.emf.ecore;version='[2.36.0,2.36.1)',\
	org.eclipse.emf.ecore.xmi;version='[2.37.0,2.37.1)',\
	org.eclipse.equinox.common;version='[3.20.300,3.20.301)',\
	org.eclipse.equinox.event;version='[1.7.300,1.7.301)',\
	org.eclipse.equinox.metatype;version='[1.6.900,1.6.901)',\
	org.eclipse.jetty.alpn.client;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.client;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.http;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.http2.client;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.http2.common;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.http2.hpack;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.io;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.jaas;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.proxy;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.security;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.server;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.servlet;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.util;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.util.ajax;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.websocket.api;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.websocket.client;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.websocket.common;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.websocket.server;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.websocket.servlet;version='[9.4.58,9.4.59)',\
	org.eclipse.jetty.xml;version='[9.4.58,9.4.59)',\
	org.eclipse.xtend.lib;version='[2.43.0,2.43.1)',\
	org.eclipse.xtend.lib.macro;version='[2.43.0,2.43.1)',\
	org.eclipse.xtext;version='[2.43.0,2.43.1)',\
	org.eclipse.xtext.common.types;version='[2.43.0,2.43.1)',\
	org.eclipse.xtext.util;version='[2.43.0,2.43.1)',\
	org.eclipse.xtext.xbase;version='[2.43.0,2.43.1)',\
	org.eclipse.xtext.xbase.lib;version='[2.43.0,2.43.1)',\
	org.glassfish.hk2.external.aopalliance-repackaged;version='[3.1.1,3.1.2)',\
	org.glassfish.hk2.osgi-resource-locator;version='[3.0.0,3.0.1)',\
	org.objectweb.asm;version='[9.9.1,9.9.2)',\
	org.objectweb.asm.commons;version='[9.9.1,9.9.2)',\
	org.objectweb.asm.tree;version='[9.9.1,9.9.2)',\
	org.objectweb.asm.tree.analysis;version='[9.9.1,9.9.2)',\
	org.objectweb.asm.util;version='[9.9.1,9.9.2)',\
	org.ops4j.pax.web.pax-web-api;version='[8.0.35,8.0.36)',\
	org.ops4j.pax.web.pax-web-extender-whiteboard;version='[8.0.35,8.0.36)',\
	org.ops4j.pax.web.pax-web-jetty;version='[8.0.35,8.0.36)',\
	org.ops4j.pax.web.pax-web-runtime;version='[8.0.35,8.0.36)',\
	org.ops4j.pax.web.pax-web-spi;version='[8.0.35,8.0.36)',\
	org.ops4j.pax.web.pax-web-tomcat-common;version='[8.0.35,8.0.36)',\
	org.osgi.service.component;version='[1.5.1,1.5.2)',\
	org.osgi.service.component.annotations;version='[1.5.1,1.5.2)',\
	org.osgi.service.event;version='[1.4.1,1.4.2)',\
	org.osgi.service.jaxrs;version='[1.0.1,1.0.2)',\
	org.osgi.service.metatype;version='[1.4.1,1.4.2)',\
	org.osgi.util.function;version='[1.2.0,1.2.1)',\
	org.osgi.util.promise;version='[1.3.0,1.3.1)',\
	org.threeten.extra;version='[1.8.0,1.8.1)',\
	org.yaml.snakeyaml;version='[2.5.0,2.5.1)',\
	si-units;version='[2.2.3,2.2.4)',\
	si-quantity;version='[2.2.3,2.2.4)',\
	stax2-api;version='[4.2.2,4.2.3)',\
	tech.units.indriya;version='[2.2.3,2.2.4)',\
	uom-lib-common;version='[2.2.0,2.2.1)',\
	xstream;version='[1.4.21,1.4.22)',\
	de.focus_shift.jollyday-core;version='[1.9.3,1.9.4)',\
	de.focus_shift.jollyday-jackson;version='[1.9.3,1.9.4)',\
	com.fasterxml.jackson.core.jackson-core;version='[2.21.4,2.21.5)',\
	com.fasterxml.jackson.core.jackson-databind;version='[2.21.4,2.21.5)',\
	com.fasterxml.jackson.dataformat.jackson-dataformat-xml;version='[2.21.4,2.21.5)',\
	com.fasterxml.jackson.dataformat.jackson-dataformat-yaml;version='[2.21.4,2.21.5)',\
	com.fasterxml.jackson.datatype.jackson-datatype-jsr310;version='[2.21.4,2.21.5)',\
	com.sun.jna.platform;version='[5.18.1,5.18.2)',\
	javax.jmdns;version='[3.6.3,3.6.4)',\
	jul.to.slf4j;version='[2.0.17,2.0.18)',\
	nrjavaserial;version='[5.2.1,5.2.2)',\
	org.apache.commons.commons-net;version='[3.13.0,3.13.1)',\
	org.eclipse.californium.core;version='[4.0.0,4.0.1)',\
	org.eclipse.californium.element-connector;version='[4.0.0,4.0.1)',\
	org.eclipse.californium.scandium;version='[4.0.0,4.0.1)',\
	org.graalvm.js.js-language;version='[25.0.1,25.0.2)',\
	org.graalvm.js.js-scriptengine;version='[25.0.1,25.0.2)',\
	org.graalvm.polyglot.polyglot;version='[25.0.1,25.0.2)',\
	org.graalvm.python.python-language;version='[25.0.1,25.0.2)',\
	org.graalvm.regex.regex;version='[25.0.1,25.0.2)',\
	org.graalvm.sdk.collections;version='[25.0.1,25.0.2)',\
	org.graalvm.sdk.jniutils;version='[25.0.1,25.0.2)',\
	org.graalvm.sdk.nativeimage;version='[25.0.1,25.0.2)',\
	org.graalvm.sdk.word;version='[25.0.1,25.0.2)',\
	org.graalvm.shadowed.icu4j;version='[25.0.1,25.0.2)',\
	org.graalvm.shadowed.json;version='[25.0.1,25.0.2)',\
	org.graalvm.shadowed.xz;version='[25.0.1,25.0.2)',\
	org.graalvm.tools.chromeinspector-tool;version='[25.0.1,25.0.2)',\
	org.graalvm.tools.profiler-tool;version='[25.0.1,25.0.2)',\
	org.graalvm.truffle.truffle-api;version='[25.0.1,25.0.2)',\
	org.graalvm.truffle.truffle-compiler;version='[25.0.1,25.0.2)',\
	org.graalvm.truffle.truffle-nfi;version='[25.0.1,25.0.2)',\
	org.graalvm.truffle.truffle-runtime;version='[25.0.1,25.0.2)',\
	org.jupnp;version='[3.0.4,3.0.5)',\
	org.openhab.binding.milllan;version='[1.0.2,1.0.3)',\
	org.openhab.binding.unifiprotect;version='[4.0.0,4.0.1)',\
	org.openhab.io.thingtypes;version='[1.0.1,1.0.2)',\
	org.openhab.automation.groovyscripting;version='[5.3.0,5.3.1)',\
	org.openhab.automation.jsscripting;version='[5.3.0,5.3.1)',\
	org.openhab.binding.astro;version='[5.3.0,5.3.1)',\
	org.openhab.binding.chromecast;version='[5.3.0,5.3.1)',\
	org.openhab.binding.energidataservice;version='[5.3.0,5.3.1)',\
	org.openhab.binding.enocean;version='[5.3.0,5.3.1)',\
	org.openhab.binding.exec;version='[5.3.0,5.3.1)',\
	org.openhab.binding.onkyo;version='[5.3.0,5.3.1)',\
	org.openhab.binding.shelly;version='[5.3.0,5.3.1)',\
	org.openhab.binding.upnpcontrol;version='[5.3.0,5.3.1)',\
	org.openhab.binding.zwave;version='[5.3.0,5.3.1)',\
	org.openhab.core;version='[5.3.0,5.3.1)',\
	org.openhab.core.addon;version='[5.3.0,5.3.1)',\
	org.openhab.core.addon.eclipse;version='[5.3.0,5.3.1)',\
	org.openhab.core.addon.marketplace;version='[5.3.0,5.3.1)',\
	org.openhab.core.audio;version='[5.3.0,5.3.1)',\
	org.openhab.core.automation;version='[5.3.0,5.3.1)',\
	org.openhab.core.automation.module.media;version='[5.3.0,5.3.1)',\
	org.openhab.core.automation.module.script;version='[5.3.0,5.3.1)',\
	org.openhab.core.automation.module.script.providersupport;version='[5.3.0,5.3.1)',\
	org.openhab.core.automation.module.script.rulesupport;version='[5.3.0,5.3.1)',\
	org.openhab.core.automation.rest;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.core;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.discovery;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.discovery.addon;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.discovery.addon.upnp;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.discovery.addon.usb;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.discovery.mdns;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.discovery.upnp;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.discovery.usbserial;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.discovery.usbserial.windowsregistry;version='[5.3.0,5.3.1)',\
	org.openhab.core.config.dispatch;version='[5.3.0,5.3.1)',\
	org.openhab.core.ephemeris;version='[5.3.0,5.3.1)',\
	org.openhab.core.id;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.console;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.console.rfc147;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.http;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.http.auth;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.monitor;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.net;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.audio;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.auth;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.core;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.log;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.mdns;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.sitemap;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.sse;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.swagger;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.transform;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.ui;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.rest.voice;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.transport.mdns;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.transport.serial;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.transport.serial.rxtx;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.transport.upnp;version='[5.3.0,5.3.1)',\
	org.openhab.core.io.websocket;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.core;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.item;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.item.runtime;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.persistence;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.persistence.runtime;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.rule;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.rule.runtime;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.script;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.script.runtime;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.sitemap;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.sitemap.runtime;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.thing;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.thing.runtime;version='[5.3.0,5.3.1)',\
	org.openhab.core.model.yaml;version='[5.3.0,5.3.1)',\
	org.openhab.core.persistence;version='[5.3.0,5.3.1)',\
	org.openhab.core.semantics;version='[5.3.0,5.3.1)',\
	org.openhab.core.sitemap;version='[5.3.0,5.3.1)',\
	org.openhab.core.storage.json;version='[5.3.0,5.3.1)',\
	org.openhab.core.thing;version='[5.3.0,5.3.1)',\
	org.openhab.core.transform;version='[5.3.0,5.3.1)',\
	org.openhab.core.ui;version='[5.3.0,5.3.1)',\
	org.openhab.core.ui.icon;version='[5.3.0,5.3.1)',\
	org.openhab.core.voice;version='[5.3.0,5.3.1)',\
	org.openhab.transform.basicprofiles;version='[5.3.0,5.3.1)',\
	org.openhab.transform.exec;version='[5.3.0,5.3.1)',\
	org.openhab.transform.map;version='[5.3.0,5.3.1)',\
	org.openhab.transform.regex;version='[5.3.0,5.3.1)',\
	org.openhab.transform.scale;version='[5.3.0,5.3.1)',\
	org.openhab.transform.xpath;version='[5.3.0,5.3.1)',\
	org.openhab.transform.xslt;version='[5.3.0,5.3.1)',\
	org.openhab.ui;version='[5.3.0,5.3.1)',\
	org.openhab.ui.basic;version='[5.3.0,5.3.1)',\
	org.openhab.ui.iconset.classic;version='[5.3.0,5.3.1)',\
	org.openhab.binding.ecobee;version='[5.3.0,5.3.1)',\
	org.openhab.core.auth.oauth2client;version='[5.3.0,5.3.1)',\
	org.openhab.binding.ntfy;version='[5.3.0,5.3.1)',\
	org.openhab.io.mcp;version='[5.3.0,5.3.1)',\
	org.openhab.core.auth.jaas;version='[5.3.0,5.3.1)',\
	bcpkix;version='[1.85.0,1.85.1)',\
	bcprov;version='[1.85.0,1.85.1)',\
	bcutil;version='[1.85.0,1.85.1)',\
	org.graalvm.llvm.llvm-api;version='[25.0.1,25.0.2)',\
	org.graalvm.python.python-resources;version='[25.0.1,25.0.2)',\
	org.graalvm.truffle.truffle-nfi-libffi;version='[25.0.1,25.0.2)',\
	org.openhab.automation.pythonscripting;version='[5.3.0,5.3.1)',\
	org.apache.felix.shell.remote;version='[1.2.0,1.2.1)',\
	org.openhab.core.graal;version='[5.3.0,5.3.1)'

You must run:

mvn bnd-resolver:resolve

from the launch/app folder after editing those files. When it has resolved successfully, you can run it with:

mvn bnd-run:run

..from the same folder.

All that said, if you're new to the "demo app", bndrun and all that, it's a lot to take in at once, and it might end up being a frustrating experience.

Perhaps the simplest path is to just build all of core, from the core repo root:

 mvn clean install -nsu -T1C -DskipTests -DskipChecks -Dspotless.check.skip=true -Dmarkdownlint.skip=true

Once that's done, go to the root of the openhab-distro repo, and run:

mvn clean install -nsu

Once that's done, if you want a local Karaf installation built inside the target folder so that you don't have to unpack the archive, run:

mvn package -nsu -Pdev

The ready-to-run Karaf installation can then be found in distributions/openhab/target/openhab-5.3.0-SNAPSHOT. The advantage of going this longer route, is that everything is familiar, you can build and install add-ons like you're used to.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants