Ability to add new classes to an existing packge of jar
If the jar has classes in that exact package, any new classes for the same package will be added.  It will not add new packages.
diff --git a/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Clazz.java b/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Clazz.java
index e312a47..9053913 100644
--- a/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Clazz.java
+++ b/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Clazz.java
@@ -22,15 +22,21 @@
 public class Clazz {
     private final String name;
     private final String prefix;
+    private final String packge;
     private final File file;
     private int applied;
 
     public Clazz(final String name, final File file) {
         this.name = name;
         this.prefix = name.replaceAll("\\.class$", "");
+        this.packge = asPackage(name);
         this.file = file;
     }
 
+    public static String asPackage(final String path) {
+        return path.replaceAll("[^/]+\\.class$", "");
+    }
+
     public void applied() {
         this.applied++;
     }
@@ -55,6 +61,10 @@
         return file;
     }
 
+    public String getPackge() {
+        return packge;
+    }
+
     @Override
     public boolean equals(final Object o) {
         if (this == o) return true;
diff --git a/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Transformation.java b/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Transformation.java
index 2556876..982c44a 100644
--- a/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Transformation.java
+++ b/tomee-patch-core/src/main/java/org/apache/tomee/patch/core/Transformation.java
@@ -16,13 +16,6 @@
  */
 package org.apache.tomee.patch.core;
 
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Opcodes;
-import org.tomitribe.swizzle.stream.StreamBuilder;
-import org.tomitribe.util.IO;
-import org.tomitribe.util.Mvn;
-
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -37,6 +30,13 @@
 import java.util.zip.ZipInputStream;
 import java.util.zip.ZipOutputStream;
 
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Opcodes;
+import org.tomitribe.swizzle.stream.StreamBuilder;
+import org.tomitribe.util.IO;
+import org.tomitribe.util.Mvn;
+
 import static org.tomitribe.jkta.util.Predicates.not;
 
 public class Transformation {
@@ -225,121 +225,121 @@
         }
 
         inputStream = StreamBuilder.create(inputStream)
-                                   .replace("javax.activation", "jakarta.activation")
-                                   .replace("javax.annotation", "jakarta.annotation")
-                                   .replace("javax.batch", "jakarta.batch")
-                                   .replace("javax.decorator", "jakarta.decorator")
-                                   .replace("javax.ejb", "jakarta.ejb")
-                                   .replace("javax.el", "jakarta.el")
-                                   .replace("javax.enterprise", "jakarta.enterprise")
-                                   .replace("javax\\.faces", "jakarta\\.faces")
-                                   .replace("javax.inject", "jakarta.inject")
-                                   .replace("javax.interceptor", "jakarta.interceptor")
-                                   .replace("javax.jms", "jakarta.jms")
-                                   .replace("javax.json", "jakarta.json")
-                                   .replace("javax.json.bind", "jakarta.json.bind")
-                                   .replace("javax.jws", "jakarta.jws")
-                                   .replace("javax.mail", "jakarta.mail")
-                                   .replace("javax.persistence", "jakarta.persistence")
-                                   .replace("javax.resource", "jakarta.resource")
-                                   .replace("javax.security.auth.message", "jakarta.security.auth.message")
-                                   .replace("javax.security.enterprise", "jakarta.security.enterprise")
-                                   .replace("javax.security.jacc", "jakarta.security.jacc")
-                                   .replace("javax.servlet", "jakarta.servlet")
-                                   .replace("javax.transaction", "jakarta.transaction")
-                                   .replace("javax.validation", "jakarta.validation")
-                                   .replace("javax.websocket", "jakarta.websocket")
-                                   .replace("javax.ws.rs", "jakarta.ws.rs")
-                                   .replace("javax.xml.bind", "jakarta.xml.bind")
-                                   .replace("javax.xml.soap", "jakarta.xml.soap")
-                                   .replace("javax.xml.ws", "jakarta.xml.ws")
+                .replace("javax.activation", "jakarta.activation")
+                .replace("javax.annotation", "jakarta.annotation")
+                .replace("javax.batch", "jakarta.batch")
+                .replace("javax.decorator", "jakarta.decorator")
+                .replace("javax.ejb", "jakarta.ejb")
+                .replace("javax.el", "jakarta.el")
+                .replace("javax.enterprise", "jakarta.enterprise")
+                .replace("javax\\.faces", "jakarta\\.faces")
+                .replace("javax.inject", "jakarta.inject")
+                .replace("javax.interceptor", "jakarta.interceptor")
+                .replace("javax.jms", "jakarta.jms")
+                .replace("javax.json", "jakarta.json")
+                .replace("javax.json.bind", "jakarta.json.bind")
+                .replace("javax.jws", "jakarta.jws")
+                .replace("javax.mail", "jakarta.mail")
+                .replace("javax.persistence", "jakarta.persistence")
+                .replace("javax.resource", "jakarta.resource")
+                .replace("javax.security.auth.message", "jakarta.security.auth.message")
+                .replace("javax.security.enterprise", "jakarta.security.enterprise")
+                .replace("javax.security.jacc", "jakarta.security.jacc")
+                .replace("javax.servlet", "jakarta.servlet")
+                .replace("javax.transaction", "jakarta.transaction")
+                .replace("javax.validation", "jakarta.validation")
+                .replace("javax.websocket", "jakarta.websocket")
+                .replace("javax.ws.rs", "jakarta.ws.rs")
+                .replace("javax.xml.bind", "jakarta.xml.bind")
+                .replace("javax.xml.soap", "jakarta.xml.soap")
+                .replace("javax.xml.ws", "jakarta.xml.ws")
 
-                                   // These sub packages to the above must be renamed back
-                                   .replace("jakarta.annotation.process", "javax.annotation.process")
-                                   .replace("jakarta.enterprise.deploy", "javax.enterprise.deploy")
-                                   .replace("jakarta.transaction.xa", "javax.transaction.xa")
+                // These sub packages to the above must be renamed back
+                .replace("jakarta.annotation.process", "javax.annotation.process")
+                .replace("jakarta.enterprise.deploy", "javax.enterprise.deploy")
+                .replace("jakarta.transaction.xa", "javax.transaction.xa")
 
-                                   // Packages that are often falsely renamed
-                                   // Exceptions to the exceptions
+                // Packages that are often falsely renamed
+                // Exceptions to the exceptions
 
-                                   .replace("jakarta.accessibility", "javax.accessibility")
-                                   .replace("jakarta.annotation.processing", "javax.annotation.processing")
-                                   .replace("jakarta.cache", "javax.cache")
-                                   .replace("jakarta.crypto", "javax.crypto")
-                                   .replace("jakarta.imageio", "javax.imageio")
-                                   .replace("jakarta.jdo", "javax.jdo")
-                                   .replace("jakarta.jmdns", "javax.jmdns")
-                                   .replace("jakarta.lang", "javax.lang")
-                                   .replace("jakarta.lang.model", "javax.lang.model")
-                                   .replace("jakarta.management", "javax.management")
-                                   .replace("jakarta.naming", "javax.naming")
-                                   .replace("jakarta.net", "javax.net")
-                                   .replace("jakarta.portlet", "javax.portlet")
-                                   .replace("jakarta.print", "javax.print")
-                                   .replace("jakarta.rmi", "javax.rmi")
-                                   .replace("jakarta.script", "javax.script")
-                                   .replace("jakarta.security.Principal", "javax.security.Principal")
-                                   .replace("jakarta.security.auth.AuthPermission", "javax.security.auth.AuthPermission")
-                                   .replace("jakarta.security.auth.Deprecated", "javax.security.auth.Deprecated")
-                                   .replace("jakarta.security.auth.DestroyFailedException", "javax.security.auth.DestroyFailedException")
-                                   .replace("jakarta.security.auth.Destroyable", "javax.security.auth.Destroyable")
-                                   .replace("jakarta.security.auth.LdapPrincipal", "javax.security.auth.LdapPrincipal")
-                                   .replace("jakarta.security.auth.NTDomainPrincipal", "javax.security.auth.NTDomainPrincipal")
-                                   .replace("jakarta.security.auth.NTNumericCredential", "javax.security.auth.NTNumericCredential")
-                                   .replace("jakarta.security.auth.NTSid", "javax.security.auth.NTSid")
-                                   .replace("jakarta.security.auth.NTSidDomainPrincipal", "javax.security.auth.NTSidDomainPrincipal")
-                                   .replace("jakarta.security.auth.NTSidGroupPrincipal", "javax.security.auth.NTSidGroupPrincipal")
-                                   .replace("jakarta.security.auth.NTSidPrimaryGroupPrincipal", "javax.security.auth.NTSidPrimaryGroupPrincipal")
-                                   .replace("jakarta.security.auth.NTSidUserPrincipal", "javax.security.auth.NTSidUserPrincipal")
-                                   .replace("jakarta.security.auth.NTUserPrincipal", "javax.security.auth.NTUserPrincipal")
-                                   .replace("jakarta.security.auth.PolicyFile", "javax.security.auth.PolicyFile")
-                                   .replace("jakarta.security.auth.PrincipalComparator", "javax.security.auth.PrincipalComparator")
-                                   .replace("jakarta.security.auth.PrivateCredentialPermission", "javax.security.auth.PrivateCredentialPermission")
-                                   .replace("jakarta.security.auth.RefreshFailedException", "javax.security.auth.RefreshFailedException")
-                                   .replace("jakarta.security.auth.Refreshable", "javax.security.auth.Refreshable")
-                                   .replace("jakarta.security.auth.SolarisNumericGroupPrincipal", "javax.security.auth.SolarisNumericGroupPrincipal")
-                                   .replace("jakarta.security.auth.SolarisNumericUserPrincipal", "javax.security.auth.SolarisNumericUserPrincipal")
-                                   .replace("jakarta.security.auth.SolarisPrincipal", "javax.security.auth.SolarisPrincipal")
-                                   .replace("jakarta.security.auth.Subject", "javax.security.auth.Subject")
-                                   .replace("jakarta.security.auth.SubjectDomainCombiner", "javax.security.auth.SubjectDomainCombiner")
-                                   .replace("jakarta.security.auth.UnixNumericGroupPrincipal", "javax.security.auth.UnixNumericGroupPrincipal")
-                                   .replace("jakarta.security.auth.UnixNumericUserPrincipal", "javax.security.auth.UnixNumericUserPrincipal")
-                                   .replace("jakarta.security.auth.UnixPrincipal", "javax.security.auth.UnixPrincipal")
-                                   .replace("jakarta.security.auth.UserPrincipal", "javax.security.auth.UserPrincipal")
-                                   .replace("jakarta.security.auth.X500Principal", "javax.security.auth.X500Principal")
-                                   .replace("jakarta.security.auth.callback", "javax.security.auth.callback")
-                                   .replace("jakarta.security.auth.kerberos", "javax.security.auth.kerberos")
-                                   .replace("jakarta.security.auth.login", "javax.security.auth.login")
-                                   .replace("jakarta.security.auth.spi", "javax.security.auth.spi")
-                                   .replace("jakarta.security.auth.subject", "javax.security.auth.subject")
-                                   .replace("jakarta.security.auth.x500", "javax.security.auth.x500")
-                                   .replace("jakarta.security.cert", "javax.security.cert")
-                                   .replace("jakarta.security.sasl", "javax.security.sasl")
-                                   .replace("jakarta.smartcardio", "javax.smartcardio")
-                                   .replace("jakarta.sound", "javax.sound")
-                                   .replace("jakarta.sql", "javax.sql")
-                                   .replace("jakarta.swing", "javax.swing")
-                                   .replace("jakarta.tools", "javax.tools")
-                                   .replace("jakarta.transaction.xa", "javax.transaction.xa")
-                                   .replace("jakarta.wsdl", "javax.wsdl")
-                                   .replace("jakarta.xml.XML", "javax.xml.XML")
-                                   .replace("jakarta.xml.access", "javax.xml.access")
-                                   .replace("jakarta.xml.catalog", "javax.xml.catalog")
-                                   .replace("jakarta.xml.crypto", "javax.xml.crypto")
-                                   .replace("jakarta.xml.datatype", "javax.xml.datatype")
-                                   .replace("jakarta.xml.messaging", "javax.xml.messaging")
-                                   .replace("jakarta.xml.namespace", "javax.xml.namespace")
-                                   .replace("jakarta.xml.parser", "javax.xml.parser")
-                                   .replace("jakarta.xml.parsers", "javax.xml.parsers")
-                                   .replace("jakarta.xml.registry", "javax.xml.registry")
-                                   .replace("jakarta.xml.rpc", "javax.xml.rpc")
-                                   .replace("jakarta.xml.stream", "javax.xml.stream")
-                                   .replace("jakarta.xml.transform", "javax.xml.transform")
-                                   .replace("jakarta.xml.validation", "javax.xml.validation")
-                                   .replace("jakarta.xml.xpath", "javax.xml.xpath")
-                                   .replace("javax.enterprise.deploy-api", "jakarta.enterprise.deploy-api")
+                .replace("jakarta.accessibility", "javax.accessibility")
+                .replace("jakarta.annotation.processing", "javax.annotation.processing")
+                .replace("jakarta.cache", "javax.cache")
+                .replace("jakarta.crypto", "javax.crypto")
+                .replace("jakarta.imageio", "javax.imageio")
+                .replace("jakarta.jdo", "javax.jdo")
+                .replace("jakarta.jmdns", "javax.jmdns")
+                .replace("jakarta.lang", "javax.lang")
+                .replace("jakarta.lang.model", "javax.lang.model")
+                .replace("jakarta.management", "javax.management")
+                .replace("jakarta.naming", "javax.naming")
+                .replace("jakarta.net", "javax.net")
+                .replace("jakarta.portlet", "javax.portlet")
+                .replace("jakarta.print", "javax.print")
+                .replace("jakarta.rmi", "javax.rmi")
+                .replace("jakarta.script", "javax.script")
+                .replace("jakarta.security.Principal", "javax.security.Principal")
+                .replace("jakarta.security.auth.AuthPermission", "javax.security.auth.AuthPermission")
+                .replace("jakarta.security.auth.Deprecated", "javax.security.auth.Deprecated")
+                .replace("jakarta.security.auth.DestroyFailedException", "javax.security.auth.DestroyFailedException")
+                .replace("jakarta.security.auth.Destroyable", "javax.security.auth.Destroyable")
+                .replace("jakarta.security.auth.LdapPrincipal", "javax.security.auth.LdapPrincipal")
+                .replace("jakarta.security.auth.NTDomainPrincipal", "javax.security.auth.NTDomainPrincipal")
+                .replace("jakarta.security.auth.NTNumericCredential", "javax.security.auth.NTNumericCredential")
+                .replace("jakarta.security.auth.NTSid", "javax.security.auth.NTSid")
+                .replace("jakarta.security.auth.NTSidDomainPrincipal", "javax.security.auth.NTSidDomainPrincipal")
+                .replace("jakarta.security.auth.NTSidGroupPrincipal", "javax.security.auth.NTSidGroupPrincipal")
+                .replace("jakarta.security.auth.NTSidPrimaryGroupPrincipal", "javax.security.auth.NTSidPrimaryGroupPrincipal")
+                .replace("jakarta.security.auth.NTSidUserPrincipal", "javax.security.auth.NTSidUserPrincipal")
+                .replace("jakarta.security.auth.NTUserPrincipal", "javax.security.auth.NTUserPrincipal")
+                .replace("jakarta.security.auth.PolicyFile", "javax.security.auth.PolicyFile")
+                .replace("jakarta.security.auth.PrincipalComparator", "javax.security.auth.PrincipalComparator")
+                .replace("jakarta.security.auth.PrivateCredentialPermission", "javax.security.auth.PrivateCredentialPermission")
+                .replace("jakarta.security.auth.RefreshFailedException", "javax.security.auth.RefreshFailedException")
+                .replace("jakarta.security.auth.Refreshable", "javax.security.auth.Refreshable")
+                .replace("jakarta.security.auth.SolarisNumericGroupPrincipal", "javax.security.auth.SolarisNumericGroupPrincipal")
+                .replace("jakarta.security.auth.SolarisNumericUserPrincipal", "javax.security.auth.SolarisNumericUserPrincipal")
+                .replace("jakarta.security.auth.SolarisPrincipal", "javax.security.auth.SolarisPrincipal")
+                .replace("jakarta.security.auth.Subject", "javax.security.auth.Subject")
+                .replace("jakarta.security.auth.SubjectDomainCombiner", "javax.security.auth.SubjectDomainCombiner")
+                .replace("jakarta.security.auth.UnixNumericGroupPrincipal", "javax.security.auth.UnixNumericGroupPrincipal")
+                .replace("jakarta.security.auth.UnixNumericUserPrincipal", "javax.security.auth.UnixNumericUserPrincipal")
+                .replace("jakarta.security.auth.UnixPrincipal", "javax.security.auth.UnixPrincipal")
+                .replace("jakarta.security.auth.UserPrincipal", "javax.security.auth.UserPrincipal")
+                .replace("jakarta.security.auth.X500Principal", "javax.security.auth.X500Principal")
+                .replace("jakarta.security.auth.callback", "javax.security.auth.callback")
+                .replace("jakarta.security.auth.kerberos", "javax.security.auth.kerberos")
+                .replace("jakarta.security.auth.login", "javax.security.auth.login")
+                .replace("jakarta.security.auth.spi", "javax.security.auth.spi")
+                .replace("jakarta.security.auth.subject", "javax.security.auth.subject")
+                .replace("jakarta.security.auth.x500", "javax.security.auth.x500")
+                .replace("jakarta.security.cert", "javax.security.cert")
+                .replace("jakarta.security.sasl", "javax.security.sasl")
+                .replace("jakarta.smartcardio", "javax.smartcardio")
+                .replace("jakarta.sound", "javax.sound")
+                .replace("jakarta.sql", "javax.sql")
+                .replace("jakarta.swing", "javax.swing")
+                .replace("jakarta.tools", "javax.tools")
+                .replace("jakarta.transaction.xa", "javax.transaction.xa")
+                .replace("jakarta.wsdl", "javax.wsdl")
+                .replace("jakarta.xml.XML", "javax.xml.XML")
+                .replace("jakarta.xml.access", "javax.xml.access")
+                .replace("jakarta.xml.catalog", "javax.xml.catalog")
+                .replace("jakarta.xml.crypto", "javax.xml.crypto")
+                .replace("jakarta.xml.datatype", "javax.xml.datatype")
+                .replace("jakarta.xml.messaging", "javax.xml.messaging")
+                .replace("jakarta.xml.namespace", "javax.xml.namespace")
+                .replace("jakarta.xml.parser", "javax.xml.parser")
+                .replace("jakarta.xml.parsers", "javax.xml.parsers")
+                .replace("jakarta.xml.registry", "javax.xml.registry")
+                .replace("jakarta.xml.rpc", "javax.xml.rpc")
+                .replace("jakarta.xml.stream", "javax.xml.stream")
+                .replace("jakarta.xml.transform", "javax.xml.transform")
+                .replace("jakarta.xml.validation", "javax.xml.validation")
+                .replace("jakarta.xml.xpath", "javax.xml.xpath")
+                .replace("javax.enterprise.deploy-api", "jakarta.enterprise.deploy-api")
 
-                                   .get();
+                .get();
 
         IO.copy(inputStream, outputStream);
     }
@@ -466,15 +466,22 @@
     }
 
     private boolean isPatched(final String path, final Jar jar) {
+        final String classPackage = path.endsWith(".class") ? Clazz.asPackage(path) : null;
+
+        boolean patchedClass = false;
         for (final Clazz clazz : classes) {
             if (path.equals(clazz.getName()) ||
                     path.startsWith(clazz.getPrefix() + "$")) {
 
                 jar.patch(clazz, classes);
-                return true;
+                patchedClass = true;
+            }
+
+            if (classPackage != null && classPackage.equals(clazz.getPackge())) {
+                jar.patch(clazz, classes);
             }
         }
-        return false;
+        return patchedClass;
     }
 
     private static final OutputStream skipped = new OutputStream() {