In the configuration of the plugin you can have a directive like the following:

      <plugin>
        <groupId>org.apache.tomee.patch</groupId>
        <artifactId>tomee-patch-plugin</artifactId>
        <version>0.4-SNAPSHOT</version>
        <configuration>
          <select>tomee-plume-webapp-transformed-.*\.war</select>
          <patchSources>
            <source>${project.basedir}/../../transform/src/patch/java/</source>
            <source>${project.basedir}/src/patch/java/</source>
          </patchSources>
          <replace>
            <jars>
              <jakarta.faces-3.0.0.jar>org.glassfish:jakarta.faces:jar:3.0.0</jakarta.faces-3.0.0.jar>
              <eclipselink-3.0.0.jar>org.eclipse.persistence:eclipselink:jar:3.0.0</eclipselink-3.0.0.jar>
            </jars>
            <resources>
              <openejb-version.properties>${project.build.outputDirectory}/openejb-version.properties</openejb-version.properties>
            </resources>
          </replace>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>run</goal>
            </goals>
            <phase>package</phase>
          </execution>
        </executions>
      </plugin>

## Select what archives to patch

The `<select>` setting is what tells the plugin which binaries to modify.  Its value is a regular expression.

        <configuration>
          <select>tomee-plume-webapp-transformed-.*\.war</select>
        </configuration>

In the above setting we're saying we want to patch the output of the Eclipse Transformer.  The input to the transformer is the regular `tomee-plume-webapp-9.0.0-M123-SNAPSHOT.war` file and the output is a new `tomee-plume-webapp-transformed-9.0.0-M123-SNAPSHOT.war` file.  It's the "transformed" file we want to further patch.

## Source Java Files

The `<patchSources>` list allows us to specify locations where *.java files live.  The following configuration is enabled by default and does not need to be specified:

        <configuration>
          <patchSources>
            <source>${project.basedir}/src/patch/java/</source>
          </patchSources>
        </configuration>

Multiple locations can be specified, for example:

        <configuration>
          <patchSources>
            <source>${project.basedir}/src/patch/java/</source>
            <source>${project.basedir}/../../transform/src/patch/java/</source>
          </patchSources>
        </configuration>

Being able to have multiple locations for patch files keeps us from having to duplicate patch files as we build multiple war files in multiple modules.  The above configuration says grab the *.java files from the `transform` module and the *.java files from this module.

We will copy these into the `target/` directory and compile them using any *.jar files we find in the war file to create the classpath.  These compiled classes are then used to overwrite any classes by that name in any part of the war or its libraries.  This is how we handle corner cases that are too complicated to deal with using bytecode tools -- we can just specify an alternate source file.

## Excluding Specific Java Source Files

In the situation where you want to exclude certain java packages from the patching process, you can exclude them via `<sourceExcludes>` as follows:

        <configuration>
          <sourceExcludes>
            <exclude>org/apache/cxf</exclude>
          </sourceExcludes>
        </configuration>

The above will skip all sources found under the `org/apache/cxf` package directory.  This can be nice when trying a library upgrade to see if something that previously needed a patch is now fixed.

## Adding Dependencies for compiled patches

If the sources have dependencies on jars not found in the zip itself, those can be added to the configuration as follows.

    <configuration>
      <dependencies>
        <dependency>org.apache.aries.blueprint:blueprint-parser:jar:1.6.0</dependency>
        <dependency>org.apache.aries.blueprint:org.apache.aries.blueprint.api:jar:1.0.1</dependency>
        <dependency>org.apache.aries.blueprint:org.apache.aries.blueprint.core:jar:1.10.2</dependency>
        <dependency>org.apache.tomcat:tomcat-servlet-api:jar:10.0.4</dependency>
        <dependency>org.osgi:org.osgi.core:jar:6.0.0</dependency>
        <dependency>org.osgi:osgi.cmpn:jar:6.0.0</dependency>
        <dependency>org.ow2.asm:asm:jar:9.1</dependency>
        <dependency>org.springframework:spring-aop:jar:5.3.6</dependency>
        <dependency>org.springframework:spring-beans:jar:5.3.6</dependency>
        <dependency>org.springframework:spring-context:jar:5.3.6</dependency>
        <dependency>org.springframework:spring-core:jar:5.3.6</dependency>
        <dependency>org.springframework:spring-webmvc:jar:5.3.6</dependency>
      </dependencies>
    </configuration>

Note that transitive dependecies are not supported, so each jar directly needed to compile must be specified individually.

## Replacing Jar files in the Archive

The `<replace><jars>` list allows us to tell the plugin, "when you see a `jakarta.faces-3.0.0.jar` in the war file, replace it with the `org.glassfish:jakarta.faces:jar:3.0.0` artifact from our local maven repo."

        <configuration>
          <replace>
            <jars>
              <hibernate-validator-7.0.0.Final.jar>org.hibernate.validator:hibernate-validator:jar:7.0.0.Final</hibernate-validator-7.0.0.Final.jar>
              <jakarta.faces-3.0.0.jar>org.glassfish:jakarta.faces:jar:3.0.0</jakarta.faces-3.0.0.jar>
              <eclipselink-3.0.0.jar>org.eclipse.persistence:eclipselink:jar:3.0.0</eclipselink-3.0.0.jar>
            </jars>
          </replace>
        </configuration>

We can use this to effectively restore any jars we do not want the Eclipse Transformer to modify.  This will be any jar file that already fully supports the Jakarta namespace, like the latest Eclipselink, Mojarra or MyFaces.  Of course in theory the Transformer shouldn't have a negative impact on jars that already support the new namespace, but why risk it when it's easy to gain 100% confidence the jar we ship is byte for byte the same one produced by the respective project.

This setting could potentially also be used to do library upgrades via the patch plugin.

WARNING: At the moment this will maintain the original file name as found in the jar.  If you replace an old green-1.2.3.jar with a newer green-2.0.1.jar, the file name will still be green-1.2.3.jar but the contents will be green-2.0.1.jar.  A PR to fix this is welcome.

## replace/resources

The `<replace><jars>` list allows us to tell the plugin, "when you see an `openejb-version.properties` file anywhere in the war file or its libraries, replace it with the specially modified version from `target/classes/`."  In the module we're generating a new `openejb-version.properties` so we can change the version TomEE reports from "8.0.7-SNAPSHOT" to "9.0.0-M7-SNAPSHOT"

## Skipping Jar files from the Archives
This is useful when you have jars found in the archive need to preserve jar signature metadata.
The `<skips><jars>` list allows you to tell the plugin which Jars should be skipped during archive transformation.
Example configuration:

        <configuration>
           <skips>
               <jars>
                 <eclipselink-3.0.0.jar>org.eclipse.persistence:eclipselink:jar:3.0.0</eclipselink-3.0.0.jar>
                 <bcprov-jdk15on-1.69.jar>org.bouncycastle:bcprov-jdk15on:jar:1.69</bcprov-jdk15on-1.69.jar>
               </jars>
             </skips>
        </configuration>