Pular para o conteúdo principal

JBoss Modules with JavaFX


Anton Arhipov made a great post showing a Hello World app with JBoss modules. In his post comments, Ted Won created a "mavenized" version of his hello world. Since my friend Filipe Portes already made a great work by integrating JavaFX with OSGI, I decided to try jboss-modules 

In this post I simply used Ted's project with JavaFX(with some modifications) and it worked great!  


First obvious attempt:

  •  Clone Ted's project: 

git clone git@github.com:tedwon/hello-jboss-modules.git

  • Import his maven project on an IDE. I used Eclipe (File -> Import -> Existing Maven Project)


  • Let's develop now. Modify the Hello class to be a JavaFX application class:
  • Now build the project. Go back to the  hello directory in the command line and run mvn clean package
  • Once the project is built, copy the new hello jar to the modules directory: cp hello/target/hello.jar  mods/org/jbugkorea/hello/main/ 
  • Cool, but if you try to run now, you will have an exception:
Exception in thread "main" java.lang.NoClassDefFoundError: Failed to link org/jbugkorea/hello/Hello (Module "org.jbugkorea.hello:main" from local module loader @27ddd392 (finder: local module finder @19e1023e (roots: /opt/projects/hello-jboss-modules/mods))): javafx/application/Application at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:446) at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:274) at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:78) at org.jboss.modules.Module.loadModuleClass(Module.java:606) at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93) at org.jbugkorea.app.Main.main(Main.java:7) 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:497) at org.jboss.modules.Module.run(Module.java:330) at org.jboss.modules.Main.main(Main.java:505)

Making it work


The reason why we have this error is because JavaFX is not on JDK classpath. What I am going to say on next steps is for jboss modules and JavaFX learning purposes, you must contact Oracle if you want to ship their JavaFX implementation.

An easier way to solve this is by creating a new module for jfxrt.jar:
  • Create a new directory for the JavaFX module, create a module.xml file and copy the jfxrt.jar to this directory. 
  • JavaFX depends on several JRE classes. I had to create a javax.api module from a Wildfly installation inside mods. I just copied it from a local wildfly installation: 
mkdir -p mods/javax/api/main/
cp /opt/jboss/WILDFLY/wildfly-8.2.0.Final/modules/system/layers/base/javax/api/main/module.xml mods/javax/api/main/
  • JavaFX make use of other internal sun libraries that are not included in javax.api module. You may add it at the end of javax.api modules.xml dependencies declaration:
                               
               
  • Now make hello dependent on JavaFX module and javaFX module dependent on javafx.api module. See below how your mods directory strucuture should look like:
  • Finally run and you should see JavaFX stage:

This is not a final application for JavaFX with JBoss modules because we may face other ClassNotFound or LinkageError during runtime and javax.api  will have to be adjusted in order to add the new dependencies. It was, however, a fun and useful hack to learn more about jboss modules.

Comentários

Postagens mais visitadas deste blog

Simplest JavaFX ComboBox autocomplete

Based on this Brazilian community post , I've created a sample Combobox auto complete. What it basically does is: When user type with the combobox selected, it will work on a temporary string to store the typed text; Each key typed leads to the combobox to be showed and updated If backspace is type, we update the filter Each key typed shows the combo box items, when the combobox is hidden, the filter is cleaned and the tooltip is hidden:   The class code and a sample application is below. I also added the source to my personal github , sent me PR to improve it and there are a lot of things to improve, like space and accents support.

Dancing lights with Arduino - The idea

I have been having fun with Arduino these days! In this article I am going to show how did I use an electret mic with Arduino to create a Dancing Lights circuit. Dancing Lights   I used to be an eletronician before starting the IT college. I had my own electronics maintenance office to fix television, radios, etc. In my free time I used to create electronic projects to sell and I made a few "reais" selling a version of Dancing lights, but it was too limited: it simply animated lamps using a relay in the output of a 4017 CMOS IC. The circuit was a decimal counter  controlled by a 555. 4017 decimal counter. Source in the image When I met Arduino a few years ago, I was skeptical because I said: I can do this with IC, why should I use a microcontroller. I thought that Arduino was for kids. But now my pride is gone and I am having a lot of fun with Arduino :-) The implementation of Dancing Lights with Arduino uses an electret mic to capture the sound and light leds...

Creating custom Work Item Handler in BPM Suite/jBPM 6

Hi all! In this post I am going to share my experience creating a work item handler for BPM Suite 6.0.3 (which is very similar to jbpm as explained in a previous post ). The Hello World Work Item Handler Let's create a really simple WorkItemHandler just to print "Hello World" in the console. Of course you can implement more feature and make it receive parameters, access database, web services, etc. But in this post we will keep it simple. Really simple. First thing to do is to create a maven project for my WorkItemHandler. Here's the pom.xml of my Maven project: Notice that we are importing jbpm dependency so we can find the java interface that is used to create work item handlers. Now we can start coding. Let's create a class name HelloWorkItemHandler in package org.jugvale.jbpm, here is the simple code: Now we can build our project and go to BPM Suite to configure it so we can use this workitem. Registering the WorkItemHandler UPDATE...