diff --git a/maven-plugins/hk2-inhabitant-generator/src/main/java/org/jvnet/hk2/generator/internal/GeneratorRunner.java b/maven-plugins/hk2-inhabitant-generator/src/main/java/org/jvnet/hk2/generator/internal/GeneratorRunner.java
index 6a101d0..ec6a7e2 100755
--- a/maven-plugins/hk2-inhabitant-generator/src/main/java/org/jvnet/hk2/generator/internal/GeneratorRunner.java
+++ b/maven-plugins/hk2-inhabitant-generator/src/main/java/org/jvnet/hk2/generator/internal/GeneratorRunner.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation.
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -24,6 +25,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.PrintStream;
 import java.io.PrintWriter;
 import java.net.URI;
 import java.nio.file.FileSystem;
@@ -48,16 +50,17 @@
 
 import org.glassfish.hk2.utilities.DescriptorImpl;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 /**
  * @author jwells
- *
  */
 public class GeneratorRunner {
     private final static String DOT_CLASS = ".class";
     private final static String META_INF = "META-INF";
     private final static String INHABITANTS = "hk2-locator";
     private final static String TARGET_HABITATS = "target-habitats";  //Should be same as ConfigMetadata.TARGET_HABITATS
-    
+
     private final Utilities utilities;  // For caching
     private final String fileOrDirectory;
     private final String outjarName;
@@ -70,7 +73,7 @@
 
     /**
      * This initializes the GeneratorRunner with the values needed to run
-     * 
+     *
      * @param fileOrDirectory The fileOrDirectory to inspect for services
      * @param outjarName The name of the jar file to create (can be the fileOrDirectory)
      * @param locatorName The name of the locator these files should be put into
@@ -98,39 +101,41 @@
         utilities = new Utilities(verbose, searchPath);
         this.includeDate = includeDate;
         outJarIsInJar = fileOrDirectory.equals(outjarName);
-        
+
         if (verbose) {
             System.out.println("HabitatGenerator: inputFile=" + fileOrDirectory + " outjarName=" + outjarName +
                     " locatorName=" + locatorName + " noSwap=" + noSwap + " outputDirectory=" + outputDirectory);
         }
     }
-    
+
     /**
      * Does the work of writing out the inhabitants file to the proper location
-     * 
+     *
      * @throws AssertionError On an error such as not being able to find the
      * proper file
      * @throws IOException On IO error
      */
     public void go() throws AssertionError, IOException {
         File toInspect = new File(fileOrDirectory);
-        
+
         if (!toInspect.exists()) {
             throw new AssertionError("Could not find file: " + toInspect.getAbsolutePath());
         }
-        
+
         List<DescriptorImpl> allDescriptors;
         if (toInspect.isDirectory()) {
             allDescriptors = utilities.findAllServicesFromDirectory(toInspect, Collections.singletonList(toInspect));
-            if (allDescriptors.isEmpty()) return;
+            if (allDescriptors.isEmpty()) {
+                return;
+            }
             writeToDirectory(allDescriptors);
         }
         else {
             allDescriptors = findAllServicesFromJar(toInspect);
-            
+
             // Do this here to close all FDs so that on Windows we can rewrite the file
             utilities.close();
-            
+
             if (noSwap && outJarIsInJar) {
                 writeToJarNoSwap(toInspect, allDescriptors);
             }
@@ -138,10 +143,10 @@
                 writeToJar(toInspect, allDescriptors);
             }
         }
-        
+
         utilities.close();
     }
-    
+
     private void writeToDirectory(List<DescriptorImpl> allDescriptors) throws IOException {
         Map<String, List<DescriptorImpl>> targetHabitatMap = new HashMap<String, List<DescriptorImpl>>();
         targetHabitatMap.put(locatorName, new ArrayList<DescriptorImpl>());
@@ -168,11 +173,11 @@
         for (Map.Entry<String, List<DescriptorImpl>> targetHabitatEntry : targetHabitatMap.entrySet()) {
             String targetHabitatName = targetHabitatEntry.getKey();
             List<DescriptorImpl> descriptors = targetHabitatEntry.getValue();
-            
+
             if (descriptors.size() == 0) {
                 continue;
             }
-            
+
             File inhabitantsDir = new File(outputDirectory);
             File outputFile = new File(inhabitantsDir, targetHabitatName);
 
@@ -220,161 +225,118 @@
 
         }
     }
-    
+
     private void writeToJar(File jarFile, List<DescriptorImpl> descriptors) throws IOException {
         File outjar = new File(outjarName);
         File writeMeFile = writeInhabitantsFile(descriptors, null, outjar.getParentFile());
         writeMeFile.deleteOnExit();
-        
-        byte buffer[] = new byte[1024];
-        
+
+        byte[] buffer = new byte[8192];
         File tmpJarFile = File.createTempFile(jarFile.getName(), ".tmp", outjar.getParentFile());
-        
-        FileInputStream fis = new FileInputStream(jarFile);
-        ZipInputStream zis = new ZipInputStream(fis);
-        
-        FileOutputStream fos = null;
-        ZipOutputStream zos = null;
-        
-        try {
-            fos = new FileOutputStream(tmpJarFile);
-            zos = new ZipOutputStream(fos);
-        
+        try (FileInputStream fis = new FileInputStream(jarFile);
+            ZipInputStream zis = new ZipInputStream(fis);
+            FileOutputStream fos = new FileOutputStream(tmpJarFile);
+            ZipOutputStream zos = new ZipOutputStream(fos)) {
+
             ZipEntry zentry = zis.getNextEntry();
             while (zentry != null) {
                 String entryName = zentry.getName();
-            
+
                 if (entryName.equals(META_INF + "/" + INHABITANTS + "/" + locatorName)) {
                     // Don't write out the old one
                     zentry = zis.getNextEntry();
                     continue;
                 }
-            
+
                 zos.putNextEntry(new ZipEntry(entryName));
-            
+
                 int len;
                 while ((len = zis.read(buffer)) > 0) {
                     zos.write(buffer, 0, len);
                 }
-            
+
                 zentry = zis.getNextEntry();
             }
-        
+
             if (!descriptors.isEmpty()) {
                 zos.putNextEntry(new ZipEntry(META_INF + "/" + INHABITANTS + "/" + locatorName));
-        
-                FileInputStream desc_os = new FileInputStream(writeMeFile);
-                try {
+
+                try (FileInputStream desc_os = new FileInputStream(writeMeFile)) {
                     int len;
                     while ((len = desc_os.read(buffer)) > 0) {
                         zos.write(buffer, 0, len);
                     }
                 }
-                finally {
-                    desc_os.close();
-                }
             }
         }
-        finally {
-            zis.close();
-            
-            if (zos != null) {
-                zos.close();
-            }
-        }
-        
+
         // All went well, replace the JAR file with the new and improved jar file
         String tmpFileName = tmpJarFile.getAbsolutePath();
-        
+
         if (verbose) {
             System.out.println("Swapping jar file " + tmpFileName + " to " + outjar.getAbsolutePath());
         }
-        
+
         if (!tmpJarFile.renameTo(outjar)) {
             throw new IOException("Unable to swap generated JAR file " + tmpFileName + " to " + outjar.getAbsolutePath());
         }
     }
-    
+
     private void writeToJarNoSwap(File jarFile, List<DescriptorImpl> descriptors) throws IOException {
-        if (descriptors.isEmpty()) return;
-        
-        URI jarURI = URI.create("jar:" + jarFile.toURI());
-        
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        PrintWriter bWriter = new PrintWriter(baos);
-        writeHeader(bWriter);
-        
-        for (DescriptorImpl desc : descriptors) {
-            desc.writeObject(bWriter);
+        if (descriptors.isEmpty()) {
+            return;
         }
-        
-        bWriter.close();
-        baos.close();
-        
-        byte data[] = baos.toByteArray();
-        
-        OutputStream os = null;
-        PrintWriter writer = null;
-        ByteArrayInputStream bais = null;
-        
-        FileSystem fileSystem = FileSystems.newFileSystem(jarURI, new HashMap<String, Object>());
-        try {
+
+        final URI jarURI = URI.create("jar:" + jarFile.toURI());
+        final byte[] data = toByteArray(descriptors);
+        try (FileSystem fileSystem = FileSystems.newFileSystem(jarURI, new HashMap<>())) {
             Path locatorDirectory = fileSystem.getPath("/" + META_INF, INHABITANTS);
             Files.createDirectories(locatorDirectory);
-        
             Path locatorPath = fileSystem.getPath("/" + META_INF, INHABITANTS, locatorName);
-            
-            bais = new ByteArrayInputStream(data);
-            
-            Files.copy(bais, locatorPath, StandardCopyOption.REPLACE_EXISTING);
-        }
-        finally {
-            if (bais != null) {
-                bais.close();
+            try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) {
+                Files.copy(bais, locatorPath, StandardCopyOption.REPLACE_EXISTING);
             }
-            if (writer != null) {
-                writer.close();
-            }
-            if (os != null) {
-                os.close();
-            }
-            
-            fileSystem.close();
         }
     }
-    
+
+    private byte[] toByteArray(List<DescriptorImpl> descriptors) throws IOException {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try (PrintWriter bWriter = new PrintWriter(baos, false, UTF_8)) {
+            writeHeader(bWriter);
+            for (DescriptorImpl desc : descriptors) {
+                desc.writeObject(bWriter);
+            }
+        }
+        return baos.toByteArray();
+    }
+
     private File writeInhabitantsFile(List<DescriptorImpl> descriptors, File noSwapFile, File outDir) throws IOException {
-        File outFile;
+        final File outFile;
         if (noSwapFile != null) {
             outFile = noSwapFile;
-        }
-        else {
+        } else {
             outFile = File.createTempFile(locatorName, ".tmp", outDir);
         }
-        
+
         if (verbose) {
             System.out.println("Writing " + descriptors.size() + " entries to file " + outFile.getAbsolutePath());
         }
-        
-        FileOutputStream fos = new FileOutputStream(outFile);
-        
-        PrintWriter pw = new PrintWriter(fos);
-        writeHeader(pw);
-        
-        for (DescriptorImpl di : descriptors) {
-            di.writeObject(pw);
+
+        try (OutputStream outputStream = new PrintStream(outFile, UTF_8);
+            PrintWriter pw = new PrintWriter(outputStream)) {
+            writeHeader(pw);
+            for (DescriptorImpl di : descriptors) {
+                di.writeObject(pw);
+            }
         }
-        
-        pw.close();
-        fos.close();
-        
+
         if (verbose) {
             System.out.println("Wrote " + descriptors.size() + " entries to inhabitant file " + outFile.getAbsolutePath());
         }
-        
+
         return outFile;
     }
-    
+
     private void writeHeader(PrintWriter writer) {
         writer.println("#");
         if (includeDate) {
@@ -385,26 +347,28 @@
         }
         writer.println("#");
         writer.println();
-        
+
     }
-    
+
     private List<DescriptorImpl> findAllServicesFromJar(File jar) throws IOException {
         TreeSet<DescriptorImpl> retVal = new TreeSet<DescriptorImpl>(new DescriptorComparitor());
-        
+
         JarFile jarFile = new JarFile(jar);
-        
+
         try {
             Enumeration<JarEntry> entries = jarFile.entries();
             while (entries.hasMoreElements()) {
                 JarEntry entry = entries.nextElement();
-                
+
                 String entryName = entry.getName();
-                if (!entryName.endsWith(DOT_CLASS)) continue;
-                
+                if (!entryName.endsWith(DOT_CLASS)) {
+                    continue;
+                }
+
                 InputStream is = null;
                 try {
                     is = jarFile.getInputStream(entry);
-                    
+
                     List<DescriptorImpl> dis = utilities.createDescriptorIfService(is, Collections.singletonList(jar));
                     retVal.addAll(dis);
                 }
@@ -418,13 +382,13 @@
                         }
                     }
                 }
-                
+
             }
         }
         finally {
             jarFile.close();
         }
-        
+
         return new ArrayList<DescriptorImpl>(retVal);
     }
 }
