How to do a legacy software migration : a successful checklist

Legacy Software migration

Here is a small checklist about how to migrate a legacy migration and to ensure its success.

This article is part of my work to explain my knowledge about Software migration in the company Byoskill.

First measure your project according the changes involved by the migration :

  • The organizational changes
  • The process changes
  • The technological changes

The organization

You will have to think about each person involved in the Software that is going to be migrated. Which skills are required to develop, test, maintain, support the Software. How will you manage the brutal disrupt in their daily work and motivate them to embrace the change ?

I recommend you to have a clear picture of the team and not underestimate the needs of training, evangelize, and change management.

Changing technologies or framework, even without any feature changes may impact severely your end-users, the support and maintenance teams and the integration engineers.

The processes

An automated migration differs from a classical IT Software project by adding a certain disruption in terms of time and practices. Since the migration has to be hastened (thanks to the usage of specialized tools), the success of the project requires a high level of software development practices. Usually, the legacy software are still hitting the wall in terms of agility, silo breakup, continuous integration, test automation practices.

The legacy project migration requires to have a clear state (and view) of the following processes :

  • SDLC : Software development lifecycle.
    • What is the current process ?
    • Is their any traps or caveheats to be aware of ?
    • How much time does it take to push a new feature from the specification to the production ?
  • Test automation : You will have to answer many questions who are associated to well identified risks.
    • How the application is tested ?
    • At which levels ?
    • Are the tests automated ?
    • What is the coverage (estimated and measure) ?
    • What are the requirements to set up a new test environment ?
    • How much does it cost ?
    • Is test data available ?
    • How accurate is the test data ?
    • Which tools are required to execute the tests ? The licences
    • What would it take to obtain a sufficient coverage for the migration project ?
  • Continuous Integration : 
    • How the software is built ?
    • How much time does it take to produce a new release ?
    • What are the steps ?
    • Which parts are tricky or manual ?
    • What are the components to be built ?
    • How many individual parts composes the software ?
    • Which tools are used ?
    • What would it take to obtain a complete CI/CD  for the migration project ?
  • DevOps : 
    • Logging and Monitoring support :
      • Will the tools still compatible are the migration ?
    • Automatic deployment
      • What are the changes required to maintain (or obtain) an automatic deployment of the solution
    • Error and Exception handling
      • Detect and document any regressions in the current way to catch and handle the errors during the run
    • Performance testing
      • Does the software have any automated performance tests ?
      • Will they still be compatible ?
  • Release Management :
    • How many active versions for this Software ?
    • What is the branch release model ?
    • Versions to maintain and port
    • Frequency of releases and year schedule / roadmap

The technologies

A good legacy migration project is preparing a clear state of the perimeter to be migrated and the targeted solution.

It comes in a phase of three steps.

  • The actual picture
  • The definition of the target
  • The migration in itself

Drawing the current picture

The initial software assessment does really mater. Indeed an solution architect will detect any caveats and flaws in the current architecture that may critically slowdown the migration project.

Such assessment usually requires :

  • a technology survey : which technologies are used in the software, licenses issues, exact version and possibility of upgrade
  • an architecture assessment : will be controlled in priority the physical organization of the project (folders, files), the logical structure (components, package, functional and technical layers) and the dependency matrix (cycles, code weaving, code smells)
  • an automated test assessment : code coverage, tests documentation, test robustness/fragility, main complex components and their level of testing.
  • a code quality assesment : a quick review to identify in priority the main risks (reliability, security, maintainability)

The definition phase

This phase has four objectives :

  • Get a understanding of the cost and time of the migration project
  • Evaluate with the customer, the ROI of the operation
  • Eliminate the main technical  / functional risks of the migration
  • Communicate to the customer, the organization and process changes to be operated.

To achieve that, a main document (or specification) has to be produced, the migration guide.

This migration guide will expose the targeted solution, the way to achieve it, the necessary steps, a risk analysis and RACI, the cost and estimation of each tasks.

This definition phase may be accompanied by a Proof Of Concept(POC), a short term development performed on the current solution to assess the feasibility of the targeted solution and to allow any necessary test to be executed. It will be critical to pay attention to any functional regressions and performance regressions in this POC.

The migration

The migration is not a Big Rewrite. 

It’s an incremental, well-defined process where the automation is removing the main source of failure of migration projects : the time of execution.

Indeed longer the migration process is taking, more dangerous will become the project, debated and finally rejected.

A good migration project usually has the following qualities :

  • Incremental : in some way it’s possible to have the two technological environments living as room mates in the Software
  • Fast : The amount of rewriting, manual fixes and iterations to obtain the targeted solution have to be small.
  • Cost effective : The volume of manual operation cost should be significantly be smaller thanks to the automation
  • Critical : No legacy migration finds its justification without a real concern (Security, Investment, Scale up operation, Business loss or expectations)

How to make a software developer happy ?

Leave your comfort zone

To be or not to be (happy), that’s the question. In this article, I expose some thoughts about what could make a software developer happy in his work. I wrote this article with several targeted audience in mind : Junior developers, Senior Techleads and H&R resources.

Continue Reading


Developing with S3 and Java : useful links

Amazon S3 Webservices

This article is part of my web research to prepare the development of a new feature using Amazon S3 Webservices.

Continue Reading


Java developer testing toolbox

JBehave : code

An article dealing with Java application and testing frameworks and related libraries. Continue Reading


TOP open-source dashboard solutions 2017

Dashboards can be a very efficient communication tool for a team, between managers and business units. It enables an organization around a vision to share common goals. It can also be useful to identify weaknesses in processes and adapt your strategy according to them.

Continue Reading


Test and Data Generation for Java Unit tests

Today I was preparing a presentation about Software Code quality for a TechTalk on Thursday. I made a search on Internet about Automatic Unit test generator and Data Generators. I will present some tools I have tried. Today, we will speak of Randoop.

Randoom Test Generator

Randoom Test Generator

The first tool name is Randoop.. This tool is existing since 2007 and its purpose is to generate automatically unit tests 🙂 Directly from your class definition!

To use it you have two choices:

  • You can use your software JAR or classpath directory.
  • You can include it in your test compile path (on gradle or maven) and creates a main or unit test.

To explain short the theory, thanks to the Java reflection it’s quite easy to produce automatic tests validating some contracts of your API.

Some examples: – toString() should never returns null or throws an Exception – equals() and compareTo() methods have a long list of constraints – Reflexivity: o.equals(o) == true – Symmetry: o1.equals(o2) == o2.equals(o1) – Transitivity: o1.equals(o2) && o2.equals(o3) ⇒ o1.equals(o3) – Equals to null: o.equals(null) == false – It does not throw an exception

Therefore this tool is generating unit tests with JUnit(TestSuite) for the list of classes you provide.

I have done some tests and you can reach 50-60% of coverage quite easily.

The main drawbacks of the solution are: – The unit tests are drawing a snapshot (precise picture) of your code and its behaviour however some tests are really non-sense and you don’t want to edit them. – They don’t replace handwritten tests since the tool is not understand the different between a String parameter emailand fullName. He will mostly use dumb strings.

About the technology, it’s not production ready: – I had troubles with the jar and its dependency plume. – The JAR is a fatjar and coming with dependencies that broke my software.

In conclusion, I will fork the software and try to fix the problems to make it more popular 🙂


SonarQube and ReactJS

This article is showing you how to use SonarQube with ReactJS and its JSX files. I will use both SonarQube JavaScript plugin and the additional plugin Sonar EsLint plugin.

<%- toc(str, [options]) %>

For the people who has missed my previous article, I have created a new SonarQube plugin to extends the Javascript analysis.

Installation and Configuration

The first step is to download the plugin directly from Github here.

Download the plugin

Download the plugin

Find the latest release.

Find the latest release

Find the latest release

Copy it in your Sonar extension folder.

Copy the plugin

Copy the plugin

Restart the server

Restart the server by calling the commands (here on linux)

sonarqube-6.0 ./bin/linux-x86-64/sonar.sh stop
  Stopping SonarQube...
  Waiting for SonarQube to exit...
  Stopped SonarQube.
  ➜  sonarqube-6.0 ./bin/linux-x86-64/sonar.sh start

 Enabling custom rules in SonarQube

Don’t forget to modify your SonarQube profile to enable the new ESLint rules :

Add the ESLint rules to your SonarQube profile

Add the ESLint rules to your SonarQube profile

Enable the ESLint rules to your SonarQube profile

Enable the ESLint rules to your SonarQube profile

Preparing your project

 Handling SonarQube Scanner

Most projects requires the SonarQube scanner (Wiki Link to analysis Javascript. Download it somewhere on your disk and unzip it.

Creates a file sonar-project.properties̀ into your project.

Copy-paste this content and modify it :

sonar.projectName=ReactJS demo

Don’t forget the line sonar.javascript.file.suffixes=.js,.jsx, it’s the hack to make SonarQube working on JSX files!

OK! SonarQube Scanner is configured!

Preparing ESLint

We want to perform the SonarQube analysis with the additional results of ESLint. Eslint is a popular linter that provides recent rules for many javascript frameworks – ReactJS included.

ESLint is thereby often upgraded and contains through its extension system, rules and frameworks that you won’t find in the regular SonarQube installation.

If you haven’t created yet an ESLint configuration file, here is the commands :

ESLint Configuration

ESLint Configuration

You can try the configuration by launching ESLint ony your project. It may warn you that some extensions are missing. Install them with NPM or Yarn.

Missing NPM Module

Missing NPM Module

Usually, the ReactJS extension is missing of your project. You can add them like developer extensions (--save-dev) or globally (-g).

Install missing ESLINT ReactJS extension

Install missing ESLINT ReactJS extension

With the right configuration and ESLint installation, the scan of a JSX File should work :

Scanning JSX File

Scanning JSX File

OK! ESLint is configured!

 Launching SonarQube Scanner

Launchs the SonarQube scanner with the command :


And the analysis is running …

react-jsx git:(master) ✗ ~/tools/sscanner/bin/sonar-scanner
INFO: Scanner configuration file: /home/sleroy/tools/sscanner/conf/sonar-scanner.properties
INFO: Project root configuration file: /home/sleroy/git/react-jsx/sonar-project.properties
INFO: SonarQube Scanner
INFO: Java 1.8.0_121 Oracle Corporation (64-bit)
INFO: Linux 4.10.0-21-generic amd64
INFO: User cache: /home/sleroy/.sonar/cache
INFO: Load global repositories
INFO: Load global repositories (done) | time=211ms
INFO: User cache: /home/sleroy/.sonar/cache
INFO: Load plugins index
INFO: Load plugins index (done) | time=14ms
INFO: SonarQube server 6.0
INFO: Default locale: "fr_FR", source code encoding: "UTF-8" (analysis is platform dependent)
INFO: Process project properties
INFO: Load project repositories
INFO: Load project repositories (done) | time=214ms
INFO: Load quality profiles
INFO: Load quality profiles (done) | time=94ms
INFO: Load active rules
INFO: Load active rules (done) | time=897ms
INFO: Publish mode
INFO: -------------  Scan ReactJS demo
INFO: Load server rules
INFO: Load server rules (done) | time=482ms
INFO: Base dir: /home/sleroy/git/react-jsx
INFO: Working dir: /home/sleroy/git/react-jsx/.scannerwork
INFO: Source paths: src
INFO: Source encoding: UTF-8, default locale: fr_FR
INFO: Index files
INFO: 9 files indexed
INFO: Quality profile for js: Sonar way
INFO: Sensor Lines Sensor
INFO: Sensor Lines Sensor (done) | time=41ms
INFO: Sensor SCM Sensor
INFO: SCM provider for this project is: git
INFO: 9 files to be analyzed
INFO: 0/9 files analyzed
WARN: Missing blame information for the following files:
WARN:   * /home/sleroy/git/react-jsx/src/example/hello.jsx
WARN:   * /home/sleroy/git/react-jsx/src/example/index.jsx
WARN:   * /home/sleroy/git/react-jsx/src/fixtures/this.jsx
WARN:   * /home/sleroy/git/react-jsx/src/example/index.js
WARN:   * /home/sleroy/git/react-jsx/src/example/imager.jsx
WARN:   * /home/sleroy/git/react-jsx/src/fixtures/component.jsx
WARN:   * /home/sleroy/git/react-jsx/src/fixtures/advanced.jsx
WARN:   * /home/sleroy/git/react-jsx/src/fixtures/react.jsx
WARN:   * /home/sleroy/git/react-jsx/src/fixtures/hello.jsx
WARN: This may lead to missing/broken features in SonarQube
INFO: Sensor SCM Sensor (done) | time=504ms
INFO: Sensor XmlFileSensor
INFO: Sensor XmlFileSensor (done) | time=1ms
INFO: Sensor JavaScript Squid Sensor
INFO: 9 source files to be analyzed
INFO: 9/9 source files have been analyzed
INFO: Unit Test Coverage Sensor is started
INFO: Integration Test Coverage Sensor is started
INFO: Overall Coverage Sensor is started
INFO: Sensor JavaScript Squid Sensor (done) | time=893ms
INFO: Sensor Linting sensor for Javascript files
INFO: Sensor Linting sensor for Javascript files (done) | time=1438ms
INFO: Sensor Zero Coverage Sensor
INFO: Sensor Zero Coverage Sensor (done) | time=38ms
INFO: Sensor Code Colorizer Sensor
INFO: Sensor Code Colorizer Sensor (done) | time=2ms
INFO: Sensor CPD Block Indexer
INFO: DefaultCpdBlockIndexer is used for js
INFO: Sensor CPD Block Indexer (done) | time=1ms
INFO: Calculating CPD for 2 files
INFO: CPD calculation finished
INFO: Analysis report generated in 170ms, dir size=24 KB
INFO: Analysis reports compressed in 254ms, zip size=18 KB
INFO: Analysis report uploaded in 39ms
INFO: ANALYSIS SUCCESSFUL, you can browse http://localhost:9000/dashboard/index/sleroy:reactjs-demo
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://localhost:9000/api/ce/task?id=AVwHr7JyDHBkCqlFC7Sx
INFO: Task total time: 8.046 s
INFO: ------------------------------------------------------------------------
INFO: ------------------------------------------------------------------------
INFO: Total time: 10.141s
INFO: Final Memory: 48M/301M
INFO: ------------------------------------------------------------------------

Controlling the results

Go to your Sonar interface, and jump directly to the dashboard.

Our project has been analyzed.

SonarQube analysis

SonarQube analysis

We observe that the violation’s number is increasing with the new rules.

SonarQube analysis details

SonarQube analysis details

Hourra, our JSX files are analyzed !

JSX Analysis

JSX Analysis

In this article, we have installed, configured a new plugin to perform better Javascript analysis into SonarQube, working with ReactJS and JSX files.


My weekly DZone”s digest #1

This is my first post that offers a digest from a selection of DZone’s articles. I will pick DZone’s article based on my interests.

This week the subjects are : BDD Testing, Bad code, Database Connection Pooling, Kotlin, Enterprise Architecture

A few benefits you get by doing BDD

A few benefits you get by doing BDD : This article is an introduction to the Behaviour Driven Development practice. It’s interesting because we are regularly meeting teams, developers, architectures (pick your favorite one) that are confusing technical details and functionalities. As a result, the design, the tests and the architecture hides the user behaviour (the use cases ?) under a pile of technical stones. This article is a nice introduction. I recommend to go further these articles : * Your boss won’t appreciate tdd, try BDD * BDD Programming Frameworks * Java Framework JBehave.

Gumption Traps: Bad Code

Bad code, how my code...

Bad code, how my code…

Gumption Traps: Bad Code : an article about the bad code and how to deal with it.

{% blockquote Grzegorz Ziemoński%} The first step to avoid the bad code trap is to stop producing such code yourself. When faced with existing bad code,one must work smart to maintain motivation. {% endblockquote %}

This is a good introduction sentence. This week, I had a meeting with a skilled and amazing team. The meeting’s goal was to find a way to find the technical debt. The very technical debt that is ruining the application and undermining the team’s motivation. What I found interesting and refreshing in this article, is the pragmatic tone and the advice.

{% blockquote Grzegorz Ziemoński%} To avoid bad code, try to minimize the amount of newly produced bad code. {% endblockquote %}

How to avoid the depress linked to the bad code ? First of all, I want to say that developers are not receiving enough training on how to improve the code. Usually university / college courses are dedicated about How to use a framework. Therefore, few of them are able to qualify what is a bad code, what are its characteristics and de facto the ways to improve it. To avoid bad code, I try to demonstrate the personal benefits for the developers to improve their skills. Quality is not only a question of money (how much the customer is paying) but rather how much your company is paying attention to your training and personal development.

A lot of developers are overwhelmed under the technical debts without the appropriate tools (mind, technics, theory) to handle it. I try to give them gumptions about the benefits to be a better developer and how to handle the weakness of a sick application. To save a software rather than practicing euthanasia 🙂

Database Connection Pooling in Java With HikariCP

When we are discussing about Database connection pooling, most of my colleagues are relying on the good old Tomcat dbcp. However there is a niche, really funny and interesting, the guys that a competing for the best DBCP. And HikariCP is clearly a step ahead of everyone.

The article Database Connection Pooling in Java With HikariCP is presenting how to use a custom DBCP in your software.

Hikari Performance

Hikari Performance

I think it would have been great to present the differences with the standard DBCP and further debate on the advantages/disadvantages of the solutions. A good idea for a newt article 🙂

Concurrency: Java Futures and Kotlin Coroutines

Java Futures and Kotlin Coroutines An interesting article about how Java Futures and Kotlin co-routines can coexists. Honestly I am a little bit disappointed and thought that Kotlin would make things easier like in Node.JS

Are Code Rules Meant to Be Broken?

Another article about Code Quality and we could be dubious whether exists an answer to that question : Are Code Rules Meant to Be Broken.

I won’t enter too much in the details, the author’s point of view seems to be Code Rules are good if they are respected. If they are broken, it implies that the Code rules need to evolve 🙂 What do you think about it ?

Java vs. Kotlin: First Impressions Using Kotlin for a Commercial Android Project

This article is interesting since it presents a feedback session on using Kotlin in a Android project.

The following big PLUS to use Kotlin are :

  • Null safety through nullable and non-nullable types, safe calls, and safe casts.
  • Extension functions.
  • Higher-order functions / lambda expressions.
  • Data classes.
  • Immutability.
  • Coroutines (added on Kotlin 1.1).
  • Type aliases (added on Kotlin 1.1).

  Quality Code Is Loosely Coupled

Quality Code Is Loosely Coupled

This article is explaining one of the most dangerous side of coding : Coupling. Must to read article despite the lack of schemas.

Five Habits That Help Code Quality

This article is a great introduction on code assessment. These five habits are indeed things to track in your software code as a sign of decay and code sickness.

The habits are : – Write (Useful) Unit Tests – Keep Coupling to a Minimum – Be Mindful of the Principle of Least Astonishment – Minimize Cyclomatic Complexity – Get Names Right

10 Good Excuses for Not Reusing Enterprise Code

This article is really useful in the context of Digital Transformation to assess which softwares you should keep and throw.

Example of excuses : – I didn’t know that code existed. – I don’t know what that code does. – I don’t know how to use that code. – That code is not packaged in a reusable manner.

Test proven design

An interesting article and example on how to improve your own code using different skills. I really recommend to read this article and the next future ones : Test proven design.


I have tried Vue.js and I love it

Vue.js Framework

I have tried Vue.js and just love it.

Some weeks ago, I started a new project for which, I have to build an internet website.


After spending really long hours on internet, browsing, collecting every possible testimonials and advices and comparing them to my first impressions, I decided to start with an hybrid / multiple page site.

(if you are interested by the reasons, it will be the subject of another post).

An hybrid /multiple page site is a website where the content is rendered both from server side and client side at the opposition of single page application (SPA) full client side and a classical server side site(PHP..) Since I want to use the power of modern Js Frameworks as double binding, refreshing, Ajax widgets, Es2016, reactive programming and somewhat control which pages needs to be reloaded, I had to make a choice.

The list of choice is somewhat limited if keep only the 5 most popular ones. (yes I am resolutely not a pioneer of the JavaScript Jungle)

The framework selection

I made the following list :

  • Angular 2+ (they are increasing the major version number for each patch 😅)
  • React.js
  • AngularJS
  • Ember. Js
  • Vue.js
  • JQuery (it is a joke)

Selection criteria

I defined some selection criteria besides the popularity :

No code bloat : specifically to JavaScript, the syntax and the missing OOP native programming have been producing many frameworks with dumb syntax without any semantical and often syntaxical meaning. To overcome the limitations, many frameworks are using syntax sugar, making them a nightmare to memorize. The most ridiculous is the attempt to stick on these syntaxical blobs, some pseudo theorical terms.

A good framework should offer different levels of usages from the straightforward approach to build quickly and easily a website with the common use cases to the low-level approach where the experimented developer is able to tune the required details. What has been done in Laravel, Spring framework or Symphony are good samples.

Symphony framework is known as a huge galaxy. Many components, industry quality grade, but an overwhelming complexity if you start head on.

Therefore they have created a micro — framework called Silex to bootstrap an PHP application without the nasty details and it is deadly simple. If you want more complex things, the components behind Silex are the Symphony ones.

For a web framework, always study how do they handle forms. Especially a basic post form. It takes five minutes in plain HTML to build an (unsecured) form. How long does it take with this framework?

The same thing works for **Spring* and Spring boot.

The framework must have a business friendly licence. No doubt, no legal restriction for the future company. (by the way do you know you cannot build weapons software in Java, please stick to the line…)

An extensible / plug-ins architecture. I believe the success of a framework resides in the possibility to enable the necessary functionalities (aka feature toggling) during your project. Authentication, reactive programming, lazy loading, modularity.

The evaluation (aka trolling section)

Based on these selection criteria, here is my evaluation.

Disclaimer: I have a highly respect for the guys who wrote these frameworks and I do not doubt of their outstanding skills. AngularJS

I have experienced projects with AngularJS and I renounced since it is a deprecated technology. Too much code bloat, slow (I should rather say hard-to-tune) and all efforts are concentrated on the new Angular framework. Also, I think I could have a problem with my use case and disabling the AngularJS router.

Angular 2

Angular 2: I have received a training in January and wrote several prototypes since. I have been a huge fan of typescript, angular-cli. I was happy and thinking, they took the best ideas from the other frameworks and build a big melting pot.

Angular : melting pot

In Angular, you will find web components, uses template a la React.js, you have opt-in double binding, directives, modular architecture, lazy loading and so on and so on. But I progressively hate Angular for many details, slowing me down in my developments.

I really dislike their API and concepts to build forms. You have two choices, a template form design and programmatic form design. The first one is almost useless and the second one is deadly cumbersome.

In Angular, they decided to kill HTML and recreate it. How? Case-sensitive attributes and non HTML attributes. You cannot use your normal code editor on it. Beautifier tools not works or partially works. And worse of all, they conceive this awful syntax based on brackets, parens, Well, I think their are huge practitioners of the Brainfuck language.

Brainfuck language

Brainfuck language

The last issue I encountered is with their wish to produce an industrial, scalable (in the sense if I put more developers on my project, I maintain a stable learning and complexity curve). Yes, they provide dependency injection, IOC. But it really increases the learning curve.


I really wanted to start with React.js. As far I have studied it, the framework seems full of promises, with some nice pluggable functionalities.

However at the time I began to use it, I received a lot of news. The concern is about the React.js license, the Facebook license (link1, link2, link3).

Since there is a threat for the future business (everything can be considered as a social network after all), I have rejected it.


I have never tried Ember.js. Based in my readings, the framework is definitely worth of attention to build SPA applications but not for my use case. Note : during the writing of this post, I felt on that link, confirming that maybe I was wrong about ember.js


On Twitter, I am receiving a lot of feedback from happy users of Vue.js and I decided to give a try.

The syntax seems deadly simple.

Here is the brief of my experience :

I did not use vue-cli, I had to create my own packaging to adapt Vue.js to multipage architecture.

Code bloat: the Vue.js framework is really simple and the documentation quite good. The documentation for the plug-in vue-loader is quite good but I really hate the webpack syntax to enable it (rant..)

Learning curve: I did not try the most hard-core functionalities of Vue.js, though I am using vue-loader, a different template renderer (pug), transitions, a little bit components and lazy loading.

My biggest difficulty have been to maintain my js bundle as low as possible by producing chunks.

The second issue has been to understand why creating a view was creating an App and my component below using the render() function. However I think that Vue.js is easier than Angular. 2.

As in the previous example, the syntax is quite straightforward, no need to learn complex concepts to begin with.

The framework is also compatible with Typescript and the logic behind is quite simple.

Vue.js can be extended with several plug-ins and functionalities. I did not try all of them and the fact you are enabling them manually is comforting me in my approach.

Vue.js is not enforcing a particular programming paradigm(IOC, interfaces, Reactive programming, or. RxJS).

The only reproach I could formulate is a little fear about the Vue.js ecosystem. Please integrate existing libraries rather trying to recreate or mimic ReactJS libraries.

In conclusion, both of these frameworks are legitimate and have their lot of practitioners, and I don’t blame it. Vue.js has been my choice and I do not regret it, yet, since it has made my project easy, fun and effective.

I will try to provide more feedback in the following weeks especially on form editing, unkt testing and E2E testing.

Thanks for your attention


How migrate from JBoss 5 to 7

This article is part of my working notes on the subject of “How to migrate Web applications running on JBoss AS 5 to the version 7”.

JBoss Application Server – Wildfly

I will go straight to the details though here is some lines about JBoss Server.

From Wikipedia : JBoss Application Server(Now called Wildfly) is an application server authored by JBoss, now developed by Red Hat. WildFly is written in Java, and implements the Java Platform, Enterprise Edition (Java EE) specification. It runs on multiple platforms.

On 20 November 2014, JBoss Application Server was renamed Wildfly.

The product history according Wikipedia is :

  • 5.1 Release 23 May 2009
  • 7.0[10] Release 12 July 2011
  • 7.1 Release February 2012
  • 10.1.0 Release August 2016[20]

The JBoss AS community project has been renamed to the WildFly community project wildfly.org

According this JBoss 5 to 7 in 11 steps, the benefits are :

Processing time decreased by 25% without any code change. Development speed increased in my opinion (it is really hard to measure it) by 50% and we are much more productive (faster server restarts). Memory footprint lowered from 1GB to 512MB. Finally automatic application redeployment finally works! However there is always a price to pay – the migration took us 4 weeks (2 sprints).

Thanks to the presentation from Roberto Cortez, we have a clear picture of the migration.

[slideshare id=54488564&doc=migrationtalesfromjavaee5to7-151028171122-lva1-app6892]

JBOSS 5 Architecture

JBOSS 5 Architecture

JBOSS 7 Architecture

JBOSS 7 Architecture

The checklist

Prepare the checklist

When the PAAS or the Web application server have to be upgraded, several regressions may happen. The team has to pay attention to :

  • Server functionalities and integration : Performance, Security, Logging, Monitoring
  • Server configuration
  • Server deployment configuration
  • Application deployment configuration
  • Server API regressions
  • Application regressions
  • Training and risk management

Server functionalities and integration : between the versions, some functionalities and integrations provided by the server may have evolved, be fixed or simply disappeared.

Server configuration : The way the server has been configured, using scripts, GUI, may have changed, forcing the team to change their configuration files and finding the corresponding new way of doing it.

Server deployment configuration : Your deployment model configuration may have to be upgraded : single node, clustered mode, disaster recovery, high availability, reverse-proxying may behave differently in the new versions.

Application deployment configuration : the way to deploy your web applications may have changed in the new versions (GUI mode to script mode…)

Server API Regressions : usually Web Application servers are implementing a specific JEE API version, Servlet API and so on. These API may have changed causing regressions in your applications.

Application regressions : JBoss is including many components extending the JEE with BPM, Persistence, implementation. It is really important to track your dependencies (using Tattletale or mvn dependencies:tree) and interview your team about possible hacks and fixes to overcome the limits of JEE 5. This kind of workaround is difficult to migrate.

Training and risk management : This kind of migration contains its part of risks and changes. Both can create frictions inside your team of between the IT Team and your Dev teams. To ease the migration, don’t forget to dedicate some time to your teams into training to learn the new features of JAS 7. You will also have to adapt your project management to freeze for a while the features until the migration has been done.

Global checklist

This section is providing a checklist to help developers and managers to evaluate the migration risk of their applications.

 Common issues

Here is a list of common issues during the migration of applications with JBOSS AS.

4.2. Debug Migration Issues 4.2.1. Debug and Resolve Migration Issues 4.2.2. Debug and Resolve ClassNotFoundExceptions and NoClassDefFoundErrors 4.2.3. Find the JBoss Module Dependency 4.2.4. Find the JAR in the Previous Install 4.2.5. Debug and Resolve ClassCastExceptions 4.2.6. Debug and Resolve DuplicateServiceExceptions 4.2.7. Debug and Resolve JBoss Seam Debug Page Errors

  • There is a deadlock when using EJB remoting over SSL. This deadlock is present even in EAP 6.2. We’re now at the point when we have quite a patch set of features backported from WildFly to AS 7.
  • JMS : JBoss Messaging server has been deprecated and the compatibility with a JBOSS AS 5 server is really tough to maintain. Some solutions exists as explained below in the article.

 What is changing ?

Here is a summary of the evolutions between the JBoss AS version 5 and the version 6.

 JBOSS AS 6 changes

Here is the compiled list of modifications including the minor version fixes.

  • [Server functionality, Server API, Application regressions] Module based class loading

In JBoss Enterprise Application Platform 5, the class loading architecture was hierarchical. In JBoss Enterprise Application Platform 6, class loading is based on JBoss Modules. This offers true application isolation, hides server implementation classes, and only loads the classes your application needs. Class loading is concurrent for better performance. Applications written for JBoss Enterprise Application Platform 5 must be modified to specify module dependencies and in some cases, repackage archives.

  • [Server functionality, Server deployment configuration] Domain Management : In JBoss Enterprise Application Platform 6, the server can be run as a standalone server or in a managed domain.
  • [Application Deployment] Deployment Configuration : Standalone Servers and Managed Domains : Boss Enterprise Application Platform 5 used profile based deployment configuration. These profiles were located in the EAP_HOME/server/ directory. Applications often contained multiple configuration files for security, database, resource adapter, and other configurations. In JBoss Enterprise Application Platform 6, deployment configuration is done using one file. JBoss Enterprise Application Platform 5 configuration files must be migrated to the new single configuration file.
  • [Server functionality, Application deployment configuration] Ordering of deployments : Application Platform 5 applications that consist of multiple modules deployed as EARs and use legacy JNDI lookups instead of CDI injection or resource-ref entries may require configuration changes.
  • [Server functionality, Application deployment configuration] Directory Structure and Scripts : As previously mentioned, JBoss Enterprise Application Platform 6 no longer uses profile based deployment configuration, so there is no EAP_HOME/server/ directory.
  • [Server application, Application deployment configuration, Application regression JNDI Lookups JBoss Enterprise Application Platform 6 now uses standardized portable JNDI namespaces.
  • [Server functionality, Server configuration, Application configuration, Application code] : Changing logging dependencies
  • [Server API, Application configuration regressions] Resource adapter configuration : In previous versions of the application server, the resource adapter configuration was defined in a file with a suffix of *-ds.xml. In JBoss Enterprise Application Platform 6, a resource adapter is configured in the server configuration file.
  • [Server libraries] Technologies upgrade : JDK 6, JSF 2, Bean Validation (JSR-303), CDI, EJB 3 (1.1.13)
  • Include mod_cluster
  • Servlet API 3.0
  • Update CL to 2.0.8.GA
  • Update Deployers to 2.0.9.GA
  • Update Javassist to 3.11.0.GA
  • Update JBossWS to 3.2.1.GA
  • Update JBossXB to 2.0.2.Beta3
  • Update JGroups to 2.6.13
  • Update Kernel to 2.0.9.GA
  • Update MC-INT to 2.2.0.Alpha2
  • Update MDR to 2.0.2.GA
  • Update to Entity Manager 3.5 and JPA 2
  • Update to JBoss AOP 2.1.6.GA
  • Update VFS to 2.2.0.Alpha1
  • Upgrade apache-beanutils to 1.8.0
  • Upgrade ha-server-cache-jbc to 2.1.0.GA
  • Upgrade JBoss Cache to 3.2.1.GA
  • Upgrade jboss-common-core to 2.2.16.GA
  • Upgrade jboss-ha-server-cache-jbc to 2.0.1.GA
  • Upgrade JBoss JAXR to 2.0.1
  • Upgrade JBoss LogManager to 1.1.0.GA
  • Upgrade JBoss Security 2.0.4.SP2
  • Upgrade JBossXACML to 2.0.4
  • Upgrade JSF to 2.0.0-RC
  • Upgrade to Java Mail 1.4.2
  • Upgrade to JBossXACML 2.0.3.SP2
  • Upgrade XNIO Metadata to 1.0.1.GA
  • New library JBossWS-CXF
  • library update RestEasy
  • JBoss Messaging JMS & MDB replaced by Hornet MQ
  • New RMI Framework : Remote 3
  • VFS Library update
  • [Server functionalities] new server functionalities : Mod_cluster, JBoss Embedded AS
  • [Application deployment] The legacy pooled invoker has been removed. Applications using the pooled invoker should switch to the JBoss Remoting-based unified invoker, which has been the default detached invoker since 4.2.

 JBOSS AS Release 7

Here is the compiled list of modifications including the minor version fixes.

  • [Server functionality, Application regressions] Security improvement

Unlike previous releases, with AS 7.1, remote access requires secure authentication by default. This includes both managment (native, jmx, etc) and various remote application protocols (ejb, jndi, jms, etc); Added SSL support for the Remoting interfaces.

  • [Application configuration deployment] Management API improvements : All configuration attributes are updatable via the CLI. Direct edits to the XML are not necessary.
  • [Server functionality] Various Administration Console Improvements and Management changes
  • [Server API] Remote Connectivity Added support for remote EJB, JNDI and JMX invocation over JBoss Remoting 3, IIOP, Remote JMS. Three modes for accessing remote EE components using JNDI (Client, Traditional Remote, and Delegated).
  • [Server deployment model] Clustering Enhancements : Standalone Servers and Managed Domains : Numerours fixes in HTTP Session Replication, Clustered Web SSO, EJB Stateful Session Bean Replication, EJB load-balancing and failove, JPA XPC propagation
  • [Server functionality] CLI Regressions jboss-admin.sh renamed to jboss-cli.sh, data-source add" "--pool-name" argument seems to have changed to “–name”.
  • [Server libraries] Technologies upgrade :
  • EJB 3.1 Full – Adds a number of key features, including remote communication, asynchronous method invocation, timers, message-driven beans, and legacy compatibility with EJB 2.
  • CMP 2 – Provides a legacy persistence manager which predates JPA. This is benefical to legacy applications which make use of EJB 2.x Entity Beans.
  • JAX-WS 2.2 – Allows simplified usage of Web Services in the EE platform.
  • JAX-RPC 1.1 – Offers legacy support for older Java EE Web Services applications.
  • JAX-RS 1.1 – Supports the construction of RESTful Web Services using the Java EE platform.
  • JavaMail 1.4 – Allows Java EE applications to send and receive e-mail
  • JCA 1.6 – Provides a mechanism for third parties to provide support for custom data sources, as well as connection pooling and transaction management for database access.
  • JMS 1.1 – Adds advanced messaging support to EE applications.
  • IIOP – Supports interoperablility with other application servers and non-Java CORBA clients.
  • JSR-88 – Allows for managing deployments to a Java EE server in a portable fashion.
  • Update mod_cluster to 1.2.0.Final
  • IronJacamar 1.0.7.Final
  • Upgrade Infinispan to 5.1.0.CR3
  • Upgrade to JBossTS 4.16.1
  • Upgrade jboss-metadata to 7.0.0.Beta33
  • Upgrade JGroups to 3.0.3.Final
  • Upgrade JBoss Marshalling to 1.3.6.GA
  • Upgrade httpcore to 4.1.4
  • Upgrade to JBossWS 4.0.1.GA and Apache CXF 2.4.6
  • Update to classfilewriter 1.0.1
  • Upgrade to JSF 2.1.7
  • Upgrade PicketLink to 2.0.2.Final
  • Upgrade PicketBox to 4.0.7.Final
  • Upgrade commons-beanutils to 1.8.3
  • Upgrade Google Guava to 11.0.2
  • [Server functionalities] new server functionalities : Mod_cluster, JBoss Embedded AS
  • [Application deployment] The legacy pooled invoker has been removed. Applications using the pooled invoker should switch to the JBoss Remoting-based unified invoker, which has been the default detached invoker since 4.2.
  • [Server functionalities] new server functionalities : Mod_cluster, JBoss Embedded AS
  • [Application deployment] The legacy pooled invoker has been removed. Applications using the pooled invoker should switch to the JBoss Remoting-based unified invoker, which has been the default detached invoker since 4.2.

How to migrate : plan and tasks

  • JDBC configuration
  • Classpath references
  • Global Modules Reference
  • JMS migration :

According link, we thought it would be really hard to connect with JMS server based on JBoss 5. It turned out that you have 2 options and both work fine:

  • Start HornetQ server on your own instance and create a bridge to JBoss 5 instance
  • Uses a JMS Bridge to move the existing messages
  • Use Generic JMS adapter: https://github.com/jms-ra/generic-jms-ra

 Application packaging and configuration

  • Repackaging Dependencies and fix the EAR Layout: link
  • Install and configure the JDBC Driver link
  • Update the Resource Adapter Configuration
  • Configure the datasource for Hibernate and JPA : If your application uses JPA and currently bundles the Hibernate JARs, you may want to use the Hibernate that is included with JBoss Enterprise Application Platform 6.

In WildFly 8, a resource adapter is configured in the server configuration file. If you are running in domain mode, the configuration file is the domain/configuration/domain.xml file. If you are running in standalone mode, you will configure the resource adapter in the standalone/configuration/standalone.xml file.

More details there How to migrate from AS5 or AS6 to Wildfly

  • Migration of the shell scripts, integration test scripts, deployment scripts.

Application code and configuration migration

Here is the list of tasks implying some rewriting inside your application code.

  • Migration JEE 5 to JEE 6
  • Upgrade to JPA 2.0
  • Update your SOAP Implementations using JBossWS-CXF
  • Upgrade Hibernate from 3 to 4
  • Replacing JBOSS Cache by Infinispan Cache
  • Configure JAX-RS / Resteasy changes
  • Fix Hibernate’s sequencer
  • Replace JBOSS AOP Interceptors : JBoss AOP was used by the EJB container. However, in AS 7, the EJB container uses a new mechanism. If your application uses JBoss AOP, you need modify your application code as follows.
  • Migrating JNDI : Migrating JNDI namespaces
  • Update the datasources : link
  • Rewriting of your RMI Code : oss 5 and 7 are totally different and this kind of communication will not work.
  • Using CDI instead of plain old Singletons


Here is a list of useful tools to assist you in your migration.

  • IronJacamar : to update your datasource configuration
  • Tattletale : to find the application dependencies
  • Gilder : An application for migrating the configuration of JBoss AS 5-based servers to JBoss AS 7-based servers.
  • Tools and tooling to migrate to JBOSSS 6 : Link
  • Upgrades to newer versions of WildFly or JBoss EAP may be handled using the JBoss Windup migration tool. JBoss Windup migration tool