Installing Custom Plugin into Shuffleboard

I’ve been trying to create a custom made widget to use in Shuffleboard. As of now, my code doesn’t give any errors, but my main problem is that I do not know how to add this plugin to Shuffleboard. I tried to compile it as a runnable jar file and then add it to the plugins folder, but it did not work.

If anyone has successfully created a plugin for shuffleboard, please do help.

**Here’s the link I used to create my project: https://github.com/wpilibsuite/shuffleboard/wiki/End-to-end-custom-data—widget-example
**
Here’s my code:
https://github.com/Sumayya-Syeda/ShuffleBoardPlugin

The most likely reason is that your plugin declares a dependency on a plugin that does not exist, meaning your plugin can never be loaded (but will still show up in the plugin manager, accessible through File->Plugins). If it doesn’t show up there, make sure that you’ve copied the JAR to the correct folder

My plugin doesn’t show up in the plugin manager. I believe I’m not making my JAR file properly. Can you list the steps for doing so? (I used eclipse)

I’m adding the jar file into wpilib–>tools–>shuffleboard-master–>plugins

The plugin directory is <home>\Shuffleboard\plugins (wiki section). In your case, “C:\Users\Sumayya Syeda\Shuffleboard\plugins”

I fixed the location of the JAR file, but it still does not show up in the plugin manager in Shuffleboard.

Could there be something wrong with my code or the file itself?

Your plugin class is missing a @Description annotation. Read this wiki page

Also, did you remove the @Requires for the nonexistent com.acme plugin?

I added the @Description annotation and removed that @Required annotation as well.

But now when I try to run Shuffleboard, it basically crashes. Here is the error:

Apr 04, 2018 2:46:58 PM java.util.logging.LogManager$RootLogger log
CONFIG: Configuration done.
Apr 04, 2018 2:46:58 PM java.util.logging.LogManager$RootLogger log
CONFIG: Shuffleboard app version: 1.2.2
Apr 04, 2018 2:46:58 PM java.util.logging.LogManager$RootLogger log
CONFIG: Running from file:/C:/Users/Sumayya%20Syeda/wpilib/tools/Shuffleboard.jar
Apr 04, 2018 2:46:58 PM edu.wpi.first.shuffleboard.app.Shuffleboard init
INFO: Build time: 2018-03-06T08:42:13.165Z
Apr 04, 2018 2:46:58 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:Base:1.0.0
Apr 04, 2018 2:47:00 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:NetworkTables:1.0.0
Apr 04, 2018 2:47:01 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:CameraServer:1.0.0
Apr 04, 2018 2:47:01 PM edu.wpi.first.shuffleboard.plugin.cameraserver.CameraServerPlugin onLoad
INFO: OpenCV version: 3.2.0
NT: connect() to localhost port 1735 timed out
Apr 04, 2018 2:47:02 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:Powerup:1.0.0
Apr 04, 2018 2:47:02 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader loadPluginJar
INFO: Attempting to load plugin jar: file:///C:/Users/Sumayya%20Syeda/Shuffleboard/plugins/CoordinatesMap.jar
Apr 04, 2018 2:47:02 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader lambda$loadPluginJar$8
WARNING: Invalid plugin class edu.wpi.first.shuffleboard.api.plugin.Plugin
edu.wpi.first.shuffleboard.api.plugin.InvalidPluginDefinitionException: The plugin class does not have a @Description annotation: edu.wpi.first.shuffleboard.api.plugin.Plugin
at edu.wpi.first.shuffleboard.api.plugin.Plugin.validatePluginClass(Plugin.java:83)
at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.lambda$loadPluginJar$8(PluginLoader.java:160)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:419)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:270)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.loadPluginJar(PluginLoader.java:167)
at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.lambda$loadAllJarsFromDir$1(PluginLoader.java:122)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:390)
at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.loadAllJarsFromDir(PluginLoader.java:120)
at edu.wpi.first.shuffleboard.app.Shuffleboard.start(Shuffleboard.java:119)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)

Exception in Application start method
Apr 04, 2018 2:47:02 PM edu.wpi.first.shuffleboard.app.Shuffleboard stop
INFO: Running shutdown hooks
Apr 04, 2018 2:47:02 PM edu.wpi.first.shuffleboard.app.Shuffleboard stop
INFO: Shutting down
Exception in thread “main” java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: com/sun/deploy/uitoolkit/Applet2Adapter

It seems like your JAR might be including some or all of the dependencies; that would explain why the Plugin class is attempted to be loaded, as well as the NoClassDefFoundError for an internal JavaFX class.

After looking more closely at your code, I’ve noticed a few more problems:

  • The Point2DType is abstract for some reason
  • The Point2DType instance is never assigned (look at AccelerometerType as an example for how you should model your data type classes)
  • You don’t have any imports in your FXML file, so that widget can never be loaded
  • Point2D’s withX and withY methods return null and modify the class - this will not work. Read the documentation more closely

Alright, so I was able to fix all those problems and made a new JAR file. Previous times, I exported my project as a runnable Jar and found that was one of the reasons why this wasn’t working.

Now I’m able to see my plugin in the plugin manager of Shuffleboard, but I can’t seem to find the widget on the dashboard. Here is the current error:

Apr 04, 2018 8:13:39 PM java.util.logging.LogManager$RootLogger log
CONFIG: Configuration done.
Apr 04, 2018 8:13:39 PM java.util.logging.LogManager$RootLogger log
CONFIG: Shuffleboard app version: 1.2.2
Apr 04, 2018 8:13:39 PM java.util.logging.LogManager$RootLogger log
CONFIG: Running from file:/C:/Users/Sumayya%20Syeda/wpilib/tools/Shuffleboard.jar
Apr 04, 2018 8:13:39 PM edu.wpi.first.shuffleboard.app.Shuffleboard init
INFO: Build time: 2018-03-06T08:42:13.165Z
Apr 04, 2018 8:13:40 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:Base:1.0.0
Apr 04, 2018 8:13:41 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:NetworkTables:1.0.0
Apr 04, 2018 8:13:42 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:CameraServer:1.0.0
Apr 04, 2018 8:13:42 PM edu.wpi.first.shuffleboard.plugin.cameraserver.CameraServerPlugin onLoad
INFO: OpenCV version: 3.2.0
NT: connect() to localhost port 1735 timed out
Apr 04, 2018 8:13:43 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:Powerup:1.0.0
Apr 04, 2018 8:13:44 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader loadPluginJar
INFO: Attempting to load plugin jar: file:///C:/Users/Sumayya%20Syeda/Shuffleboard/plugins/Coordinates3.jar
Apr 04, 2018 8:13:44 PM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin com.Coordinate:Coordinate Plugin:0.0.0
Apr 04, 2018 8:13:44 PM edu.wpi.first.shuffleboard.app.Shuffleboard uncaughtException
WARNING: Uncaught exception on JavaFX Application Thread
java.lang.IllegalStateException: Location is not set.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2434)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at edu.wpi.first.shuffleboard.api.widget.Components.viewFor(Components.java:299)
at edu.wpi.first.shuffleboard.api.widget.WidgetType$1.get(WidgetType.java:26)
at edu.wpi.first.shuffleboard.api.widget.WidgetType$1.get(WidgetType.java:23)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at edu.wpi.first.shuffleboard.app.components.WidgetGallery.setWidgets(WidgetGallery.java:48)
at edu.wpi.first.shuffleboard.app.MainWindowController.setup(MainWindowController.java:310)
at edu.wpi.first.shuffleboard.app.MainWindowController.lambda$null$2(MainWindowController.java:170)
at java.lang.Iterable.forEach(Iterable.java:75)
at edu.wpi.first.shuffleboard.app.MainWindowController.lambda$initialize$3(MainWindowController.java:162)
at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:155)
at java.util.AbstractList.add(AbstractList.java:108)
at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.load(PluginLoader.java:303)
at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.loadPluginClass(PluginLoader.java:225)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:352)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.loadPluginJar(PluginLoader.java:173)
at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.lambda$loadAllJarsFromDir$1(PluginLoader.java:122)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:390)
at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.loadAllJarsFromDir(PluginLoader.java:120)
at edu.wpi.first.shuffleboard.app.Shuffleboard.start(Shuffleboard.java:119)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)

NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out

**I’m not sure if my fxml file is right, here’s the file for that: **

<!-- com/example/widget/Point2DWidget.fxml -->
<?import Plugin.Coordinate.MyPlugin?>
<?import Plugin.Coordinate.Point2D.java?>
<?import Plugin.Coordinate.Point2DType.java?>
<VBox xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml"
      fx:controller="com.Coordinate.Point2DWidget"
      fx:id="root"
      minWidth="64" minHeight="48"
      spacing="4">
  <Label fx:id="xLabel" text="0.0"/>
  <Label fx:id="yLabel" text="0.0/>
</VBox>

You need to import the JavaFX VBox and Label classes in your FXML, not your plugin classes.


<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<!-- Rest of your FXML -->

Point2DWidget.fxml also needs to either be in the same directory as Point2DWidget.java, or you need to modify the location in @ParametrizedController to be “/Point2DWidget.fxml”, with a leading slash. This is what’s causing the “location is required” error.

Thanks for helping, but a problem still persists. Now my FXML control file can’t be instantiated

Apr 05, 2018 9:41:35 AM java.util.logging.LogManager$RootLogger log
CONFIG: Configuration done.
Apr 05, 2018 9:41:35 AM java.util.logging.LogManager$RootLogger log
CONFIG: Shuffleboard app version: 1.2.2
Apr 05, 2018 9:41:35 AM java.util.logging.LogManager$RootLogger log
CONFIG: Running from file:/C:/Users/Sumayya%20Syeda/wpilib/tools/Shuffleboard.jar
Apr 05, 2018 9:41:35 AM edu.wpi.first.shuffleboard.app.Shuffleboard init
INFO: Build time: 2018-03-06T08:42:13.165Z
Apr 05, 2018 9:41:36 AM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:Base:1.0.0
Apr 05, 2018 9:41:40 AM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:NetworkTables:1.0.0
Apr 05, 2018 9:41:41 AM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:CameraServer:1.0.0
Apr 05, 2018 9:41:41 AM edu.wpi.first.shuffleboard.plugin.cameraserver.CameraServerPlugin onLoad
INFO: OpenCV version: 3.2.0
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
Apr 05, 2018 9:41:44 AM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin edu.wpi.first.shuffleboard:Powerup:1.0.0
NT: connect() to localhost port 1735 timed out
Apr 05, 2018 9:41:45 AM edu.wpi.first.shuffleboard.app.plugin.PluginLoader loadPluginJar
INFO: Attempting to load plugin jar: file:///C:/Users/Sumayya%20Syeda/Shuffleboard/plugins/Coordinates3.jar
Apr 05, 2018 9:41:45 AM edu.wpi.first.shuffleboard.app.plugin.PluginLoader load
INFO: Loading plugin com.Coordinate:Coordinate Plugin:0.0.0
Apr 05, 2018 9:41:45 AM edu.wpi.first.shuffleboard.app.Shuffleboard uncaughtException
WARNING: Uncaught exception on JavaFX Application Thread
java.lang.RuntimeException: Could not instantiate the FXML controller
        at edu.wpi.first.shuffleboard.api.widget.Components.viewFor(Components.java:302)
        at edu.wpi.first.shuffleboard.api.widget.WidgetType$1.get(WidgetType.java:26)
        at edu.wpi.first.shuffleboard.api.widget.WidgetType$1.get(WidgetType.java:23)
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
        at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
        at edu.wpi.first.shuffleboard.app.components.WidgetGallery.setWidgets(WidgetGallery.java:48)
        at edu.wpi.first.shuffleboard.app.MainWindowController.setup(MainWindowController.java:310)
        at edu.wpi.first.shuffleboard.app.MainWindowController.lambda$null$2(MainWindowController.java:170)
        at java.lang.Iterable.forEach(Iterable.java:75)
        at edu.wpi.first.shuffleboard.app.MainWindowController.lambda$initialize$3(MainWindowController.java:162)
        at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
        at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
        at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
        at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
        at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
        at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
        at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:155)
        at java.util.AbstractList.add(AbstractList.java:108)
        at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.load(PluginLoader.java:303)
        at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.loadPluginClass(PluginLoader.java:225)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
        at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:352)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
        at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.loadPluginJar(PluginLoader.java:173)
        at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.lambda$loadAllJarsFromDir$1(PluginLoader.java:122)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:390)
        at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
        at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
        at edu.wpi.first.shuffleboard.app.plugin.PluginLoader.loadAllJarsFromDir(PluginLoader.java:120)
        at edu.wpi.first.shuffleboard.app.Shuffleboard.start(Shuffleboard.java:119)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
        at java.lang.Thread.run(Thread.java:748)
Caused by: javafx.fxml.LoadException:
file:/C:/Users/Sumayya%20Syeda/Shuffleboard/plugins/Coordinates3.jar!/Coordinate/Point2DWidget.fxml:8

        at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
        at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922)
        at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
        at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
        at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
        at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
        at edu.wpi.first.shuffleboard.api.widget.Components.viewFor(Components.java:299)
        ... 57 more
Caused by: java.lang.ClassNotFoundException: com.Coordinate.Point2DWidget
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920)
        ... 65 more

NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out
NT: connect() to localhost port 1735 timed out

Caused by: java.lang.ClassNotFoundException: com.Coordinate.Point2DWidget

The controller you’ve specified in your FXML is wrong. I believe the class is in the package “Coordinate”, not “com.Coordinate”

As an aside, if you haven’t read the JavaFX introduction tutorials, I highly recommend that you do. It covers a lot of the basics for how to use FXML that you seem to be struggling with a bit

Alright, thanks for your help!