Welcome!

Blog Feed Post

Creating a Maven Archetype from a #KFCStandard JavaFX Project

In this article I will discuss the creation of a Maven Archetype that my students or anyone else can use to begin developing a JavaFX application. Like so many adventures in programming this process began quickly and then bogged down in dealing with specific details. If you want to create your own archetype then this article will be helpful. Don’t forget to read the Sip of Whine section at the end.

The source code for the sample JavaFX project is at https://github.com/omnijava/SimpleJavaFX

The archetype folder ready for installation on your system is in the release of https://github.com/omnijava/ArchetypeJavaFX/releases

Step 1: Write a program

Archetypes can be created using either a bottom up or top down approach. By far the easiest approach is top down. You begin by writing a very simple Maven managed JavaFX application. You are providing a skeleton of an application that contains required or recommended packages, resources and source code.

The application I created is a simple JavaFX Stage with one Scene with a button that when pressed display some text. The code that delivers this experience is in the format that I want my students to follow. A few years ago some students created a hash tag to poke fun at my stringent rules, #KFCStandard. That I how I describe any rules or instructions that I provide to students that must be followed. This project exemplifies a number of #KFCStandards in the areas of pom files, how to start a JavaFX application, how to do unit testing and how to comment code. If you are not one of my students then you may have issues with my archetype. I would really like to hear your thoughts. Living in academia I worry that I loose site of the real world of software development.

Do your best to ensure that the program works. If you are creating an archetype where the files are empty waiting for the user to fill them in then this is likely not going to be a problem. If your code does something, as mine does, spend some time with it to get it right.

Archetype Tip #1: Always create packages that begin with the maven groupId and optionally the artifactId. This allows the user of your archetype to use their own package names.

Archetype Tip #2: If you reference the mainClass in the pom.xml as:

        <mainClass>com.kfcstandard.javafxarchetype.MainAppFX</mainClass>

Change it to

        <mainClass>${groupId}.${artifactId}.MainAppFX</mainClass>

Archetype Tip #3: If you need to have a package created when the archetype is used but you don’t have anything to place in the package then add an empty file. Maven will not create packages if there are no files in it.

pom.xml note: When I compile with NetBeans I get two warnings regarding the pom.xml. One tells me that ${groupId} is deprecated in favour of ${project.groupId} and the second tells me that ${artifactId} is deprecated in favour of ${project.artifactId}. The NetBeans 8.01 editor only recognizes ${project.groupId} and not the other. Therefore for now I am using the deprecated versions.

Step 2: Install Maven

I use NetBeans, my personal preference for an IDE and what I used in developing the archetype code. In one course that I teach I must use Eclipse. Both of these IDEs and others now provide good support for Maven. People who know me will now roll their eyes as I say that creating an archetype is easier to do at the command line. Download and install Maven from https://maven.apache.org/download.cgi. Read the install notes at https://maven.apache.org/install.html. You need to have Maven’s bin folder in the executable path and Windows users must have a JAVA_HOME environment variable.

Maven note: Some IDEs, such as NetBeans, contain the maven command line program. I recommend downloading Maven so that you are working with the most recent version.

Step 3: Clean up the project

Locate the folder your project is in. Delete everything in the project’s folder except for the src folder and the pom.xml file. You may want to make a copy of the project folder because you will be changing one file that will cause an exception to thrown if you run the project after the change.

Step 4: Alter the fxml file

If you are creating a project with an fxml file in the resources folder it likely contains a reference to its java controller file. In this project the file Scene.fxml contains:

fx:controller=”com.kenfogel.archetypejavafx.controllers.FXMLController”>

You need to replace the part of the package that matches the groupId and artifactId with the matching properties. The change looks like:

fx:controller=”${groupId}.${artifactId}.controllers.FXMLController”>

Step 5: Archetype Resolution or Generating the Archetype

Archetype Resolution is the term that the Maven developers use to describe using Maven to generate the archetype. This task will create a new target folder that contains the archetype version of your code.

Open a command window in the project’s root folder. In my case that is D:\mvnbuild\ArchetypeJavaFX. At the prompt issue the command:

mvn archetype:create-from-project

You may ignore all the warnings.

If all has gone well you will you will have the following folder that is not normally part of a Maven build:

D:\NetBeansProjects\javafxarchetype\target\generated-sources\archetype

Step 6: Make the fxml files filterable

The project in the archetype folder now contains two files named archetype-metadata.xml. This xml file determines which files will go into the archetype and whether or not they get filtered. To filter is to substitute a property with a value. That is why we changed the Scene.fxml file in the previous step. The archetype-metadata.xml files do not show that files in the fxml folder of resources are filterable. Locate these two files, mine are in:

D:\NetBeansProjects\javafxarchetype\target\generated-sources\archetype\src\main\resources\META-INF\maven

And

D:\NetBeansProjects\javafxarchetype\target\generated-sources\archetype\target\classes\META-INF\maven

Edit the files, they are identical, to change:

<fileSet encoding="UTF-8">
   <directory>src/main/resources</directory>
   <includes>
      <include>**/*.fxml</include>
      <include>**/*.css</include>
   </includes>
 </fileSet>

to read

<fileSet filtered="true" encoding="UTF-8">
   <directory>src/main/resources</directory>
   <includes>
      <include>**/*.fxml</include>
      <include>**/*.css</include>
   </includes>
</fileSet>

 

Step 7: Install the Archetype in your repository

Open a command window in your archetype folder and at the prompt enter the following commnd:

D:\NetBeansProjects\javafxarchetype\target\generated-sources\archetype>mvn install

Ignore any warnings. The archetype should be safely in

.m2\repository\com\kfcstandard\javafxarchetype-archetype

where ever your .m2 folder is.

Step 8a: Test if it works with the Maven command line

Create a new folder on your computer for the test. I created D:\mvntest. Open a command window in this folder. Run the command:

D:\mvntest>mvn archetype:generate -DarchetypeCatalog=local

What follows next is pretty straight forward. Here is my output. Notice that you need to enter the groupId, artifactId, version and package. The package should be made up from the groupId and artifactId.

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: local -> com.kfcstandard:javafxarchetype-archetype (Standard starting point for JavaFX programs for students of Ken Fogel)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 1
Define value for property 'groupId': : com.squirrel
Define value for property 'artifactId': : moose
Define value for property 'version': 1.0-SNAPSHOT: :
Define value for property 'package': com.squirrel: : com.squirrel.moose
Confirm properties configuration:
groupId: com.squirrel
artifactId: moose
version: 1.0-SNAPSHOT
package: com.squirrel.moose
 Y: : y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: javafxarchetype-archetype:0.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.squirrel
[INFO] Parameter: artifactId, Value: moose
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: com.squirrel.moose
[INFO] Parameter: packageInPathFormat, Value: com/squirrel/moose
[INFO] Parameter: package, Value: com.squirrel.moose
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: groupId, Value: com.squirrel
[INFO] Parameter: artifactId, Value: moose
[INFO] project created from Archetype in dir: D:\mvntest\moose
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.660 s
[INFO] Finished at: 2015-09-01T20:48:04-04:00
[INFO] Final Memory: 13M/243M
[INFO] ------------------------------------------------------------------------
D:\mvntest>

In the project that has been created in the mvnbuild folder examine the Scene.fxml file and ensure that it has the path to the controller based on the groupId and artifactId you entered. Check out the pom.xml in the project and verify that the mainClass has the proper package.

Step 8b: Testing with NetBeans

 Start NetBeans and select:

File -> New Project

In the dialog choose Maven on the left and Project from Archetype on the right and click on Next.

01NewProject

Scroll down to find javafxarchetype-archetype, select it and click on Next.

02Archetype01

On the next screen you can fill in the Project Name that becomes the Artifact Id, the Group Id, and Version. It’s unusual to change the Package which defaults to Group Id plus Artifact Id.

02Archetype02

Click on Finish and you will a have a project loaded. You should be able to Clean and Build and then Run this project.

03Running

You are now ready to add your code to the project.

Step 8c: Testing with Eclipse

Start Eclipse and then choose File -> New -> Other. Open Maven in this dialog and select Maven Project.

04Eclipse01

There is nothing to change in the next dialog so just click on Next.

04Eclipse02

In the next dialog you should see all the archetypes available to Eclipse. On my system the local archetypes appear first so the archetype we created should be first. Select it and click on Next.

04Eclipse03

Now you can fill in the Group Id, Artifact Id, Version and Package. Like NetBeans the Package is made up of the Group Id and Artifact Id. Click on Finish.

04Eclipse04

The project will appear in the Package Explorer. Right mouse click on the project and choose Run As -> Maven Build and at the dialog just choose Run. The program should open. Close it and you are now ready to add your code to the project.

A Sip of Whine

In learning how to create a maven archetype I was confronted with a serious issue in regards to what I found on the web. Almost every blog, post or stackoverflow answer was nothing more than paraphrasing the Apache Maven documentation. It looks to me these authors have never used Maven or Archetypes in real world situations. The same holds true for the Apache Maven documentation. It lacks any real world examples and is far from being written in plain language.

There is also a bug in the Maven Archetype system. It took me two days to track it down. If you have a package made up of the groupId and artifactId in the src/main/java folder and you have the exact same package in src/test/java then the archetype will be damaged and will not work. The solution was to place the tests in a folder one level below the package. I will report it.

Read the original blog entry...

More Stories By Ken Fogel

In 1980 I bought for myself the most wonderful toy of the day, the Apple ][+. Obsession followed quickly and by 1983 I was writing software for small and medium sized businesses in Montreal for both the Apple and the IBM PC under the company name Omnibus Systems. In the evenings I taught continuing education courses that demystified the computer to the first generation of workers who found themselves with their typewriter on the scrap heap and a PC with WordStar taking its place.

In 1990 I was invited to join the faculty at Dawson College in the Computer Science Technology program. When I joined the program the primary language was COBOL and my responsibility was to teach small systems languages such as BASIC and C/C++.

Today I am now the chairperson and program coordinator of the Computer Science Technology program at Dawson. The program's primary language is Java and the focus is on enterprise programming.

I like to write about the every day problems my students and I face in using various languages and platforms to get the job done. And from time to time I stray from the path and write about what I plan to do, what I actually get around to doing, and what I imagine I am doing.

@omniprof

Latest Stories
It is ironic, but perhaps not unexpected, that many organizations who want the benefits of using an Agile approach to deliver software use a waterfall approach to adopting Agile practices: they form plans, they set milestones, and they measure progress by how many teams they have engaged. Old habits die hard, but like most waterfall software projects, most waterfall-style Agile adoption efforts fail to produce the results desired. The problem is that to get the results they want, they have to ch...
We build IoT infrastructure products - when you have to integrate different devices, different systems and cloud you have to build an application to do that but we eliminate the need to build an application. Our products can integrate any device, any system, any cloud regardless of protocol," explained Peter Jung, Chief Product Officer at Pulzze Systems, in this SYS-CON.tv interview at @ThingsExpo, held November 1-3, 2016, at the Santa Clara Convention Center in Santa Clara, CA
Cloud Expo, Inc. has announced today that Andi Mann and Aruna Ravichandran have been named Co-Chairs of @DevOpsSummit at Cloud Expo Silicon Valley which will take place Oct. 31-Nov. 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. "DevOps is at the intersection of technology and business-optimizing tools, organizations and processes to bring measurable improvements in productivity and profitability," said Aruna Ravichandran, vice president, DevOps product and solutions marketing...
With major technology companies and startups seriously embracing Cloud strategies, now is the perfect time to attend 21st Cloud Expo October 31 - November 2, 2017, at the Santa Clara Convention Center, CA, and June 12-14, 2018, at the Javits Center in New York City, NY, and learn what is going on, contribute to the discussions, and ensure that your enterprise is on the right path to Digital Transformation.
The Internet giants are fully embracing AI. All the services they offer to their customers are aimed at drawing a map of the world with the data they get. The AIs from these companies are used to build disruptive approaches that cannot be used by established enterprises, which are threatened by these disruptions. However, most leaders underestimate the effect this will have on their businesses. In his session at 21st Cloud Expo, Rene Buest, Director Market Research & Technology Evangelism at Ara...
In his session at @ThingsExpo, Eric Lachapelle, CEO of the Professional Evaluation and Certification Board (PECB), provided an overview of various initiatives to certify the security of connected devices and future trends in ensuring public trust of IoT. Eric Lachapelle is the Chief Executive Officer of the Professional Evaluation and Certification Board (PECB), an international certification body. His role is to help companies and individuals to achieve professional, accredited and worldwide re...
"Loom is applying artificial intelligence and machine learning into the entire log analysis process, from start to finish and at the end you will get a human touch,” explained Sabo Taylor Diab, Vice President, Marketing at Loom Systems, in this SYS-CON.tv interview at 20th Cloud Expo, held June 6-8, 2017, at the Javits Center in New York City, NY.
Wooed by the promise of faster innovation, lower TCO, and greater agility, businesses of every shape and size have embraced the cloud at every layer of the IT stack – from apps to file sharing to infrastructure. The typical organization currently uses more than a dozen sanctioned cloud apps and will shift more than half of all workloads to the cloud by 2018. Such cloud investments have delivered measurable benefits. But they’ve also resulted in some unintended side-effects: complexity and risk. ...
"We are a monitoring company. We work with Salesforce, BBC, and quite a few other big logos. We basically provide monitoring for them, structure for their cloud services and we fit into the DevOps world" explained David Gildeh, Co-founder and CEO of Outlyer, in this SYS-CON.tv interview at DevOps Summit at 20th Cloud Expo, held June 6-8, 2017, at the Javits Center in New York City, NY.
21st International Cloud Expo, taking place October 31 - November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA, will feature technical sessions from a rock star conference faculty and the leading industry players in the world. Cloud computing is now being embraced by a majority of enterprises of all sizes. Yesterday's debate about public vs. private has transformed into the reality of hybrid cloud: a recent survey shows that 74% of enterprises have a hybrid cloud strategy. Me...
With major technology companies and startups seriously embracing Cloud strategies, now is the perfect time to attend 21st Cloud Expo October 31 - November 2, 2017, at the Santa Clara Convention Center, CA, and June 12-14, 2018, at the Javits Center in New York City, NY, and learn what is going on, contribute to the discussions, and ensure that your enterprise is on the right path to Digital Transformation.
SYS-CON Events announced today that Enzu will exhibit at SYS-CON's 21st Int\ernational Cloud Expo®, which will take place October 31-November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Enzu’s mission is to be the leading provider of enterprise cloud solutions worldwide. Enzu enables online businesses to use its IT infrastructure to their competitive advantage. By offering a suite of proven hosting and management services, Enzu wants companies to focus on the core of their ...
DevOps at Cloud Expo, taking place October 31 - November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with 21st Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry players in the world. The widespread success of cloud computing is driving the DevOps revolution in enterprise IT. Now as never before, development teams must communicate and collaborate in a dynamic, 24/7/365 environment. There is no time to w...
In 2014, Amazon announced a new form of compute called Lambda. We didn't know it at the time, but this represented a fundamental shift in what we expect from cloud computing. Now, all of the major cloud computing vendors want to take part in this disruptive technology. In his session at 20th Cloud Expo, Doug Vanderweide, an instructor at Linux Academy, discussed why major players like AWS, Microsoft Azure, IBM Bluemix, and Google Cloud Platform are all trying to sidestep VMs and containers wit...
Internet of @ThingsExpo, taking place October 31 - November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with 21st Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry players in the world. The Internet of Things (IoT) is the most profound change in personal and enterprise IT since the creation of the Worldwide Web more than 20 years ago. All major researchers estimate there will be tens of billions devic...