# Apache Tomcat migration tool for Jakarta EE

## Overview

This tool is a work in progress.

The aim of the tool is to take a web application written for Java EE 8 that
runs on Apache Tomcat 9 and convert it automatically so it runs on Apache
Tomcat 10 which implements Jakarta EE 9.

The tool can be used from the command line or as an Ant task.

## Usage

### Build

Build the migration tool with:

    ./mvnw verify

### Migrate

Migrate your Servlet application with:

    java -jar target/jakartaee-migration-*-shaded.jar <source> <destination>

The source should be a path to a compressed archive, a folder or an individual
file. The destination will be created at the specified path as a resource of
the same type as the source.

> **INFO**
> This tool will remove cryptographic signatures from JAR files contained
> in the *source*, as the changed resources would not match them anymore.
>
> A warning will be logged for each JAR file where the signature has been removed.

## Ant task

The migration tool is available as an Ant task, here is an example:

    <taskdef name="javax2jakarta" classname="org.apache.tomcat.jakartaee.MigrationTask" classpath="jakartaee-migration-*-shaded.jar"/>
    
    <javax2jakarta src="webapp.war" dest="webapp.migrated.war" profile="tomcat"/>

## Differences between Java EE 8 and Jakarta EE 9

Jakarta EE 9 is still under development and there are some details that remain
to be worked out.

The differences currently supported by this tool are:

* Renaming packages for Jakarta EE 9 APIs from `javax.*` to `jakarta.*`

The differences yet to be implemented by this tool are:

* Remaining issues once resolved

The issues still to be resolved by the Jakarta EE projects that will impact
this tool are:

* XML schemas
