diff --git a/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/DirTransformer.java b/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/DirTransformer.java
index dcf5c30..e5bd89f 100644
--- a/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/DirTransformer.java
+++ b/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/DirTransformer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 SAP AG
+ * Copyright (c) 2010, 2014 SAP AG
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -26,7 +26,6 @@
 import java.net.URL;
 import java.util.jar.JarFile;
 
-import org.eclipse.virgo.util.io.IOUtils;
 import org.eclipse.virgo.util.io.PathReference;
 
 /**
@@ -108,13 +107,10 @@
 
         PathReference manifest = fromDirectory.newChild(JarFile.MANIFEST_NAME);
         if (ensureManifestIsPresent && !manifest.exists()) {
-            InputStream defaultManifestStream = getDefaultManifestStream();
             PathReference toFile = toDirectory.newChild(JarFile.MANIFEST_NAME);
             toFile.getParent().createDirectory();
-            try {
+            try (InputStream defaultManifestStream = getDefaultManifestStream();) {
                 this.callback.transformFile(defaultManifestStream, toFile);
-            } finally {
-                IOUtils.closeQuietly(defaultManifestStream);
             }
         }
     }
@@ -134,12 +130,9 @@
     }
 
     private void transformFile(PathReference fromFile, PathReference toFile) throws IOException {
-        FileInputStream fis = new FileInputStream(fromFile.toFile());
         boolean transformed = false;
-        try {
+        try (FileInputStream fis = new FileInputStream(fromFile.toFile());) {
             transformed = this.callback.transformFile(fis, toFile);
-        } finally {
-            IOUtils.closeQuietly(fis);
         }
         if (!transformed) {
             toFile.getParent().createDirectory();
@@ -149,10 +142,10 @@
 
     private InputStream getDefaultManifestStream() {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        PrintWriter writer = new PrintWriter(baos);
-        writer.println(MANIFEST_VERSION_HEADER);
-        writer.println();
-        writer.close();
-        return new ByteArrayInputStream(baos.toByteArray());
+        try (PrintWriter writer = new PrintWriter(baos);) {
+            writer.println(MANIFEST_VERSION_HEADER);
+            writer.println();
+            return new ByteArrayInputStream(baos.toByteArray());
+        }
     }
 }
diff --git a/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/WebBundleScanner.java b/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/WebBundleScanner.java
index 5c8db21..eec09a1 100644
--- a/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/WebBundleScanner.java
+++ b/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/WebBundleScanner.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2012 VMware Inc.
+ * Copyright (c) 2009, 2014 VMware Inc.
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -36,7 +36,6 @@
 import java.util.zip.ZipEntry;
 
 import org.eclipse.gemini.web.internal.WebContainerUtils;
-import org.eclipse.virgo.util.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -153,17 +152,10 @@
     }
 
     private void doScanNestedJar(File file) throws IOException {
-        JarInputStream jis = null;
-
-        try {
-            jis = new JarInputStream(new FileInputStream(file));
+        try (JarInputStream jis = new JarInputStream(new FileInputStream(file));) {
             doScanNestedJar(file.getAbsolutePath(), jis);
         } catch (IOException e) {
             throw new IOException("Cannot scan " + file.getAbsolutePath(), e);
-        } finally {
-            if (jis != null) {
-                IOUtils.closeQuietly(jis);
-            }
         }
     }
 
@@ -182,8 +174,7 @@
     }
 
     private void scanWarFile() throws IOException {
-        JarInputStream jis = new JarInputStream(this.source.openStream());
-        try {
+        try (JarInputStream jis = new JarInputStream(this.source.openStream());) {
             JarEntry entry;
             while ((entry = jis.getNextJarEntry()) != null) {
                 String entryName = entry.getName();
@@ -196,8 +187,6 @@
                     this.callBack.classFound(entry.getName().substring(CLASSES_ENTRY_PREFIX.length()));
                 }
             }
-        } finally {
-            IOUtils.closeQuietly(jis);
         }
     }
 
@@ -291,8 +280,7 @@
     }
 
     private void scanNestedJarInWarFileWithStream(String jarPath) throws IOException {
-        JarInputStream jis = new JarInputStream(this.source.openStream());
-        try {
+        try (JarInputStream jis = new JarInputStream(this.source.openStream());) {
             JarEntry entry;
             while ((entry = jis.getNextJarEntry()) != null) {
                 String entryName = entry.getName();
@@ -303,8 +291,6 @@
                     }
                 }
             }
-        } finally {
-            IOUtils.closeQuietly(jis);
         }
     }
 
diff --git a/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/WebBundleUrlStreamHandlerService.java b/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/WebBundleUrlStreamHandlerService.java
index 0edc8eb..2228d5d 100644
--- a/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/WebBundleUrlStreamHandlerService.java
+++ b/org.eclipse.gemini.web.core/src/main/java/org/eclipse/gemini/web/internal/url/WebBundleUrlStreamHandlerService.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2010 VMware Inc.
+ * Copyright (c) 2009, 2014 VMware Inc.
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -36,7 +36,6 @@
 import org.eclipse.gemini.web.core.WebBundleManifestTransformer;
 import org.eclipse.gemini.web.internal.WebContainerUtils;
 import org.eclipse.gemini.web.internal.url.DirTransformer.DirTransformerCallback;
-import org.eclipse.virgo.util.io.IOUtils;
 import org.eclipse.virgo.util.io.JarTransformer;
 import org.eclipse.virgo.util.io.JarTransformer.JarTransformerCallback;
 import org.eclipse.virgo.util.io.JarTransformingURLConnection;
@@ -153,12 +152,8 @@
         public boolean transformFile(InputStream inputStream, PathReference toFile) throws IOException {
             if (MANIFEST_MF.equals(toFile.getName()) && META_INF.equals(toFile.getParent().getName())) {
                 toFile.getParent().createDirectory();
-                OutputStream outputStream = null;
-                try {
-                    outputStream = new FileOutputStream(toFile.toFile());
+                try (OutputStream outputStream = new FileOutputStream(toFile.toFile());) {
                     transformManifest(inputStream, outputStream);
-                } finally {
-                    IOUtils.closeQuietly(outputStream);
                 }
                 return true;
             }
diff --git a/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/DirTransformerTests.java b/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/DirTransformerTests.java
index 0fcd123..a908a6c 100644
--- a/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/DirTransformerTests.java
+++ b/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/DirTransformerTests.java
@@ -34,7 +34,6 @@
 import java.util.jar.Manifest;
 
 import org.eclipse.gemini.web.internal.url.DirTransformer.DirTransformerCallback;
-import org.eclipse.virgo.util.io.IOUtils;
 import org.eclipse.virgo.util.io.PathReference;
 import org.junit.Test;
 
@@ -180,32 +179,21 @@
     }
 
     private void checkManifest(File manifestFile) throws IOException {
-        InputStream is = null;
-        try {
-            is = new FileInputStream(manifestFile);
+        try (InputStream is = new FileInputStream(manifestFile);) {
             Manifest manifest = new Manifest(is);
             Attributes attr = manifest.getMainAttributes();
             String value = attr.getValue("Custom-Header");
             assertEquals("test", value);
             assertEquals(1, attr.size());
-        } finally {
-            IOUtils.closeQuietly(is);
         }
     }
 
     private void createManifest(File manifest, String... headers) throws IOException {
-        OutputStream outputStream = null;
-        PrintWriter writer = null;
-        try {
-            outputStream = new FileOutputStream(manifest);
-            writer = new PrintWriter(manifest);
+        try (OutputStream outputStream = new FileOutputStream(manifest); PrintWriter writer = new PrintWriter(manifest);) {
             for (String header : headers) {
                 writer.println(header);
             }
             writer.println();
-        } finally {
-            IOUtils.closeQuietly(writer);
-            IOUtils.closeQuietly(outputStream);
         }
     }
 }
diff --git a/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/DirTransformingURLConnectionTests.java b/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/DirTransformingURLConnectionTests.java
index f2acb52..20237a9 100644
--- a/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/DirTransformingURLConnectionTests.java
+++ b/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/DirTransformingURLConnectionTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 SAP AG
+ * Copyright (c) 2010, 2014 SAP AG
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -62,8 +62,9 @@
 
         DirTransformingURLConnection connection = new DirTransformingURLConnection(directory, transformer);
         connection.setTransformedURL(tempDirectory);
-        InputStream is = connection.getInputStream();
-        assertNotNull(is);
+        try (InputStream is = connection.getInputStream();) {
+            assertNotNull(is);
+        }
         URL url = connection.getURL();
         assertTrue(tempDirectory.equals(url));
 
diff --git a/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/WebBundleUrlStreamHandlerServiceTests.java b/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/WebBundleUrlStreamHandlerServiceTests.java
index d285b2c..194be35 100644
--- a/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/WebBundleUrlStreamHandlerServiceTests.java
+++ b/org.eclipse.gemini.web.core/src/test/java/org/eclipse/gemini/web/internal/url/WebBundleUrlStreamHandlerServiceTests.java
@@ -39,7 +39,6 @@
 import java.util.jar.Manifest;
 
 import org.eclipse.virgo.util.io.FileSystemUtils;
-import org.eclipse.virgo.util.io.IOUtils;
 import org.eclipse.virgo.util.io.PathReference;
 import org.junit.Test;
 
@@ -51,8 +50,7 @@
         URLConnection connection = url.toURL().openConnection();
         assertNotNull(connection);
 
-        try (InputStream inputStream = connection.getInputStream();
-            JarInputStream jarInputStream = new JarInputStream(inputStream);) {
+        try (InputStream inputStream = connection.getInputStream(); JarInputStream jarInputStream = new JarInputStream(inputStream);) {
             Manifest manifest = jarInputStream.getManifest();
 
             if (manifest != null) {
@@ -118,14 +116,13 @@
     }
 
     private void checkContent(URLConnection connection, String contextPath, File webXml) throws Exception {
-        InputStream inputStream = connection.getInputStream();
-        assertNotNull(inputStream);
+        try (InputStream inputStream = connection.getInputStream();) {
+            assertNotNull(inputStream);
+        }
 
         File webAppDir = new File(connection.getURL().getPath());
         // Check Manifest
-        InputStream is = null;
-        try {
-            is = new FileInputStream(new File(webAppDir, JarFile.MANIFEST_NAME));
+        try (InputStream is = new FileInputStream(new File(webAppDir, JarFile.MANIFEST_NAME));) {
             Manifest manifest = new Manifest(is);
 
             if (manifest != null) {
@@ -138,8 +135,6 @@
                     }
                 }
             }
-        } finally {
-            IOUtils.closeQuietly(is);
         }
 
         // Check web.xml
@@ -151,14 +146,12 @@
     }
 
     private void createManifest(File manifest, String... headers) throws Exception {
-        OutputStream os = new FileOutputStream(manifest);
-        PrintWriter writer = new PrintWriter(os);
-        for (String header : headers) {
-            writer.println(header);
+        try (OutputStream os = new FileOutputStream(manifest); PrintWriter writer = new PrintWriter(os);) {
+            for (String header : headers) {
+                writer.println(header);
+            }
+            writer.println();
         }
-        writer.println();
-        writer.close();
-        IOUtils.closeQuietly(os);
     }
 
     private static class TestWarUrl extends WebBundleUrl {
diff --git a/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/extender/ExtenderBase.java b/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/extender/ExtenderBase.java
index 9d7a964..4f44a23 100644
--- a/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/extender/ExtenderBase.java
+++ b/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/extender/ExtenderBase.java
@@ -42,7 +42,7 @@
 
     protected static final String REQUEST_URL = "http://localhost:8080/simple-war/index.html";
 
-    private BundleContext context = TestFrameworkUtils.getBundleContextForTestClass(getClass());
+    private final BundleContext context = TestFrameworkUtils.getBundleContextForTestClass(getClass());
 
     protected BundleContext getBundleContext() {
         return this.context;
@@ -187,8 +187,7 @@
     protected void validateURL(String path, String expectedResponse) throws MalformedURLException, IOException, InterruptedException {
         InputStream stream = openInputStream(path);
         assertNotNull(stream);
-        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
-        try {
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream));) {
             if (expectedResponse == null) {
                 String line = null;
                 while ((line = reader.readLine()) != null) {
@@ -197,16 +196,12 @@
             } else {
                 Assert.assertEquals(expectedResponse, reader.readLine());
             }
-        } finally {
-            reader.close();
         }
     }
 
     private void validateNotFound(String path) throws Exception {
         URL url = new URL(path);
-        try {
-            InputStream stream = url.openConnection().getInputStream();
-            stream.close();
+        try (InputStream stream = url.openConnection().getInputStream();) {
             fail("URL '" + path + "' is still deployed");
         } catch (IOException e) {
         }
diff --git a/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/extender/StreamBasedExtenderTests.java b/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/extender/StreamBasedExtenderTests.java
index d1944ba..9da28ea 100644
--- a/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/extender/StreamBasedExtenderTests.java
+++ b/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/extender/StreamBasedExtenderTests.java
@@ -117,30 +117,25 @@
         super.installWar2("?Bundle-ManifestVersion=2&Web-ContextPath=/simple-war", REQUEST_URL);
     }
 
+    @Override
     protected Bundle installWarBundle(String suffix) throws BundleException {
         return installBundle("simple-war.war", "webbundle:file:../org.eclipse.gemini.web.core/target/resources/simple-war.war", suffix);
     }
 
+    @Override
     protected Bundle installBundle(String location, String bundleUrl, String suffix) throws BundleException {
-        InputStream in = null;
+        URL url = null;
         try {
-            URL url = new URL(bundleUrl + suffix);
-            in = url.openStream();
+            url = new URL(bundleUrl + suffix);
         } catch (MalformedURLException e) {
             fail("Unexpected exception " + e.getMessage());
-        } catch (IOException e) {
-            fail("Unexpected exception " + e.getMessage());
         }
 
-        try {
+        try (InputStream in = url.openStream();) {
             return getBundleContext().installBundle(location, in);
-        } finally {
-            if (in != null) {
-                try {
-                    in.close();
-                } catch (IOException e) {
-                }
-            }
+        } catch (IOException e) {
+            fail("Unexpected exception " + e.getMessage());
+            return null;
         }
     }
 }
diff --git a/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/tomcat/TomcatServletContainerTests.java b/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/tomcat/TomcatServletContainerTests.java
index 9f18194..3e06508 100644
--- a/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/tomcat/TomcatServletContainerTests.java
+++ b/org.eclipse.gemini.web.test/src/test/java/org/eclipse/gemini/web/test/tomcat/TomcatServletContainerTests.java
@@ -45,7 +45,6 @@
 import org.eclipse.virgo.test.framework.TestFrameworkUtils;
 import org.eclipse.virgo.util.io.FileCopyUtils;
 import org.eclipse.virgo.util.io.FileSystemUtils;
-import org.eclipse.virgo.util.io.IOUtils;
 import org.eclipse.virgo.util.io.PathReference;
 import org.eclipse.virgo.util.io.ZipUtils;
 import org.junit.Before;
@@ -119,20 +118,11 @@
     @Test
     public void testServletContainerAvailable() {
         assertNotNull(this.container);
-        Socket socket = null;
-        try {
-            socket = new Socket("localhost", 8080);
+        try (Socket socket = new Socket("localhost", 8080);) {
         } catch (UnknownHostException e) {
             fail("Unable to connect");
         } catch (IOException e) {
             fail("Unable to connect");
-        } finally {
-            if (socket != null) {
-                try {
-                    socket.close();
-                } catch (IOException e) {
-                }
-            }
         }
     }
 
@@ -362,13 +352,12 @@
 
     private void validateNotFound(String path) throws Exception {
         URL url = new URL(path);
-        try {
-            url.openConnection().getInputStream();
+        try (InputStream is = url.openConnection().getInputStream();) {
+            fail("URL '" + path + "' is still deployed");
         } catch (IOException e) {
             assertTrue("success case", true);
             return;
         }
-        fail("URL '" + path + "' is still deployed");
     }
 
     private PathReference explode(PathReference packed) throws IOException {
@@ -632,13 +621,9 @@
         if (!file.getParentFile().exists()) {
             assertTrue(file.getParentFile().mkdirs());
         }
-        FileWriter fWriter = null;
-        try {
-            fWriter = new FileWriter(file);
+        try (FileWriter fWriter = new FileWriter(file);) {
             fWriter.write(content);
             fWriter.flush();
-        } finally {
-            IOUtils.closeQuietly(fWriter);
         }
     }
 
diff --git a/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/WebappConfigLocator.java b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/WebappConfigLocator.java
index 0caef5d..4dae2fc 100755
--- a/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/WebappConfigLocator.java
+++ b/org.eclipse.gemini.web.tomcat/src/main/java/org/eclipse/gemini/web/tomcat/internal/WebappConfigLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 SAP AG
+ * Copyright (c) 2010, 2014 SAP AG
  *
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -147,22 +147,13 @@
                 return contextXml.toURI().toURL();
             }
         } else {
-            JarFile jar = null;
-            try {
-                jar = new JarFile(docBaseFile);
+            try (JarFile jar = new JarFile(docBaseFile);) {
                 ZipEntry contextXmlEntry = jar.getEntry(CONTEXT_XML);
                 if (contextXmlEntry != null) {
                     return new URL(JAR_SCHEMA + docBaseFile.toURI().toString() + JAR_TO_ENTRY_SEPARATOR + CONTEXT_XML);
                 }
             } catch (IOException e) {
                 throw new ServletContainerException("Cannot open for reading " + docBaseFile.getAbsolutePath(), e);
-            } finally {
-                if (jar != null) {
-                    try {
-                        jar.close();
-                    } catch (IOException _) {
-                    }
-                }
             }
         }
         return null;
@@ -207,28 +198,21 @@
             return null;
         }
 
-        JarFile jarFile = null;
         try {
             URLConnection connection = bundleUrl.openConnection();
 
             if (connection instanceof JarURLConnection) {
                 JarURLConnection jarURLConnection = (JarURLConnection) connection;
                 jarURLConnection.setUseCaches(false);
-                jarFile = jarURLConnection.getJarFile();
-                String entryName = jarURLConnection.getEntryName();
-                if (entryName != null && jarFile != null && jarFile.getEntry(entryName) != null) {
-                    return bundleUrl;
+                try (JarFile jarFile = jarURLConnection.getJarFile();) {
+                    String entryName = jarURLConnection.getEntryName();
+                    if (entryName != null && jarFile != null && jarFile.getEntry(entryName) != null) {
+                        return bundleUrl;
+                    }
                 }
             }
         } catch (IOException e) {
             return null;
-        } finally {
-            if (jarFile != null) {
-                try {
-                    jarFile.close();
-                } catch (IOException _) {
-                }
-            }
         }
 
         return null;
diff --git a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/WebappConfigLocatorTests.java b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/WebappConfigLocatorTests.java
index c18ff23..37314bc 100755
--- a/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/WebappConfigLocatorTests.java
+++ b/org.eclipse.gemini.web.tomcat/src/test/java/org/eclipse/gemini/web/tomcat/internal/WebappConfigLocatorTests.java
@@ -36,7 +36,6 @@
 import org.apache.catalina.Engine;
 import org.apache.catalina.Host;
 import org.eclipse.gemini.web.core.spi.ServletContainerException;
-import org.eclipse.virgo.util.io.IOUtils;
 import org.junit.Before;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
@@ -88,31 +87,18 @@
         byte[] buffer = new byte[1024];
         int bytesRead;
 
-        FileOutputStream stream = null;
-        JarOutputStream out = null;
-        FileInputStream file = null;
-        try {
-            stream = new FileOutputStream(jarFile1.getPath());
-            out = new JarOutputStream(stream, new Manifest());
-            file = new FileInputStream(new File(urlFile2.getPath()));
+        try (FileOutputStream stream = new FileOutputStream(jarFile1.getPath());
+            JarOutputStream out = new JarOutputStream(stream, new Manifest());
+            FileInputStream file = new FileInputStream(new File(urlFile2.getPath()));) {
             JarEntry jarAdd = new JarEntry(JAR_ENTRY_NAME);
             out.putNextEntry(jarAdd);
             while ((bytesRead = file.read(buffer)) != -1) {
                 out.write(buffer, 0, bytesRead);
             }
             out.closeEntry();
-        } finally {
-            IOUtils.closeQuietly(file);
-            IOUtils.closeQuietly(out);
-            IOUtils.closeQuietly(stream);
         }
 
-        try {
-            stream = new FileOutputStream(jarFile2.getPath());
-            out = new JarOutputStream(stream, new Manifest());
-        } finally {
-            IOUtils.closeQuietly(out);
-            IOUtils.closeQuietly(stream);
+        try (FileOutputStream stream = new FileOutputStream(jarFile2.getPath()); JarOutputStream out = new JarOutputStream(stream, new Manifest());) {
         }
     }
 
