1

I have tried to implement the MapChangeListener in JavaFX, and I run this example in Intellij Idea (windows):

// Use Java Collections to create the List.
Map<String,String> map = new HashMap<String,String>();

// Now add observability by wrapping it with ObservableList.
ObservableMap<String,String> observableMap = FXCollections.observableMap(map);
observableMap.addListener(new MapChangeListener() {
    @Override
    public void onChanged(MapChangeListener.Change change) {
        System.out.println("Detected a change! ");
        logerKuraPI("Detected a change! ");
    }
});

// Changes to the observableMap WILL be reported.
observableMap.put("key 1","value 1");
System.out.println("Size: "+observableMap.size());
logerKuraPI("Size: "+observableMap.size());

// Changes to the underlying map will NOT be reported.
map.put("key 2","value 2");
System.out.println("Size: "+observableMap.size());
logerKuraPI("Size: "+observableMap.size());

and it worked fine, but when I tried to insert the code in my eclipse project (Linux) I got these errors:

java.lang.NoClassDefFoundError: javafx/collections/MapChangeListener
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getConstructor0(Class.java:3075)
    at java.lang.Class.newInstance(Class.java:412)
    at org.eclipse.equinox.internal.ds.model.ServiceComponent.createInstance(ServiceComponent.java:493)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.createInstance(ServiceComponentProp.java:270)
    at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:331)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:620)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:197)
    at org.eclipse.equinox.internal.ds.Resolver.getEligible(Resolver.java:343)
    at org.eclipse.equinox.internal.ds.SCRManager.serviceChanged(SCRManager.java:222)
    at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:915)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:862)
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:801)
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:127)
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:225)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:464)
    at org.eclipse.equinox.internal.ds.InstanceProcess.registerService(InstanceProcess.java:536)
    at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:213)
    at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:473)
    at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:217)
    at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:816)
    at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:783)
    at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89)
    at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70)
Caused by: java.lang.ClassNotFoundException: javafx.collections.MapChangeListener cannot be found by fileloger_1.0.0.qualifier
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:461)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

Anyone can help me to figure out what's wrong? Even there is no error when importing:

import javafx.collections.FXCollections;
import javafx.collections.MapChangeListener;
import javafx.collections.ObservableMap;
MLavoie
  • 9,671
  • 41
  • 36
  • 56
Ahmed Garssallaoui
  • 167
  • 1
  • 3
  • 10

1 Answers1

1

Please have a read up here: https://techblog.bozho.net/runtime-classpath-vs-compile-time-classpath/

I'm guessing that your compile-time dependencies are ok but you are seeing this issue because you have not added the necessary jars as runtime dependencies.

Similar issue answered here: Why am I getting a NoClassDefFoundError in Java?

djkelly99
  • 590
  • 4
  • 9
  • Thank you for your answer, but the javafx, it's a default java library, should I search for the jar file and add it as a runtime dependency – Ahmed Garssallaoui Apr 05 '18 at 13:53
  • Sorry, I should have clarified by asking what version of Java you are running. It might not necessarily be bundled by default. There's a pretty good explanation here: https://stackoverflow.com/questions/15278215/maven-project-with-javafx-with-jar-file-in-lib . – djkelly99 Apr 05 '18 at 15:01
  • Thank you for your reply , well that what made me confused, I am using: openjdk version "1.8.0_162" and javaFX should be by default in the classpath, so any suggestions please what can make this error and how to solve it ? PS: I am using a plugin project in eclipse – Ahmed Garssallaoui Apr 05 '18 at 15:58
  • Hmm, that is strange. Can you double check that eclipse has access to the jfxrt.jar as explained here? https://www.ssaurel.com/blog/create-your-first-javafx-8-application-with-eclipse/ If that doesn't work, I'm all out of ideas! ;) – djkelly99 Apr 05 '18 at 16:12
  • I added an access to JavaFX as explained and it didn't work either :/ thank you for your help :)) – Ahmed Garssallaoui Apr 05 '18 at 16:21
  • I didn't mention that I am running a plugin eclipse project on OSGI, does that make any difference ? – Ahmed Garssallaoui Apr 10 '18 at 08:23