I’m doing development using Eclipse, and use the demo.app
to run OH within Eclipse.
I’m currently working with things related to add-ons and the community marketplace, and a lot of these add-ons rely on jsscripting, so getting the jsscripting add-on working in the development environment would make testing things much easier. I’ve tried to get it working in the past, but have given up.
I have given it another go now, and gotten stuck again. I’ve done what I’ve done with numerous other add-ons to make them work in this environment, I’ve added
<dependency>
<groupId>org.openhab.addons.bundles</groupId>
<artifactId>org.openhab.automation.jsscripting</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
to the “demo.app” pom.xml
. Then, I’ve added org.openhab.automation.jsscripting
to the run requirements in the bnd/OSGi “Resolve/Run” view, saved and clicked “Resolve”. This often requires some refreshes, “Update Maven Project”, perhaps some rebuilds of some components, but I usually get it to resolve in the end.
This isn’t the case for org.openhab.automation.jsscripting
. The error output is very long, but it seems like it boils down to this:
Unable to resolve <<INITIAL>>: missing requirement osgi.identity;filter:='(osgi.identity=org.openhab.automation.jsscripting)' [caused by: Unable to resolve org.openhab.automation.jsscripting version=5.0.0.202502140010: missing requirement osgi.wiring.bundle;filter:='(&(osgi.wiring.bundle=org.graalvm.sdk.collections)(bundle-version>=24.1.2))']
I didn’t have this particular problem the last time I tried, so I looked in the commit log and found 8c68fb7, which seemed related, so I reverted that commit and rebuilt the jsscripting add-on. The question remains why it won’t resolve with 8c68fb7 though.
After reverting this commit, it did resolve and I was able to start “demo.app”. The add-on still doesn’t work even though OH starts, there are various errors in the log. This seems to be the “root problem”:
java.lang.NoClassDefFoundError: Could not initialize class org.openhab.automation.jsscripting.internal.OpenhabGraalJSScriptEngine
at org.openhab.automation.jsscripting.internal.GraalJSScriptEngineFactory.createScriptEngine(GraalJSScriptEngineFactory.java:90) ~[?:?]
at org.openhab.core.automation.module.script.internal.ScriptEngineFactoryHelper.getParameterOption(ScriptEngineFactoryHelper.java:45) ~[?:?]
at org.openhab.core.automation.module.script.internal.provider.ScriptModuleTypeProvider.setScriptEngineFactory(ScriptModuleTypeProvider.java:150) ~[?:?]
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:580) ~[?:?]
at org.apache.felix.scr.impl.inject.methods.BaseMethod.invokeMethod(BaseMethod.java:245) ~[bundleFile:?]
at org.apache.felix.scr.impl.inject.methods.BaseMethod.access$500(BaseMethod.java:41) ~[bundleFile:?]
at org.apache.felix.scr.impl.inject.methods.BaseMethod$Resolved.invoke(BaseMethod.java:687) ~[bundleFile:?]
at org.apache.felix.scr.impl.inject.methods.BaseMethod.invoke(BaseMethod.java:531) [bundleFile:?]
at org.apache.felix.scr.impl.inject.methods.BindMethod.invoke(BindMethod.java:42) [bundleFile:?]
at org.apache.felix.scr.impl.manager.DependencyManager.doInvokeBindMethod(DependencyManager.java:2086) [bundleFile:?]
at org.apache.felix.scr.impl.manager.DependencyManager.invokeBindMethod(DependencyManager.java:2061) [bundleFile:?]
at org.apache.felix.scr.impl.manager.SingleComponentManager.invokeBindMethod(SingleComponentManager.java:443) [bundleFile:?]
at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.addedService(DependencyManager.java:336) [bundleFile:?]
at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.addedService(DependencyManager.java:304) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1232) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1152) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:959) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:895) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1184) [bundleFile:?]
at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:116) [bundleFile:?]
at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:123) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:961) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:937) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:874) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:141) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:262) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:500) [org.eclipse.osgi-3.18.0.jar:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:929) [bundleFile:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:915) [bundleFile:?]
at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:133) [bundleFile:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:984) [bundleFile:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:752) [bundleFile:?]
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1274) [bundleFile:?]
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1225) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1232) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1152) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:959) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:895) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1184) [bundleFile:?]
at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:116) [bundleFile:?]
at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:123) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:961) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:937) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:874) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:141) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:262) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:500) [org.eclipse.osgi-3.18.0.jar:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:929) [bundleFile:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:915) [bundleFile:?]
at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:133) [bundleFile:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:984) [bundleFile:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:752) [bundleFile:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:674) [bundleFile:?]
at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:437) [bundleFile:?]
at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:671) [bundleFile:?]
at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:310) [bundleFile:?]
at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:593) [bundleFile:?]
at org.apache.felix.scr.impl.Activator.access$200(Activator.java:74) [bundleFile:?]
at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:460) [bundleFile:?]
at org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196) [bundleFile:?]
at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169) [bundleFile:?]
at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49) [bundleFile:?]
at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:488) [org.eclipse.osgi-3.18.0.jar:?]
at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:1) [org.eclipse.osgi-3.18.0.jar:?]
at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) [org.eclipse.osgi-3.18.0.jar:?]
at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:450) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:949) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:229) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:138) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:130) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:217) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.container.Module.publishEvent(Module.java:499) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.container.Module.start(Module.java:486) [org.eclipse.osgi-3.18.0.jar:?]
at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:445) [org.eclipse.osgi-3.18.0.jar:?]
at aQute.launcher.Launcher.start(Launcher.java:699) [biz.aQute.launcher-7.0.0.jar:?]
at aQute.launcher.Launcher.startBundles(Launcher.java:679) [biz.aQute.launcher-7.0.0.jar:?]
at aQute.launcher.Launcher.activate(Launcher.java:585) [biz.aQute.launcher-7.0.0.jar:?]
at aQute.launcher.Launcher.launch(Launcher.java:403) [biz.aQute.launcher-7.0.0.jar:?]
at aQute.launcher.Launcher.run(Launcher.java:185) [biz.aQute.launcher-7.0.0.jar:?]
at aQute.launcher.Launcher.main(Launcher.java:161) [biz.aQute.launcher-7.0.0.jar:?]
at aQute.launcher.pre.EmbeddedLauncher.executeWithRunPath(EmbeddedLauncher.java:170) [biz.aQute.launcher.pre.jar:?]
at aQute.launcher.pre.EmbeddedLauncher.findAndExecute(EmbeddedLauncher.java:135) [biz.aQute.launcher.pre.jar:?]
at aQute.launcher.pre.EmbeddedLauncher.main(EmbeddedLauncher.java:52) [biz.aQute.launcher.pre.jar:?]
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.NoClassDefFoundError: jdk/internal/module/Modules [in thread "main"]
at com.oracle.truffle.runtime.ModulesSupport.addExports0(Native Method) ~[?:?]
at com.oracle.truffle.runtime.ModulesSupport.<clinit>(ModulesSupport.java:64) ~[?:?]
at com.oracle.truffle.runtime.hotspot.HotSpotTruffleRuntimeAccess.createRuntime(HotSpotTruffleRuntimeAccess.java:84) ~[?:?]
at com.oracle.truffle.runtime.hotspot.HotSpotTruffleRuntimeAccess.getRuntime(HotSpotTruffleRuntimeAccess.java:75) ~[?:?]
at com.oracle.truffle.api.Truffle.createRuntime(Truffle.java:145) ~[?:?]
at com.oracle.truffle.api.Truffle$1.run(Truffle.java:176) ~[?:?]
at com.oracle.truffle.api.Truffle$1.run(Truffle.java:174) ~[?:?]
at java.security.AccessController.doPrivileged(AccessController.java:319) ~[?:?]
at com.oracle.truffle.api.Truffle.initRuntime(Truffle.java:174) ~[?:?]
at com.oracle.truffle.api.Truffle.<clinit>(Truffle.java:63) ~[?:?]
at com.oracle.truffle.api.impl.Accessor.getTVMCI(Accessor.java:1505) ~[?:?]
at com.oracle.truffle.api.impl.Accessor$Constants.<clinit>(Accessor.java:1370) ~[?:?]
at com.oracle.truffle.api.impl.Accessor.engineSupport(Accessor.java:1434) ~[?:?]
at com.oracle.truffle.api.library.LibraryAccessor.engineAccessor(LibraryAccessor.java:57) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.loadExternalDefaultProviders(LibraryFactory.java:434) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.getExternalDefaultProviders(LibraryFactory.java:425) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.initDefaultExports(LibraryFactory.java:213) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.<init>(LibraryFactory.java:208) ~[?:?]
at com.oracle.truffle.api.library.DynamicDispatchLibraryGen.<init>(DynamicDispatchLibraryGen.java:33) ~[?:?]
at com.oracle.truffle.api.library.DynamicDispatchLibraryGen.<clinit>(DynamicDispatchLibraryGen.java:25) ~[?:?]
at java.lang.Class.forName0(Native Method) ~[?:?]
at java.lang.Class.forName(Class.java:534) ~[?:?]
at java.lang.Class.forName(Class.java:513) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.loadGeneratedClass(LibraryFactory.java:770) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.resolveImpl(LibraryFactory.java:751) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.resolve(LibraryFactory.java:744) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.<init>(LibraryFactory.java:202) ~[?:?]
at com.oracle.truffle.api.interop.InteropLibraryGen.<init>(InteropLibraryGen.java:180) ~[?:?]
at com.oracle.truffle.api.interop.InteropLibraryGen.<clinit>(InteropLibraryGen.java:171) ~[?:?]
at java.lang.Class.forName0(Native Method) ~[?:?]
at java.lang.Class.forName(Class.java:534) ~[?:?]
at java.lang.Class.forName(Class.java:513) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.loadGeneratedClass(LibraryFactory.java:770) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.resolveImpl(LibraryFactory.java:751) ~[?:?]
at com.oracle.truffle.api.library.LibraryFactory.resolve(LibraryFactory.java:744) ~[?:?]
at com.oracle.truffle.api.interop.InteropLibrary.<clinit>(InteropLibrary.java:2972) ~[?:?]
at com.oracle.truffle.polyglot.PolyglotValueDispatch.<clinit>(PolyglotValueDispatch.java:168) ~[?:?]
at com.oracle.truffle.polyglot.PolyglotImpl.initialize(PolyglotImpl.java:202) ~[?:?]
at org.graalvm.polyglot.Engine.loadAndValidateProviders(Engine.java:1691) ~[?:?]
at org.graalvm.polyglot.Engine$1.run(Engine.java:1717) ~[?:?]
at org.graalvm.polyglot.Engine$1.run(Engine.java:1712) ~[?:?]
at java.security.AccessController.doPrivileged(AccessController.java:319) ~[?:?]
at org.graalvm.polyglot.Engine.initEngineImpl(Engine.java:1712) ~[?:?]
at org.graalvm.polyglot.Engine$ImplHolder.<clinit>(Engine.java:170) ~[?:?]
at org.graalvm.polyglot.Engine.getImpl(Engine.java:422) ~[?:?]
at org.graalvm.polyglot.Source.getImpl(Source.java:167) ~[?:?]
at org.graalvm.polyglot.Source$Builder.build(Source.java:1027) ~[?:?]
at org.openhab.automation.jsscripting.internal.OpenhabGraalJSScriptEngine.<clinit>(OpenhabGraalJSScriptEngine.java:81) ~[?:?]
at org.openhab.automation.jsscripting.internal.GraalJSScriptEngineFactory.createScriptEngine(GraalJSScriptEngineFactory.java:90) ~[?:?]
at org.openhab.core.automation.module.script.ScriptTransformationServiceFactory.lambda$1(ScriptTransformationServiceFactory.java:73) ~[?:?]
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) ~[?:?]
at org.openhab.core.automation.module.script.ScriptTransformationServiceFactory.setScriptEngineFactory(ScriptTransformationServiceFactory.java:72) ~[?:?]
... 87 more
I’m not entirely sure exactly what class it can’t find the definitions for, but the result is that it can’t start OpenhabGraalJSScriptEngine
it sees. I’m not very “into” the different JS “script engines” (Nashorn, Graal etc.), but do I have to “install” GraalVM separately somehow? I’m using Adoptium OpenJDK 21.0.5.11.