Use try-with-resources statements

- instead of finally blocks
- in cases of missing try-finally

Change-Id: I94f481a33d8e6a3180c436245d6e95e4d525280c
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AccountCreator.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AccountCreator.java
index f247463..9eaf266 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AccountCreator.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AccountCreator.java
@@ -71,8 +71,7 @@
     if (account != null) {
       return account;
     }
-    ReviewDb db = reviewDbProvider.open();
-    try {
+    try (ReviewDb db = reviewDbProvider.open()) {
       Account.Id id = new Account.Id(db.nextAccountId());
       KeyPair sshKey = genSshKey();
       AccountSshKey key =
@@ -115,8 +114,6 @@
           new TestAccount(id, username, email, fullName, sshKey, httpPass);
       accounts.put(username, account);
       return account;
-    } finally {
-      db.close();
     }
   }
 
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GcAssert.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GcAssert.java
index b89ff4a0..5f8a8ed 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GcAssert.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GcAssert.java
@@ -58,8 +58,7 @@
 
   private String[] getPackFiles(Project.NameKey p)
       throws RepositoryNotFoundException, IOException {
-    Repository repo = repoManager.openRepository(p);
-    try {
+    try (Repository repo = repoManager.openRepository(p)) {
       File packDir = new File(repo.getDirectory(), "objects/pack");
       return packDir.list(new FilenameFilter() {
         @Override
@@ -67,8 +66,6 @@
           return name.endsWith(".pack");
         }
       });
-    } finally {
-      repo.close();
     }
   }
 }
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/VisibleRefFilterIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/VisibleRefFilterIT.java
index 0b07b87..248e1fe 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/VisibleRefFilterIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/VisibleRefFilterIT.java
@@ -115,8 +115,7 @@
     c2 = br.getChange().getId();
     r2 = changeRefPrefix(c2);
 
-    Repository repo = repoManager.openRepository(project);
-    try {
+    try (Repository repo = repoManager.openRepository(project)) {
       // master-tag -> master
       RefUpdate mtu = repo.updateRef("refs/tags/master-tag");
       mtu.setExpectedOldObjectId(ObjectId.zeroId());
@@ -128,8 +127,6 @@
       btu.setExpectedOldObjectId(ObjectId.zeroId());
       btu.setNewObjectId(repo.getRef("refs/heads/branch").getObjectId());
       assertThat(btu.update()).isEqualTo(RefUpdate.Result.NEW);
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
index a07bde7..6db9362 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
@@ -249,15 +249,12 @@
     ChangeInfo c = get(changeId, CURRENT_REVISION);
     assertThat(c.currentRevision).isEqualTo(expectedId.name());
     assertThat(c.revisions.get(expectedId.name())._number).isEqualTo(expectedNum);
-    Repository repo =
-        repoManager.openRepository(new Project.NameKey(c.project));
-    try {
+    try (Repository repo =
+        repoManager.openRepository(new Project.NameKey(c.project))) {
       Ref ref = repo.getRef(
           new PatchSet.Id(new Change.Id(c._number), expectedNum).toRefName());
       assertThat(ref).isNotNull();
       assertThat(ref.getObjectId()).isEqualTo(expectedId);
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
index b87348b..030897b 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
@@ -263,13 +263,10 @@
 
   private void assertHead(String projectName, String expectedRef)
       throws RepositoryNotFoundException, IOException {
-    Repository repo =
-        repoManager.openRepository(new Project.NameKey(projectName));
-    try {
+    try (Repository repo =
+        repoManager.openRepository(new Project.NameKey(projectName))) {
       assertThat(repo.getRef(Constants.HEAD).getTarget().getName())
         .isEqualTo(expectedRef);
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
index 9d44ad6..5d31c77 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
@@ -330,12 +330,9 @@
   private void merge(PushOneCommit.Result r) throws Exception {
     revision(r).review(ReviewInput.approve());
     revision(r).submit();
-    Repository repo = repoManager.openRepository(project);
-    try {
+    try (Repository repo = repoManager.openRepository(project)) {
       assertThat(repo.getRef("refs/heads/master").getObjectId()).isEqualTo(
           r.getCommitId());
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
index 123bb9a..7431b54 100644
--- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
+++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
@@ -258,15 +258,10 @@
 
         @Override
         public void funnel(K from, PrimitiveSink into) {
-          try {
-            ObjectOutputStream ser =
-                new ObjectOutputStream(new SinkOutputStream(into));
-            try {
-              ser.writeObject(from);
-              ser.flush();
-            } finally {
-              ser.close();
-            }
+          try (ObjectOutputStream ser =
+              new ObjectOutputStream(new SinkOutputStream(into))) {
+            ser.writeObject(from);
+            ser.flush();
           } catch (IOException err) {
             throw new RuntimeException("Cannot hash as Serializable", err);
           }
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java
index af80b3c..f48a663 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java
@@ -77,19 +77,14 @@
 
   private String name(final TreeLogger logger, final PublicResource r)
       throws UnableToCompleteException {
-    final InputStream in = r.getContents(logger);
     final ByteArrayOutputStream tmp = new ByteArrayOutputStream();
-    try {
-      try {
-        final byte[] buf = new byte[2048];
-        int n;
-        while ((n = in.read(buf)) >= 0) {
-          tmp.write(buf, 0, n);
-        }
-        tmp.close();
-      } finally {
-        in.close();
+    try (InputStream in = r.getContents(logger)) {
+      final byte[] buf = new byte[2048];
+      int n;
+      while ((n = in.read(buf)) >= 0) {
+        tmp.write(buf, 0, n);
       }
+      tmp.close();
     } catch (IOException e) {
       final UnableToCompleteException ute = new UnableToCompleteException();
       ute.initCause(e);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
index c1c3b2b..56c5cbd 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
@@ -104,11 +104,8 @@
       rsp.setContentType("text/html");
       rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
       rsp.setContentLength(raw.length);
-      final OutputStream out = rsp.getOutputStream();
-      try {
+      try (OutputStream out = rsp.getOutputStream()) {
         out.write(raw);
-      } finally {
-        out.close();
       }
       return;
     }
@@ -129,13 +126,13 @@
     } else {
       rsp.setContentType("text/html");
       rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
-      final Writer out = rsp.getWriter();
-      out.write("<html>");
-      out.write("<body>");
-      out.write("<h1>Account Not Found</h1>");
-      out.write("</body>");
-      out.write("</html>");
-      out.close();
+      try (Writer out = rsp.getWriter()) {
+        out.write("<html>");
+        out.write("<body>");
+        out.write("<h1>Account Not Found</h1>");
+        out.write("</body>");
+        out.write("</html>");
+      }
     }
   }
 
@@ -147,8 +144,7 @@
     }
 
     Element userlistElement = HtmlDomUtil.find(doc, "userlist");
-    ReviewDb db = schema.open();
-    try {
+    try (ReviewDb db = schema.open()) {
       ResultSet<Account> accounts = db.accounts().firstNById(100);
       for (Account a : accounts) {
         String displayName;
@@ -168,8 +164,6 @@
         userlistElement.appendChild(linkElement);
         userlistElement.appendChild(doc.createElement("br"));
       }
-    } finally {
-      db.close();
     }
 
     return HtmlDomUtil.toUTF8(doc);
@@ -190,15 +184,10 @@
   }
 
   private AuthResult byUserName(final String userName) {
-    try {
-      final ReviewDb db = schema.open();
-      try {
-        AccountExternalId.Key key =
-            new AccountExternalId.Key(SCHEME_USERNAME, userName);
-        return auth(db.accountExternalIds().get(key));
-      } finally {
-        db.close();
-      }
+    try (ReviewDb db = schema.open()) {
+      AccountExternalId.Key key =
+          new AccountExternalId.Key(SCHEME_USERNAME, userName);
+      return auth(db.accountExternalIds().get(key));
     } catch (OrmException e) {
       getServletContext().log("cannot query database", e);
       return null;
@@ -206,14 +195,9 @@
   }
 
   private AuthResult byPreferredEmail(final String email) {
-    try {
-      final ReviewDb db = schema.open();
-      try {
-        List<Account> matches = db.accounts().byPreferredEmail(email).toList();
-        return matches.size() == 1 ? auth(matches.get(0)) : null;
-      } finally {
-        db.close();
-      }
+    try (ReviewDb db = schema.open()) {
+      List<Account> matches = db.accounts().byPreferredEmail(email).toList();
+      return matches.size() == 1 ? auth(matches.get(0)) : null;
     } catch (OrmException e) {
       getServletContext().log("cannot query database", e);
       return null;
@@ -227,13 +211,8 @@
     } catch (NumberFormatException nfe) {
       return null;
     }
-    try {
-      final ReviewDb db = schema.open();
-      try {
-        return auth(db.accounts().get(id));
-      } finally {
-        db.close();
-      }
+    try (ReviewDb db = schema.open()) {
+      return auth(db.accounts().get(id));
     } catch (OrmException e) {
       getServletContext().log("cannot query database", e);
       return null;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
index 0cad37b..6c593fb 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
@@ -111,11 +111,8 @@
       rsp.setContentType("text/html");
       rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
       rsp.setContentLength(tosend.length);
-      final OutputStream out = rsp.getOutputStream();
-      try {
+      try (OutputStream out = rsp.getOutputStream()) {
         out.write(tosend);
-      } finally {
-        out.close();
       }
     }
   }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java
index 6d8a0cda..ccc945f 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java
@@ -104,12 +104,8 @@
       rsp.setContentType("text/html");
       rsp.setCharacterEncoding("UTF-8");
       rsp.setContentLength(bin.length);
-      final ServletOutputStream out = rsp.getOutputStream();
-      try {
+      try (ServletOutputStream out = rsp.getOutputStream()) {
         out.write(bin);
-      } finally {
-        out.flush();
-        out.close();
       }
       return;
     }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java
index f58a719..5388048 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java
@@ -92,11 +92,8 @@
     res.setContentType("text/html");
     res.setCharacterEncoding("UTF-8");
     res.setContentLength(bin.length);
-    ServletOutputStream out = res.getOutputStream();
-    try {
+    try (ServletOutputStream out = res.getOutputStream()) {
       out.write(bin);
-    } finally {
-      out.close();
     }
   }
 
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
index 48c46a5..b5365ad 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
@@ -72,11 +72,8 @@
       rsp.setDateHeader("Last-Modified", modified);
       CacheHeaders.setCacheable(req, rsp, 5, TimeUnit.MINUTES);
 
-      final ServletOutputStream os = rsp.getOutputStream();
-      try {
+      try (ServletOutputStream os = rsp.getOutputStream()) {
         os.write(raw);
-      } finally {
-        os.close();
       }
     } else {
       CacheHeaders.setNotCacheable(rsp);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java
index c9b57ac..75e468e 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java
@@ -101,11 +101,8 @@
       rsp.setDateHeader("Last-Modified", modified);
       CacheHeaders.setCacheable(req, rsp, 5, TimeUnit.MINUTES);
 
-      final ServletOutputStream os = rsp.getOutputStream();
-      try {
+      try (ServletOutputStream os = rsp.getOutputStream()) {
         os.write(toSend);
-      } finally {
-        os.close();
       }
     } else {
       CacheHeaders.setNotCacheable(rsp);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java
index cfbd24b..f30eb52 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java
@@ -72,11 +72,8 @@
       rsp.setDateHeader("Last-Modified", modified);
       CacheHeaders.setCacheable(req, rsp, 5, TimeUnit.MINUTES);
 
-      final ServletOutputStream os = rsp.getOutputStream();
-      try {
+      try (ServletOutputStream os = rsp.getOutputStream()) {
         os.write(raw);
-      } finally {
-        os.close();
       }
     } else {
       CacheHeaders.setNotCacheable(rsp);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
index c39962a..aeb710e 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
@@ -414,19 +414,14 @@
       return;
     }
 
-    final Repository repo;
-    try {
-      repo = repoManager.openRepository(nameKey);
+
+    try (@SuppressWarnings("UnusedDeclaration") // only open for existence-check
+         Repository repo = repoManager.openRepository(nameKey)) {
+      CacheHeaders.setNotCacheable(rsp);
+      exec(req, rsp, project);
     } catch (RepositoryNotFoundException e) {
       getServletContext().log("Cannot open repository", e);
       rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-      return;
-    }
-    try {
-      CacheHeaders.setNotCacheable(rsp);
-      exec(req, rsp, project);
-    } finally {
-      repo.close();
     }
   }
 
@@ -476,25 +471,15 @@
       proc.getOutputStream().close();
     }
 
-    try {
-      final InputStream in;
+    try (InputStream in = new BufferedInputStream(proc.getInputStream(), bufferSize)) {
+      readCgiHeaders(rsp, in);
 
-      in = new BufferedInputStream(proc.getInputStream(), bufferSize);
-      try {
-        readCgiHeaders(rsp, in);
-
-        final OutputStream out = rsp.getOutputStream();
-        try {
-          final byte[] buf = new byte[bufferSize];
-          int n;
-          while ((n = in.read(buf)) > 0) {
-            out.write(buf, 0, n);
-          }
-        } finally {
-          out.close();
+      try (OutputStream out = rsp.getOutputStream()) {
+        final byte[] buf = new byte[bufferSize];
+        int n;
+        while ((n = in.read(buf)) > 0) {
+          out.write(buf, 0, n);
         }
-      } finally {
-        in.close();
       }
     } catch (IOException e) {
       // The browser has probably closed its input stream. We don't
@@ -651,16 +636,11 @@
     new Thread(new Runnable() {
       @Override
       public void run() {
-        try {
-          final BufferedReader br =
-              new BufferedReader(new InputStreamReader(in, "ISO-8859-1"));
-          try {
-            String line;
-            while ((line = br.readLine()) != null) {
-              log.error("CGI: " + line);
-            }
-          } finally {
-            br.close();
+        try (BufferedReader br =
+            new BufferedReader(new InputStreamReader(in, "ISO-8859-1"))) {
+          String line;
+          while ((line = br.readLine()) != null) {
+            log.error("CGI: " + line);
           }
         } catch (IOException e) {
           log.debug("Unexpected error copying stderr from CGI", e);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
index 405a861..0ac2c4f 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
@@ -411,18 +411,18 @@
 
     if (about != null) {
       InputStreamReader isr = new InputStreamReader(scanner.getInputStream(about));
-      BufferedReader reader = new BufferedReader(isr);
       StringBuilder aboutContent = new StringBuilder();
-      String line;
-      while ((line = reader.readLine()) != null) {
-        line = line.trim();
-        if (line.isEmpty()) {
-          aboutContent.append("\n");
-        } else {
-          aboutContent.append(line).append("\n");
+      try (BufferedReader reader = new BufferedReader(isr)) {
+        String line;
+        while ((line = reader.readLine()) != null) {
+          line = line.trim();
+          if (line.isEmpty()) {
+            aboutContent.append("\n");
+          } else {
+            aboutContent.append(line).append("\n");
+          }
         }
       }
-      reader.close();
 
       // Only append the About section if there was anything in it
       if (aboutContent.toString().trim().length() > 0) {
@@ -641,11 +641,8 @@
   private static byte[] readWholeEntry(PluginContentScanner scanner, PluginEntry entry)
       throws IOException {
     byte[] data = new byte[entry.getSize().get().intValue()];
-    InputStream in = scanner.getInputStream(entry);
-    try {
+    try (InputStream in = scanner.getInputStream(entry)) {
       IO.readFully(in, data, 0, data.length);
-    } finally {
-      in.close();
     }
     return data;
   }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
index efaed9a..a41bd86 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
@@ -128,25 +128,20 @@
     }
 
     String src = "gerrit_ui/gerrit_ui.nocache.js";
-    InputStream in = servletContext.getResourceAsStream("/" + src);
-    if (in != null) {
-      Hasher md = Hashing.md5().newHasher();
-      try {
-        try {
-          final byte[] buf = new byte[1024];
-          int n;
-          while ((n = in.read(buf)) > 0) {
-            md.putBytes(buf, 0, n);
-          }
-        } finally {
-          in.close();
+    try (InputStream in = servletContext.getResourceAsStream("/" + src)) {
+      if (in != null) {
+        Hasher md = Hashing.md5().newHasher();
+        final byte[] buf = new byte[1024];
+        int n;
+        while ((n = in.read(buf)) > 0) {
+          md.putBytes(buf, 0, n);
         }
-      } catch (IOException e) {
-        throw new IOException("Failed reading " + src, e);
+        src += "?content=" + md.hash().toString();
+      } else {
+        log.debug("No " + src + " in webapp root; keeping noncache.js URL");
       }
-      src += "?content=" + md.hash().toString();
-    } else {
-      log.debug("No " + src + " in webapp root; keeping noncache.js URL");
+    } catch (IOException e) {
+      throw new IOException("Failed reading " + src, e);
     }
 
     noCacheName = src;
@@ -224,11 +219,8 @@
     rsp.setContentType("text/html");
     rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
     rsp.setContentLength(tosend.length);
-    final OutputStream out = rsp.getOutputStream();
-    try {
+    try (OutputStream out = rsp.getOutputStream()) {
       out.write(tosend);
-    } finally {
-      out.close();
     }
   }
 
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
index 00568f0..95a247f 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
@@ -70,11 +70,8 @@
     rsp.setContentType("text/html");
     rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
     rsp.setContentLength(tosend.length);
-    final OutputStream out = rsp.getOutputStream();
-    try {
+    try (OutputStream out = rsp.getOutputStream()) {
       out.write(tosend);
-    } finally {
-      out.close();
     }
   }
 }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java
index 888b3fb..5f526dd 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java
@@ -90,11 +90,8 @@
     CacheHeaders.setNotCacheable(rsp);
     rsp.setCharacterEncoding("UTF-8");
     rsp.setContentType("text/plain");
-    final PrintWriter w = rsp.getWriter();
-    try {
+    try (PrintWriter w = rsp.getWriter()) {
       w.write(out);
-    } finally {
-      w.close();
     }
   }
 }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticServlet.java
index e690334..570ad57 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticServlet.java
@@ -199,11 +199,8 @@
     rsp.setHeader(ETAG, r.etag);
     rsp.setContentType(r.contentType);
     rsp.setContentLength(tosend.length);
-    final OutputStream out = rsp.getOutputStream();
-    try {
+    try (OutputStream out = rsp.getOutputStream()) {
       out.write(tosend);
-    } finally {
-      out.close();
     }
   }
 
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java
index 16509ed..179b268 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java
@@ -82,11 +82,8 @@
     rsp.setHeader(HDR_CACHE_CONTROL, "no-cache, must-revalidate");
     rsp.setContentType("application/octet-stream");
     rsp.setContentLength(tosend.length);
-    final OutputStream out = rsp.getOutputStream();
-    try {
+    try (OutputStream out = rsp.getOutputStream()) {
       out.write(tosend);
-    } finally {
-      out.close();
     }
   }
 
@@ -148,11 +145,8 @@
     rsp.setContentType("text/html");
     rsp.setCharacterEncoding("UTF-8");
     rsp.setContentLength(tosend.length);
-    final OutputStream out = rsp.getOutputStream();
-    try {
+    try (OutputStream out = rsp.getOutputStream()) {
       out.write(tosend);
-    } finally {
-      out.close();
     }
   }
 }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
index b69dbbf..9edb4ec 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
@@ -522,8 +522,7 @@
       IllegalArgumentException, NoSuchMethodException, IllegalAccessException,
       InstantiationException, InvocationTargetException, MethodNotAllowedException {
     if (isType(JSON_TYPE, req.getContentType())) {
-      BufferedReader br = req.getReader();
-      try {
+      try (BufferedReader br = req.getReader()) {
         JsonReader json = new JsonReader(br);
         json.setLenient(true);
 
@@ -537,8 +536,6 @@
           return parseString(json.nextString(), type);
         }
         return OutputFormat.JSON.newGson().fromJson(json, type);
-      } finally {
-        br.close();
       }
     } else if (("PUT".equals(req.getMethod()) || "POST".equals(req.getMethod()))
         && acceptsRawInput(type)) {
@@ -548,8 +545,7 @@
     } else if (hasNoBody(req)) {
       return createInstance(type);
     } else if (isType("text/plain", req.getContentType())) {
-      BufferedReader br = req.getReader();
-      try {
+      try (BufferedReader br = req.getReader()) {
         char[] tmp = new char[256];
         StringBuilder sb = new StringBuilder();
         int n;
@@ -557,8 +553,6 @@
           sb.append(tmp, 0, n);
         }
         return parseString(sb.toString(), type);
-      } finally {
-        br.close();
       }
     } else if ("POST".equals(req.getMethod())
         && isType(FORM_TYPE, req.getContentType())) {
@@ -772,11 +766,8 @@
       }
 
       if (req == null || !"HEAD".equals(req.getMethod())) {
-        OutputStream dst = res.getOutputStream();
-        try {
+        try (OutputStream dst = res.getOutputStream()) {
           bin.writeTo(dst);
-        } finally {
-          dst.close();
         }
       }
     } finally {
@@ -1078,9 +1069,9 @@
   private static BinaryResult compress(BinaryResult bin)
       throws IOException {
     TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, 20 << 20);
-    GZIPOutputStream gz = new GZIPOutputStream(buf);
-    bin.writeTo(gz);
-    gz.close();
+    try (GZIPOutputStream gz = new GZIPOutputStream(buf)) {
+      bin.writeTo(gz);
+    }
     return asBinaryResult(buf).setContentType(bin.getContentType());
   }
 
diff --git a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java b/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
index e3e6d48..60404a3 100644
--- a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
+++ b/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
@@ -102,16 +102,11 @@
       return "";
     }
 
-    try {
-      final JarFile jar = new JarFile(me);
-      try {
-        Manifest mf = jar.getManifest();
-        Attributes att = mf.getMainAttributes();
-        String val = att.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
-        return val != null ? val : "";
-      } finally {
-        jar.close();
-      }
+    try (JarFile jar = new JarFile(me)) {
+      Manifest mf = jar.getManifest();
+      Attributes att = mf.getMainAttributes();
+      String val = att.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
+      return val != null ? val : "";
     } catch (IOException e) {
       return "";
     }
@@ -202,28 +197,23 @@
     }
 
     final SortedMap<String, URL> jars = new TreeMap<>();
-    try {
-      final ZipFile zf = new ZipFile(path);
-      try {
-        final Enumeration<? extends ZipEntry> e = zf.entries();
-        while (e.hasMoreElements()) {
-          final ZipEntry ze = e.nextElement();
-          if (ze.isDirectory()) {
-            continue;
-          }
+    try (ZipFile zf = new ZipFile(path)) {
+      final Enumeration<? extends ZipEntry> e = zf.entries();
+      while (e.hasMoreElements()) {
+        final ZipEntry ze = e.nextElement();
+        if (ze.isDirectory()) {
+          continue;
+        }
 
-          String name = ze.getName();
-          if (name.startsWith("WEB-INF/lib/")) {
+        String name = ze.getName();
+        if (name.startsWith("WEB-INF/lib/")) {
+          extractJar(zf, ze, jars);
+        } else if (name.startsWith("WEB-INF/pgm-lib/")) {
+          // Some Prolog tools are restricted.
+          if (prologCompiler || !name.startsWith("WEB-INF/pgm-lib/prolog-")) {
             extractJar(zf, ze, jars);
-          } else if (name.startsWith("WEB-INF/pgm-lib/")) {
-            // Some Prolog tools are restricted.
-            if (prologCompiler || !name.startsWith("WEB-INF/pgm-lib/prolog-")) {
-              extractJar(zf, ze, jars);
-            }
           }
         }
-      } finally {
-        zf.close();
       }
     } catch (IOException e) {
       throw new IOException("Cannot obtain libraries from " + path, e);
@@ -257,20 +247,13 @@
   private static void extractJar(ZipFile zf, ZipEntry ze,
       SortedMap<String, URL> jars) throws IOException {
     File tmp = createTempFile(safeName(ze), ".jar");
-    FileOutputStream out = new FileOutputStream(tmp);
-    try {
-      InputStream in = zf.getInputStream(ze);
-      try {
-        byte[] buf = new byte[4096];
-        int n;
-        while ((n = in.read(buf, 0, buf.length)) > 0) {
-          out.write(buf, 0, n);
-        }
-      } finally {
-        in.close();
+    try (FileOutputStream out = new FileOutputStream(tmp);
+        InputStream in = zf.getInputStream(ze)) {
+      byte[] buf = new byte[4096];
+      int n;
+      while ((n = in.read(buf, 0, buf.length)) > 0) {
+        out.write(buf, 0, n);
       }
-    } finally {
-      out.close();
     }
 
     String name = ze.getName();
@@ -363,24 +346,16 @@
     final CodeSource src =
         GerritLauncher.class.getProtectionDomain().getCodeSource();
     if (src != null) {
-      try {
-        final InputStream in = src.getLocation().openStream();
-        try {
-          final File tmp = createTempFile("gerrit_", ".zip");
-          final FileOutputStream out = new FileOutputStream(tmp);
-          try {
-            final byte[] buf = new byte[4096];
-            int n;
-            while ((n = in.read(buf, 0, buf.length)) > 0) {
-              out.write(buf, 0, n);
-            }
-          } finally {
-            out.close();
+      try (InputStream in = src.getLocation().openStream()) {
+        final File tmp = createTempFile("gerrit_", ".zip");
+        try (FileOutputStream out = new FileOutputStream(tmp)) {
+          final byte[] buf = new byte[4096];
+          int n;
+          while ((n = in.read(buf, 0, buf.length)) > 0) {
+            out.write(buf, 0, n);
           }
-          return tmp;
-        } finally {
-          in.close();
         }
+        return tmp;
       } catch (IOException e) {
         // Nope, that didn't work.
         //
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
index b8080c9..bd7558b 100644
--- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
+++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
@@ -319,11 +319,8 @@
     res.setContentType("text/html");
     res.setCharacterEncoding("UTF-8");
     res.setContentLength(bin.length);
-    ServletOutputStream out = res.getOutputStream();
-    try {
+    try (ServletOutputStream out = res.getOutputStream()) {
       out.write(bin);
-    } finally {
-      out.close();
     }
   }
 
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java
index 4719a84..d6ada97 100644
--- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java
+++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java
@@ -63,11 +63,8 @@
     rsp.setContentType("application/xrds+xml");
     rsp.setCharacterEncoding(ENC);
 
-    final ServletOutputStream out = rsp.getOutputStream();
-    try {
+    try (ServletOutputStream out = rsp.getOutputStream()) {
       out.write(raw);
-    } finally {
-      out.close();
     }
   }
 }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java
index da6a42e..2214587 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java
@@ -40,13 +40,12 @@
       name = "WEB-INF/" + fileName;
     }
 
-    final InputStream in = open(name);
-    if (in == null) {
-      System.err.println("error: no such file " + fileName);
-      return 1;
-    }
+    try (InputStream in = open(name)) {
+      if (in == null) {
+        System.err.println("error: no such file " + fileName);
+        return 1;
+      }
 
-    try {
       try {
         final byte[] buf = new byte[4096];
         int n;
@@ -56,8 +55,6 @@
       } finally {
         System.out.flush();
       }
-    } finally {
-      in.close();
     }
     return 0;
   }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
index d208a3c..c3cf914 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
@@ -60,14 +60,11 @@
     manager.start();
     dbInjector.injectMembers(this);
 
-    final ReviewDb db = database.open();
-    try {
+    try (ReviewDb db = database.open()) {
       todo = db.accountExternalIds().all().toList();
       synchronized (monitor) {
         monitor.beginTask("Converting local username", todo.size());
       }
-    } finally {
-      db.close();
     }
 
     final List<Worker> workers = new ArrayList<>(threads);
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java
index 2bcd6ea..9f6436b 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java
@@ -26,8 +26,7 @@
 public class Ls extends AbstractProgram {
   @Override
   public int run() throws IOException {
-    final ZipFile zf = new ZipFile(GerritLauncher.getDistributionArchive());
-    try {
+    try (ZipFile zf = new ZipFile(GerritLauncher.getDistributionArchive())) {
       final Enumeration<? extends ZipEntry> e = zf.entries();
       while (e.hasMoreElements()) {
         final ZipEntry ze = e.nextElement();
@@ -48,8 +47,6 @@
           System.out.println(name);
         }
       }
-    } finally {
-      zf.close();
     }
     return 0;
   }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java
index 12e1e99..a77cc8c 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java
@@ -47,14 +47,11 @@
           PrintWriter out = new PrintWriter(
               new BufferedWriter(new OutputStreamWriter(o, "UTF-8")))) {
         String header;
-        InputStream in = getClass().getResourceAsStream("ProtoGenHeader.txt");
-        try {
+        try (InputStream in = getClass().getResourceAsStream("ProtoGenHeader.txt")) {
           ByteBuffer buf = IO.readWholeStream(in, 1024);
           int ptr = buf.arrayOffset() + buf.position();
           int len = buf.remaining();
           header = new String(buf.array(), ptr, len, "UTF-8");
-        } finally {
-          in.close();
         }
 
         String version = com.google.gerrit.common.Version.getVersion();
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java
index 7f0535f..4397661 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java
@@ -92,11 +92,9 @@
     });
     dbInjector.injectMembers(this);
 
-    ReviewDb db = schemaFactory.open();
-
     ProgressMonitor progress = new TextProgressMonitor();
     progress.beginTask("Importing entities", ProgressMonitor.UNKNOWN);
-    try {
+    try (ReviewDb db = schemaFactory.open()) {
       for (RelationModel model
           : new JavaSchemaModel(ReviewDb.class).getRelations()) {
         relations.put(model.getRelationID(), Relation.create(model, db));
@@ -119,8 +117,6 @@
         }
       }
       progress.endTask();
-    } finally {
-      db.close();
     }
 
     return 0;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNotedb.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNotedb.java
index a29a8e0..db436d5 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNotedb.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNotedb.java
@@ -113,13 +113,11 @@
         sysInjector.getInstance(GitRepositoryManager.class);
     final Project.NameKey allUsersName =
         sysInjector.getInstance(AllUsersName.class);
-    final Repository allUsersRepo =
-        repoManager.openMetadataRepository(allUsersName);
-    try {
+    try (Repository allUsersRepo =
+        repoManager.openMetadataRepository(allUsersName)) {
       deleteDraftRefs(allUsersRepo);
       for (final Project.NameKey project : changesByProject.keySet()) {
-        final Repository repo = repoManager.openMetadataRepository(project);
-        try {
+        try (Repository repo = repoManager.openMetadataRepository(project)) {
           final BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
           final BatchRefUpdate bruForDrafts =
               allUsersRepo.getRefDatabase().newBatchUpdate();
@@ -158,12 +156,8 @@
           log.error("Error rebuilding notedb", e);
           ok.set(false);
           break;
-        } finally {
-          repo.close();
         }
       }
-    } finally {
-      allUsersRepo.close();
     }
 
     double t = sw.elapsed(TimeUnit.MILLISECONDS) / 1000d;
@@ -231,16 +225,13 @@
     // rebuilder threads to use the full connection pool.
     SchemaFactory<ReviewDb> schemaFactory = sysInjector.getInstance(Key.get(
         new TypeLiteral<SchemaFactory<ReviewDb>>() {}));
-    ReviewDb db = schemaFactory.open();
     Multimap<Project.NameKey, Change> changesByProject =
         ArrayListMultimap.create();
-    try {
+    try (ReviewDb db = schemaFactory.open()) {
       for (Change c : db.changes().all()) {
         changesByProject.put(c.getProject(), c);
       }
       return changesByProject;
-    } finally {
-      db.close();
     }
   }
 
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
index 44f80f2..64dd514 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
@@ -149,21 +149,18 @@
   }
 
   private int indexAll() throws Exception {
-    ReviewDb db = sysInjector.getInstance(ReviewDb.class);
     ProgressMonitor pm = new TextProgressMonitor();
     pm.start(1);
     pm.beginTask("Collecting projects", ProgressMonitor.UNKNOWN);
     Set<Project.NameKey> projects = Sets.newTreeSet();
     int changeCount = 0;
-    try {
+    try (ReviewDb db = sysInjector.getInstance(ReviewDb.class)) {
       for (Change change : db.changes().all()) {
         changeCount++;
         if (projects.add(change.getProject())) {
           pm.update(1);
         }
       }
-    } finally {
-      db.close();
     }
     pm.endTask();
 
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
index 8f1b354..9cf6892 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
@@ -81,8 +81,7 @@
 
     boolean error = false;
     for (Project.NameKey project : names) {
-      Repository git = gitManager.openRepository(project);
-      try {
+      try (Repository git = gitManager.openRepository(project)) {
         switch (jarFactory.create(git).call()) {
           case NO_RULES:
             if (!all || projectNames.contains(project.get())) {
@@ -105,8 +104,6 @@
           System.err.println("fatal: " + err.getMessage());
         }
         error = true;
-      } finally {
-        git.close();
       }
     }
 
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
index 3b0a590..ba1aea3 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
@@ -56,11 +56,8 @@
     try {
       CacheHeaders.setNotCacheable(res);
     } finally {
-      ServletOutputStream out = res.getOutputStream();
-      try {
+      try (ServletOutputStream out = res.getOutputStream()) {
         out.write(msg);
-      } finally {
-        out.close();
       }
     }
   }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
index 80d69f1..5028e4d3 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
@@ -520,8 +520,7 @@
   }
 
   private static void unpack(File srcwar, File dstwar) throws IOException {
-    final ZipFile zf = new ZipFile(srcwar);
-    try {
+    try (ZipFile zf = new ZipFile(srcwar)) {
       final Enumeration<? extends ZipEntry> e = zf.entries();
       while (e.hasMoreElements()) {
         final ZipEntry ze = e.nextElement();
@@ -539,24 +538,15 @@
         mkdir(rawtmp.getParentFile());
         rawtmp.deleteOnExit();
 
-        final FileOutputStream rawout = new FileOutputStream(rawtmp);
-        try {
-          final InputStream in = zf.getInputStream(ze);
-          try {
-            final byte[] buf = new byte[4096];
-            int n;
-            while ((n = in.read(buf, 0, buf.length)) > 0) {
-              rawout.write(buf, 0, n);
-            }
-          } finally {
-            in.close();
+        try (FileOutputStream rawout = new FileOutputStream(rawtmp);
+            InputStream in = zf.getInputStream(ze)) {
+          final byte[] buf = new byte[4096];
+          int n;
+          while ((n = in.read(buf, 0, buf.length)) > 0) {
+            rawout.write(buf, 0, n);
           }
-        } finally {
-          rawout.close();
         }
       }
-    } finally {
-      zf.close();
     }
   }
 
@@ -632,14 +622,14 @@
         CacheHeaders.setNotCacheable(res);
 
         Escaper html = HtmlEscapers.htmlEscaper();
-        PrintWriter w = res.getWriter();
-        w.write("<html><title>BUILD FAILED</title><body>");
-        w.format("<h1>%s FAILED</h1>", html.escape(rule));
-        w.write("<pre>");
-        w.write(html.escape(RawParseUtils.decode(why)));
-        w.write("</pre>");
-        w.write("</body></html>");
-        w.close();
+        try (PrintWriter w = res.getWriter()) {
+          w.write("<html><title>BUILD FAILED</title><body>");
+          w.format("<h1>%s FAILED</h1>", html.escape(rule));
+          w.write("<pre>");
+          w.write(html.escape(RawParseUtils.decode(why)));
+          w.write("</pre>");
+          w.write("</body></html>");
+        }
       }
 
       @Override
@@ -667,12 +657,10 @@
     long start = TimeUtil.nowMs();
     Process rebuild = proc.start();
     byte[] out;
-    InputStream in = rebuild.getInputStream();
-    try {
+    try (InputStream in = rebuild.getInputStream()) {
       out = ByteStreams.toByteArray(in);
     } finally {
       rebuild.getOutputStream().close();
-      in.close();
     }
 
     int status;
@@ -692,12 +680,9 @@
   private static Properties loadBuckProperties(File gen)
       throws FileNotFoundException, IOException {
     Properties properties = new Properties();
-    InputStream in = new FileInputStream(
-        new File(new File(gen, "tools"), "buck.properties"));
-    try {
+    try (InputStream in = new FileInputStream(
+        new File(new File(gen, "tools"), "buck.properties"))) {
       properties.load(in);
-    } finally {
-      in.close();
     }
     return properties;
   }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java
index e0cb4c4..b670d39 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java
@@ -68,8 +68,7 @@
       return;
     }
 
-    ReviewDb db = dbFactory.open();
-    try {
+    try (ReviewDb db = dbFactory.open()) {
       if (db.accounts().anyAccounts().toList().isEmpty()) {
         ui.header("Gerrit Administrator");
         if (ui.yesno(true, "Create administrator user")) {
@@ -111,8 +110,6 @@
           }
         }
       }
-    } finally {
-      db.close();
     }
   }
 
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
index a714ac9..bb4c314 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
@@ -171,13 +171,10 @@
   }
 
   private static String getVersion(Path plugin) throws IOException {
-    JarFile jarFile = new JarFile(plugin.toFile());
-    try {
+    try (JarFile jarFile = new JarFile(plugin.toFile())) {
       Manifest manifest = jarFile.getManifest();
       Attributes main = manifest.getMainAttributes();
       return main.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
-    } finally {
-      jarFile.close();
     }
   }
 }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
index 10d93ee..06d907a 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
@@ -79,11 +79,8 @@
   public AllProjectsConfig load() throws IOException, ConfigInvalidException {
     File path = getPath();
     if (path != null) {
-      Repository repo = new FileRepository(path);
-      try {
+      try (Repository repo = new FileRepository(path)) {
         load(repo);
-      } finally {
-        repo.close();
       }
     }
     return this;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java
index ca8b183..31c3be1 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java
@@ -139,11 +139,8 @@
     // Any leak of tmp caused by this method failing will be cleaned
     // up by our caller when tempDir is recursively deleted.
     File tmp = File.createTempFile("rules", ".pl", tempDir);
-    FileOutputStream out = new FileOutputStream(tmp);
-    try {
+    try (FileOutputStream out = new FileOutputStream(tmp)) {
       git.open(blobId).copyTo(out);
-    } finally {
-      out.close();
     }
     return tmp;
   }
@@ -157,9 +154,8 @@
 
     DiagnosticCollector<JavaFileObject> diagnostics =
         new DiagnosticCollector<>();
-    StandardJavaFileManager fileManager =
-        compiler.getStandardFileManager(diagnostics, null, null);
-    try {
+    try (StandardJavaFileManager fileManager =
+        compiler.getStandardFileManager(diagnostics, null, null)) {
       Iterable<? extends JavaFileObject> compilationUnits = fileManager
         .getJavaFileObjectsFromFiles(getAllFiles(tempDir, ".java"));
       ArrayList<String> options = new ArrayList<>();
@@ -195,8 +191,6 @@
         }
         throw new CompileException(msg.toString());
       }
-    } finally {
-      fileManager.close();
     }
   }
 
@@ -247,8 +241,7 @@
         jarAdd.setTime(now);
         out.putNextEntry(jarAdd);
         if (f.isFile()) {
-          FileInputStream in = new FileInputStream(f);
-          try {
+          try (FileInputStream in = new FileInputStream(f)) {
             while (true) {
               int nRead = in.read(buffer, 0, buffer.length);
               if (nRead <= 0) {
@@ -256,8 +249,6 @@
               }
               out.write(buffer, 0, nRead);
             }
-          } finally {
-            in.close();
           }
         }
         out.closeEntry();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
index 19c3145..285f1d4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
@@ -943,15 +943,10 @@
 
         ps = pb.start();
         ps.getOutputStream().close();
-        InputStream is = ps.getInputStream();
         String output = null;
-        try {
+        try (InputStream is = ps.getInputStream()) {
           output = readOutput(is);
         } finally {
-          try {
-            is.close();
-          } catch (IOException closeErr) {
-          }
           ps.waitFor();
           result = new HookResult(ps.exitValue(), output);
         }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java b/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
index 658bb35..309ab9f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
@@ -265,27 +265,19 @@
 
   private String read(Project.NameKey project, ObjectId rulesId)
       throws CompileException {
-    Repository git;
-    try {
-      git = gitMgr.openRepository(project);
-    } catch (RepositoryNotFoundException e) {
-      throw new CompileException("Cannot open repository " + project, e);
+    try (Repository git = gitMgr.openRepository(project)) {
+      try {
+        ObjectLoader ldr = git.open(rulesId, Constants.OBJ_BLOB);
+        byte[] raw = ldr.getCachedBytes(SRC_LIMIT);
+        return RawParseUtils.decode(raw);
+      } catch (LargeObjectException e) {
+        throw new CompileException("rules of " + project + " are too large", e);
+      } catch (RuntimeException | IOException e) {
+        throw new CompileException("Cannot load rules of " + project, e);
+      }
     } catch (IOException e) {
       throw new CompileException("Cannot open repository " + project, e);
     }
-    try {
-      ObjectLoader ldr = git.open(rulesId, Constants.OBJ_BLOB);
-      byte[] raw = ldr.getCachedBytes(SRC_LIMIT);
-      return RawParseUtils.decode(raw);
-    } catch (LargeObjectException e) {
-      throw new CompileException("rules of " + project + " are too large", e);
-    } catch (RuntimeException e) {
-      throw new CompileException("Cannot load rules of " + project, e);
-    } catch (IOException e) {
-      throw new CompileException("Cannot load rules of " + project, e);
-    } finally {
-      git.close();
-    }
   }
 
   private BufferingPrologControl newEmptyMachine(ClassLoader cl) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java
index c31a411..b3cf660 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java
@@ -106,9 +106,8 @@
       TreeMap<Integer, PatchSet> patchSets = getPatchSets(cd);
       NavigableSet<Integer> allPsIds = patchSets.navigableKeySet();
 
-      Repository repo =
-          repoManager.openRepository(project.getProject().getNameKey());
-      try {
+      try (Repository repo =
+          repoManager.openRepository(project.getProject().getNameKey())) {
         // Walk patch sets strictly less than current in descending order.
         Collection<PatchSet> allPrior = patchSets.descendingMap()
             .tailMap(ps.getId().get(), false)
@@ -132,8 +131,6 @@
           }
         }
         return labelNormalizer.normalize(ctl, byUser.values()).getNormalized();
-      } finally {
-        repo.close();
       }
     } catch (IOException e) {
       throw new OrmException(e);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
index 96d1e9d..a25d9b3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
@@ -382,8 +382,7 @@
       throw new NoSuchChangeException(patchSetId.getParentKey());
     }
 
-    Repository repo = gitManager.openRepository(change.getProject());
-    try {
+    try (Repository repo = gitManager.openRepository(change.getProject())) {
       RefUpdate update = repo.updateRef(patch.getRefName());
       update.setForceUpdate(true);
       update.disableRefLog();
@@ -399,8 +398,6 @@
               " in " + repo.getDirectory() + ": " + update.getResult());
       }
       gitRefUpdated.fire(change.getProject(), update, ReceiveCommand.Type.DELETE);
-    } finally {
-      repo.close();
     }
 
     ReviewDb db = this.db.get();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/PatchLineCommentsUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/PatchLineCommentsUtil.java
index 88f034e..15519cc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/PatchLineCommentsUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/PatchLineCommentsUtil.java
@@ -364,19 +364,11 @@
   }
 
   private Set<String> getRefNamesAllUsers(String prefix) throws OrmException {
-    Repository repo;
-    try {
-      repo = repoManager.openRepository(allUsers);
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-    try {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
       RefDatabase refDb = repo.getRefDatabase();
       return refDb.getRefs(prefix).keySet();
     } catch (IOException e) {
       throw new OrmException(e);
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java
index ad7a7ec..40c5242 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java
@@ -39,15 +39,12 @@
   public static boolean branchExists(final GitRepositoryManager repoManager,
       final Branch.NameKey branch) throws RepositoryNotFoundException,
       IOException {
-    final Repository repo = repoManager.openRepository(branch.getParentKey());
-    try {
+    try (Repository repo = repoManager.openRepository(branch.getParentKey())) {
       boolean exists = repo.getRefDatabase().exactRef(branch.get()) != null;
       if (!exists) {
         exists = repo.getFullBranch().equals(branch.get());
       }
       return exists;
-    } finally {
-      repo.close();
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCacheImpl.java
index 45d3d1f..28df97a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountByEmailCacheImpl.java
@@ -92,8 +92,7 @@
 
     @Override
     public Set<Account.Id> load(String email) throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         Set<Account.Id> r = Sets.newHashSet();
         for (Account a : db.accounts().byPreferredEmail(email)) {
           r.add(a.getId());
@@ -103,8 +102,6 @@
           r.add(a.getAccountId());
         }
         return ImmutableSet.copyOf(r);
-      } finally {
-        db.close();
       }
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java
index cc62b2b..bedd9f1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java
@@ -142,16 +142,13 @@
 
     @Override
     public AccountState load(Account.Id key) throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         final AccountState state = load(db, key);
         String user = state.getUserName();
         if (user != null) {
           byName.put(user, Optional.of(state.getAccount().getId()));
         }
         return state;
-      } finally {
-        db.close();
       }
     }
 
@@ -192,8 +189,7 @@
 
     @Override
     public Optional<Account.Id> load(String username) throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         final AccountExternalId.Key key = new AccountExternalId.Key( //
             AccountExternalId.SCHEME_USERNAME, //
             username);
@@ -202,8 +198,6 @@
           return Optional.of(id.getAccountId());
         }
         return Optional.absent();
-      } finally {
-        db.close();
       }
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
index 62615c6..5c175ad 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
@@ -83,13 +83,10 @@
    */
   public Account.Id lookup(String externalId) throws AccountException {
     try {
-      ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         AccountExternalId ext =
             db.accountExternalIds().get(new AccountExternalId.Key(externalId));
         return ext != null ? ext.getAccountId() : null;
-      } finally {
-        db.close();
       }
     } catch (OrmException e) {
       throw new AccountException("Cannot lookup account " + externalId, e);
@@ -107,8 +104,7 @@
   public AuthResult authenticate(AuthRequest who) throws AccountException {
     who = realm.authenticate(who);
     try {
-      ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         AccountExternalId.Key key = id(who);
         AccountExternalId id = db.accountExternalIds().get(key);
         if (id == null) {
@@ -128,8 +124,6 @@
           return new AuthResult(id.getAccountId(), key, false);
         }
 
-      } finally {
-        db.close();
       }
     } catch (OrmException e) {
       throw new AccountException("Authentication error", e);
@@ -324,8 +318,7 @@
    */
   public AuthResult link(Account.Id to, AuthRequest who)
       throws AccountException, OrmException {
-    ReviewDb db = schema.open();
-    try {
+    try (ReviewDb db = schema.open()) {
       who = realm.link(db, to, who);
 
       AccountExternalId.Key key = id(who);
@@ -357,8 +350,6 @@
 
       return new AuthResult(to, key, false);
 
-    } finally {
-      db.close();
     }
   }
 
@@ -377,8 +368,7 @@
    */
   public AuthResult updateLink(Account.Id to, AuthRequest who) throws OrmException,
       AccountException {
-    ReviewDb db = schema.open();
-    try {
+    try (ReviewDb db = schema.open()) {
       AccountExternalId.Key key = id(who);
       List<AccountExternalId.Key> filteredKeysByScheme =
           filterKeysByScheme(key.getScheme(), db.accountExternalIds()
@@ -390,8 +380,6 @@
       }
       byIdCache.evict(to);
       return link(to, who);
-    } finally {
-      db.close();
     }
   }
 
@@ -417,8 +405,7 @@
    */
   public AuthResult unlink(Account.Id from, AuthRequest who)
       throws AccountException, OrmException {
-    ReviewDb db = schema.open();
-    try {
+    try (ReviewDb db = schema.open()) {
       who = realm.unlink(db, from, who);
 
       AccountExternalId.Key key = id(who);
@@ -446,8 +433,6 @@
 
       return new AuthResult(from, key, false);
 
-    } finally {
-      db.close();
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java
index 71aca39..28c3be6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java
@@ -86,14 +86,11 @@
       throw new ResourceNotFoundException();
     }
 
-    Repository git = gitMgr.openRepository(allUsersName);
-    try {
+    try (Repository git = gitMgr.openRepository(allUsersName)) {
       VersionedAccountPreferences p =
           VersionedAccountPreferences.forUser(rsrc.getUser().getAccountId());
       p.load(git);
       return new PreferenceInfo(a.getGeneralPreferences(), p, git);
-    } finally {
-      git.close();
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java
index b33e3f7..bf04234 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java
@@ -152,13 +152,8 @@
 
   @Override
   public Iterable<AccountGroup> all() {
-    try {
-      ReviewDb db = schema.open();
-      try {
-        return Collections.unmodifiableList(db.accountGroups().all().toList());
-      } finally {
-        db.close();
-      }
+    try (ReviewDb db = schema.open()) {
+      return Collections.unmodifiableList(db.accountGroups().all().toList());
     } catch (OrmException e) {
       log.warn("Cannot list internal groups", e);
       return Collections.emptyList();
@@ -187,11 +182,8 @@
     @Override
     public Optional<AccountGroup> load(final AccountGroup.Id key)
         throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         return Optional.fromNullable(db.accountGroups().get(key));
-      } finally {
-        db.close();
       }
     }
   }
@@ -207,16 +199,13 @@
     @Override
     public Optional<AccountGroup> load(String name)
         throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         AccountGroup.NameKey key = new AccountGroup.NameKey(name);
         AccountGroupName r = db.accountGroupNames().get(key);
         if (r != null) {
           return Optional.fromNullable(db.accountGroups().get(r.getId()));
         }
         return Optional.absent();
-      } finally {
-        db.close();
       }
     }
   }
@@ -232,8 +221,7 @@
     @Override
     public Optional<AccountGroup> load(String uuid)
         throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         List<AccountGroup> r;
 
         r = db.accountGroups().byUUID(new AccountGroup.UUID(uuid)).toList();
@@ -244,8 +232,6 @@
         } else {
           throw new OrmDuplicateKeyException("Duplicate group UUID " + uuid);
         }
-      } finally {
-        db.close();
       }
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
index 9e7918d..4b56b81 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
@@ -144,8 +144,7 @@
 
     @Override
     public Set<AccountGroup.UUID> load(AccountGroup.UUID key) throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         List<AccountGroup> group = db.accountGroups().byUUID(key).toList();
         if (group.size() != 1) {
           return Collections.emptySet();
@@ -157,8 +156,6 @@
           ids.add(agi.getIncludeUUID());
         }
         return ImmutableSet.copyOf(ids);
-      } finally {
-        db.close();
       }
     }
   }
@@ -174,8 +171,7 @@
 
     @Override
     public Set<AccountGroup.UUID> load(AccountGroup.UUID key) throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         Set<AccountGroup.Id> ids = Sets.newHashSet();
         for (AccountGroupById agi : db.accountGroupById()
             .byIncludeUUID(key)) {
@@ -187,8 +183,6 @@
           groupArray.add(g.getGroupUUID());
         }
         return ImmutableSet.copyOf(groupArray);
-      } finally {
-        db.close();
       }
     }
   }
@@ -204,8 +198,7 @@
 
     @Override
     public Set<AccountGroup.UUID> load(String key) throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         Set<AccountGroup.UUID> ids = Sets.newHashSet();
         for (AccountGroupById agi : db.accountGroupById().all()) {
           if (!AccountGroup.isInternalGroup(agi.getIncludeUUID())) {
@@ -213,8 +206,6 @@
           }
         }
         return ImmutableSet.copyOf(ids);
-      } finally {
-        db.close();
       }
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
index 3607e34..889965a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
@@ -307,8 +307,7 @@
 
     @Override
     public Optional<Account.Id> load(String username) throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         final AccountExternalId extId =
             db.accountExternalIds().get(
                 new AccountExternalId.Key(SCHEME_GERRIT, username));
@@ -316,8 +315,6 @@
           return Optional.of(extId.getAccountId());
         }
         return Optional.absent();
-      } finally {
-        db.close();
       }
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
index 5e406dd..007c233 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
@@ -109,8 +109,7 @@
     }
     result.submitType = rec.type;
 
-    Repository git = gitManager.openRepository(change.getProject());
-    try {
+    try (Repository git = gitManager.openRepository(change.getProject())) {
       ObjectId commit = toId(ps);
       if (commit == null) {
         result.mergeable = false;
@@ -150,8 +149,6 @@
           }
         }
       }
-    } finally {
-      git.close();
     }
     return result;
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChange.java
index 64924fb..868b7d3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChange.java
@@ -356,25 +356,19 @@
 
   public boolean canRebase(Project.NameKey project, PatchSet.Id patchSetId,
       Branch.NameKey branch) {
-    Repository git;
-    try {
-      git = gitManager.openRepository(project);
-    } catch (RepositoryNotFoundException err) {
-      return false;
+    try (Repository git = gitManager.openRepository(project)) {
+      try (RevWalk rw = new RevWalk(git)) {
+        findBaseRevision(patchSetId, db.get(), branch, git, rw);
+        return true;
+      } catch (InvalidChangeOperationException e) {
+        return false;
+      } catch (OrmException | IOException e) {
+        log.warn("Error checking if patch set " + patchSetId + " on " + branch
+            + " can be rebased", e);
+        return false;
+      }
     } catch (IOException err) {
       return false;
     }
-    try (RevWalk rw = new RevWalk(git)) {
-      findBaseRevision(patchSetId, db.get(), branch, git, rw);
-      return true;
-    } catch (InvalidChangeOperationException e) {
-      return false;
-    } catch (OrmException | IOException e) {
-      log.warn("Error checking if patch set " + patchSetId + " on " + branch
-          + " can be rebased", e);
-      return false;
-    } finally {
-      git.close();
-    }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java
index e915427..d120275 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java
@@ -41,14 +41,11 @@
   @Override
   public PreferenceInfo apply(ConfigResource rsrc)
       throws IOException, ConfigInvalidException {
-    Repository git = gitMgr.openRepository(allUsersName);
-    try {
+    try (Repository git = gitMgr.openRepository(allUsersName)) {
       VersionedAccountPreferences p =
           VersionedAccountPreferences.forDefault();
       p.load(git);
       return new PreferenceInfo(null, p, git);
-    } finally {
-      git.close();
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/contact/EncryptedContactStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/contact/EncryptedContactStore.java
index fedc909..ad4652b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/contact/EncryptedContactStore.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/contact/EncryptedContactStore.java
@@ -176,11 +176,10 @@
     final byte[] zText = compress(name, date, rawText);
 
     final ByteArrayOutputStream buf = new ByteArrayOutputStream();
-    final ArmoredOutputStream aout = new ArmoredOutputStream(buf);
-    final OutputStream cout = cpk().open(aout, zText.length);
-    cout.write(zText);
-    cout.close();
-    aout.close();
+    try (ArmoredOutputStream aout = new ArmoredOutputStream(buf);
+        OutputStream cout = cpk().open(aout, zText.length)) {
+      cout.write(zText);
+    }
 
     return buf.toByteArray();
   }
@@ -195,12 +194,13 @@
     }
 
     comdg = new PGPCompressedDataGenerator(PGPCompressedData.ZIP);
-    final OutputStream out =
+    try (OutputStream out =
         new PGPLiteralDataGenerator().open(comdg.open(buf),
-            PGPLiteralData.BINARY, fileName, len, fileDate);
-    out.write(plainText);
-    out.close();
-    comdg.close();
+            PGPLiteralData.BINARY, fileName, len, fileDate)) {
+      out.write(plainText);
+    } finally {
+      comdg.close(); // PGPCompressedDataGenerator doesn't implement Closable
+    }
     return buf.toByteArray();
   }
 
@@ -220,30 +220,25 @@
     field(b, "Full-Name", account.getFullName());
     field(b, "Preferred-Email", account.getPreferredEmail());
 
-    try {
-      final ReviewDb db = schema.open();
-      try {
-        for (final AccountExternalId e : db.accountExternalIds().byAccount(
-            account.getId())) {
-          final StringBuilder oistr = new StringBuilder();
-          if (e.getEmailAddress() != null && e.getEmailAddress().length() > 0) {
-            if (oistr.length() > 0) {
-              oistr.append(' ');
-            }
-            oistr.append(e.getEmailAddress());
+    try (ReviewDb db = schema.open()) {
+      for (final AccountExternalId e : db.accountExternalIds().byAccount(
+          account.getId())) {
+        final StringBuilder oistr = new StringBuilder();
+        if (e.getEmailAddress() != null && e.getEmailAddress().length() > 0) {
+          if (oistr.length() > 0) {
+            oistr.append(' ');
           }
-          if (e.isScheme(AccountExternalId.SCHEME_MAILTO)) {
-            if (oistr.length() > 0) {
-              oistr.append(' ');
-            }
-            oistr.append('<');
-            oistr.append(e.getExternalId());
-            oistr.append('>');
-          }
-          field(b, "Identity", oistr.toString());
+          oistr.append(e.getEmailAddress());
         }
-      } finally {
-        db.close();
+        if (e.isScheme(AccountExternalId.SCHEME_MAILTO)) {
+          if (oistr.length() > 0) {
+            oistr.append(' ');
+          }
+          oistr.append('<');
+          oistr.append(e.getExternalId());
+          oistr.append('>');
+        }
+        field(b, "Identity", oistr.toString());
       }
     } catch (OrmException e) {
       throw new ContactInformationStoreException(e);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/contact/HttpContactStoreConnection.java b/gerrit-server/src/main/java/com/google/gerrit/server/contact/HttpContactStoreConnection.java
index 471f6a2..ac500de 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/contact/HttpContactStoreConnection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/contact/HttpContactStoreConnection.java
@@ -55,11 +55,8 @@
       throw new IOException("Connection failed: " + conn.getResponseCode());
     }
     final byte[] dst = new byte[2];
-    final InputStream in = conn.getInputStream();
-    try {
+    try (InputStream in = conn.getInputStream()) {
       IO.readFully(in, dst, 0, 2);
-    } finally {
-      in.close();
     }
     if (dst[0] != 'O' || dst[1] != 'K') {
       throw new IOException("Store failed: " + dst[0] + dst[1]);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java
index 03441e7..c705a7d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java
@@ -156,17 +156,10 @@
       throw new FileNotFoundException("Resource " + name);
     }
     file.set("file".equals(url.getProtocol()));
-    InputStream in = url.openStream();
-    try {
-      TemporaryBuffer.Heap tmp = new TemporaryBuffer.Heap(128 * 1024);
-      try {
-        tmp.copy(in);
-        return new String(tmp.toByteArray(), "UTF-8");
-      } finally {
-        tmp.close();
-      }
-    } finally {
-      in.close();
+    try (InputStream in = url.openStream();
+        TemporaryBuffer.Heap tmp = new TemporaryBuffer.Heap(128 * 1024)) {
+      tmp.copy(in);
+      return new String(tmp.toByteArray(), "UTF-8");
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
index 188e95b..3062465 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
@@ -110,19 +110,16 @@
       return null;
     }
 
-    ZipInputStream zip = new ZipInputStream(index);
-    try {
+    try (ZipInputStream zip = new ZipInputStream(index)) {
       ZipEntry entry;
       while ((entry = zip.getNextEntry()) != null) {
-        IndexOutput out = dir.createOutput(entry.getName(), null);
-        int count;
-        while ((count = zip.read(buffer)) != -1) {
-          out.writeBytes(buffer, count);
+        try (IndexOutput out = dir.createOutput(entry.getName(), null)) {
+          int count;
+          while ((count = zip.read(buffer)) != -1) {
+            out.writeBytes(buffer, count);
+          }
         }
-        out.close();
       }
-    } finally {
-      zip.close();
     }
     // We must NOT call dir.close() here, as DirectoryReader.open() expects an opened directory.
     return dir;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
index 933007d..8631147 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -180,11 +180,8 @@
   public void delete(ChangeEdit edit)
       throws IOException {
     Change change = edit.getChange();
-    Repository repo = gitManager.openRepository(change.getProject());
-    try {
+    try (Repository repo = gitManager.openRepository(change.getProject())) {
       deleteRef(repo, edit);
-    } finally {
-      repo.close();
     }
     indexer.index(db.get(), change);
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
index 4a61e3e..6f22b65 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
@@ -229,39 +229,34 @@
   public void addDependencies(ChangeAttribute ca, Change change) {
     ca.dependsOn = new ArrayList<>();
     ca.neededBy = new ArrayList<>();
-    try {
-      final ReviewDb db = schema.open();
-      try {
-        final PatchSet.Id psId = change.currentPatchSetId();
-        for (PatchSetAncestor a : db.patchSetAncestors().ancestorsOf(psId)) {
-          for (PatchSet p :
-              db.patchSets().byRevision(a.getAncestorRevision())) {
-            Change c = db.changes().get(p.getId().getParentKey());
-            ca.dependsOn.add(newDependsOn(c, p));
-          }
+    try (ReviewDb db = schema.open()) {
+      final PatchSet.Id psId = change.currentPatchSetId();
+      for (PatchSetAncestor a : db.patchSetAncestors().ancestorsOf(psId)) {
+        for (PatchSet p :
+            db.patchSets().byRevision(a.getAncestorRevision())) {
+          Change c = db.changes().get(p.getId().getParentKey());
+          ca.dependsOn.add(newDependsOn(c, p));
         }
+      }
 
-        final PatchSet ps = db.patchSets().get(psId);
-        if (ps == null) {
-          log.error("Error while generating the list of descendants for"
-              + " PatchSet " + psId + ": Cannot find PatchSet entry in"
-              + " database.");
-        } else {
-          final RevId revId = ps.getRevision();
-          for (PatchSetAncestor a : db.patchSetAncestors().descendantsOf(revId)) {
-            final PatchSet p = db.patchSets().get(a.getPatchSet());
-            if (p == null) {
-              log.error("Error while generating the list of descendants for"
-                  + " revision " + revId.get() + ": Cannot find PatchSet entry in"
-                  + " database for " + a.getPatchSet());
-              continue;
-            }
-            final Change c = db.changes().get(p.getId().getParentKey());
-            ca.neededBy.add(newNeededBy(c, p));
+      final PatchSet ps = db.patchSets().get(psId);
+      if (ps == null) {
+        log.error("Error while generating the list of descendants for"
+            + " PatchSet " + psId + ": Cannot find PatchSet entry in"
+            + " database.");
+      } else {
+        final RevId revId = ps.getRevision();
+        for (PatchSetAncestor a : db.patchSetAncestors().descendantsOf(revId)) {
+          final PatchSet p = db.patchSets().get(a.getPatchSet());
+          if (p == null) {
+            log.error("Error while generating the list of descendants for"
+                + " revision " + revId.get() + ": Cannot find PatchSet entry in"
+                + " database for " + a.getPatchSet());
+            continue;
           }
+          final Change c = db.changes().get(p.getId().getParentKey());
+          ca.neededBy.add(newNeededBy(c, p));
         }
-      } finally {
-        db.close();
       }
     } catch (OrmException e) {
       // Squash DB exceptions and leave dependency lists partially filled.
@@ -401,38 +396,33 @@
     p.createdOn = patchSet.getCreatedOn().getTime() / 1000L;
     p.isDraft = patchSet.isDraft();
     final PatchSet.Id pId = patchSet.getId();
-    try {
-      final ReviewDb db = schema.open();
-      try {
-        p.parents = new ArrayList<>();
-        for (PatchSetAncestor a : db.patchSetAncestors().ancestorsOf(
-            patchSet.getId())) {
-          p.parents.add(a.getAncestorRevision().get());
-        }
-
-        UserIdentity author = psInfoFactory.get(db, pId).getAuthor();
-        if (author.getAccount() == null) {
-          p.author = new AccountAttribute();
-          p.author.email = author.getEmail();
-          p.author.name = author.getName();
-          p.author.username = "";
-        } else {
-          p.author = asAccountAttribute(author.getAccount());
-        }
-
-        Change change = db.changes().get(pId.getParentKey());
-        List<Patch> list =
-            patchListCache.get(change, patchSet).toPatchList(pId);
-        for (Patch pe : list) {
-          if (!Patch.COMMIT_MSG.equals(pe.getFileName())) {
-            p.sizeDeletions -= pe.getDeletions();
-            p.sizeInsertions += pe.getInsertions();
-          }
-        }
-        p.kind = changeKindCache.getChangeKind(db, change, patchSet);
-      } finally {
-        db.close();
+    try (ReviewDb db = schema.open()) {
+      p.parents = new ArrayList<>();
+      for (PatchSetAncestor a : db.patchSetAncestors().ancestorsOf(
+          patchSet.getId())) {
+        p.parents.add(a.getAncestorRevision().get());
       }
+
+      UserIdentity author = psInfoFactory.get(db, pId).getAuthor();
+      if (author.getAccount() == null) {
+        p.author = new AccountAttribute();
+        p.author.email = author.getEmail();
+        p.author.name = author.getName();
+        p.author.username = "";
+      } else {
+        p.author = asAccountAttribute(author.getAccount());
+      }
+
+      Change change = db.changes().get(pId.getParentKey());
+      List<Patch> list =
+          patchListCache.get(change, patchSet).toPatchList(pId);
+      for (Patch pe : list) {
+        if (!Patch.COMMIT_MSG.equals(pe.getFileName())) {
+          p.sizeDeletions -= pe.getDeletions();
+          p.sizeInsertions += pe.getInsertions();
+        }
+      }
+      p.kind = changeKindCache.getChangeKind(db, change, patchSet);
     } catch (OrmException e) {
       log.error("Cannot load patch set data for " + patchSet.getId(), e);
     } catch (PatchSetInfoNotAvailableException e) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java
index a915a79..cfdedd0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java
@@ -86,9 +86,7 @@
           GarbageCollectionResult.Error.Type.GC_ALREADY_SCHEDULED, projectName));
     }
     for (Project.NameKey p : projectsToGc) {
-      Repository repo = null;
-      try {
-        repo = repoManager.openRepository(p);
+      try (Repository repo = repoManager.openRepository(p)) {
         logGcConfiguration(p, repo, aggressive);
         print(writer, "collecting garbage for \"" + p + "\":\n");
         GarbageCollectCommand gc = Git.wrap(repo).gc();
@@ -110,9 +108,6 @@
         result.addError(new GarbageCollectionResult.Error(
             GarbageCollectionResult.Error.Type.GC_FAILED, p));
       } finally {
-        if (repo != null) {
-          repo.close();
-        }
         gcQueue.gcFinished(p);
       }
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
index 717b393..de35b4d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
@@ -302,11 +302,8 @@
   @Override
   public String getProjectDescription(final Project.NameKey name)
       throws RepositoryNotFoundException, IOException {
-    final Repository e = openRepository(name);
-    try {
+    try (Repository e = openRepository(name)) {
       return getProjectDescription(e);
-    } finally {
-      e.close();
     }
   }
 
@@ -337,31 +334,26 @@
       final String description) {
     // Update git's description file, in case gitweb is being used
     //
-    try {
-      final Repository e = openRepository(name);
-      try {
-        final String old = getProjectDescription(e);
-        if ((old == null && description == null)
-            || (old != null && old.equals(description))) {
-          return;
-        }
+    try (Repository e = openRepository(name)) {
+      final String old = getProjectDescription(e);
+      if ((old == null && description == null)
+          || (old != null && old.equals(description))) {
+        return;
+      }
 
-        final LockFile f = new LockFile(new File(e.getDirectory(), "description"), FS.DETECTED);
-        if (f.lock()) {
-          String d = description;
-          if (d != null) {
-            d = d.trim();
-            if (d.length() > 0) {
-              d += "\n";
-            }
-          } else {
-            d = "";
+      final LockFile f = new LockFile(new File(e.getDirectory(), "description"), FS.DETECTED);
+      if (f.lock()) {
+        String d = description;
+        if (d != null) {
+          d = d.trim();
+          if (d.length() > 0) {
+            d += "\n";
           }
-          f.write(Constants.encode(d));
-          f.commit();
+        } else {
+          d = "";
         }
-      } finally {
-        e.close();
+        f.write(Constants.encode(d));
+        f.commit();
       }
     } catch (RepositoryNotFoundException e) {
       log.error("Cannot update description for " + name, e);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
index 96207fa..5ed545e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
@@ -1031,13 +1031,8 @@
       @Override
       public void run() {
         PatchSet patchSet;
-        try {
-          ReviewDb reviewDb = schemaFactory.open();
-          try {
-            patchSet = reviewDb.patchSets().get(c.currentPatchSetId());
-          } finally {
-            reviewDb.close();
-          }
+        try (ReviewDb reviewDb = schemaFactory.open()) {
+          patchSet = reviewDb.patchSets().get(c.currentPatchSetId());
         } catch (Exception e) {
           logError("Cannot send email for submitted patch set " + c.getId(), e);
           return;
@@ -1193,13 +1188,8 @@
       @Override
       public void run() {
         PatchSet patchSet;
-        try {
-          ReviewDb reviewDb = schemaFactory.open();
-          try {
-            patchSet = reviewDb.patchSets().get(c.currentPatchSetId());
-          } finally {
-            reviewDb.close();
-          }
+        try (ReviewDb reviewDb = schemaFactory.open()) {
+          patchSet = reviewDb.patchSets().get(c.currentPatchSetId());
         } catch (Exception e) {
           logError("Cannot send email notifications about merge failure", e);
           return;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index ff21560..07810d8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -1719,11 +1719,8 @@
           if (caller == Thread.currentThread()) {
             insertChange(db);
           } else {
-            ReviewDb db = schemaFactory.open();
-            try {
+            try (ReviewDb db = schemaFactory.open()) {
               insertChange(db);
-            } finally {
-              db.close();
             }
           }
           synchronized (newProgress) {
@@ -2093,11 +2090,8 @@
             } else if (caller == Thread.currentThread()) {
               return insertPatchSet(db);
             } else {
-              ReviewDb db = schemaFactory.open();
-              try {
+              try (ReviewDb db = schemaFactory.open()) {
                 return insertPatchSet(db);
-              } finally {
-                db.close();
               }
             }
           } finally {
@@ -2347,11 +2341,8 @@
           if (caller == Thread.currentThread()) {
             updateGroups(db);
           } else {
-            ReviewDb db = schemaFactory.open();
-            try {
+            try (ReviewDb db = schemaFactory.open()) {
               updateGroups(db);
-            } finally {
-              db.close();
             }
           }
           return null;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ScanningChangeCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ScanningChangeCacheImpl.java
index 65808fc..19e23b7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ScanningChangeCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ScanningChangeCacheImpl.java
@@ -95,8 +95,8 @@
 
     @Override
     public List<Change> load(Project.NameKey key) throws Exception {
-      Repository repo = repoManager.openRepository(key);
-      try (ManualRequestContext ctx = requestContext.open()) {
+      try (Repository repo = repoManager.openRepository(key);
+          ManualRequestContext ctx = requestContext.open()) {
         ReviewDb db = ctx.getReviewDbProvider().get();
         Map<String, Ref> refs =
             repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES);
@@ -114,8 +114,6 @@
           Iterables.addAll(changes, db.changes().get(batch));
         }
         return changes;
-      } finally {
-        repo.close();
       }
     }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java
index 9e261f9..bc8bff7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java
@@ -67,13 +67,8 @@
           new AccountGroupMemberAudit(m, me, TimeUtil.nowTs());
       auditInserts.add(audit);
     }
-    try {
-      ReviewDb db = schema.open();
-      try {
-        db.accountGroupMembersAudit().insert(auditInserts);
-      } finally {
-        db.close();
-      }
+    try (ReviewDb db = schema.open()) {
+      db.accountGroupMembersAudit().insert(auditInserts);
     } catch (OrmException e) {
       logOrmExceptionForAccounts(
           "Cannot log add accounts to group event performed by user", me,
@@ -86,33 +81,28 @@
       Collection<AccountGroupMember> removed) {
     List<AccountGroupMemberAudit> auditInserts = Lists.newLinkedList();
     List<AccountGroupMemberAudit> auditUpdates = Lists.newLinkedList();
-    try {
-      ReviewDb db = schema.open();
-      try {
-        for (AccountGroupMember m : removed) {
-          AccountGroupMemberAudit audit = null;
-          for (AccountGroupMemberAudit a : db.accountGroupMembersAudit()
-              .byGroupAccount(m.getAccountGroupId(), m.getAccountId())) {
-            if (a.isActive()) {
-              audit = a;
-              break;
-            }
-          }
-
-          if (audit != null) {
-            audit.removed(me, TimeUtil.nowTs());
-            auditUpdates.add(audit);
-          } else {
-            audit = new AccountGroupMemberAudit(m, me, TimeUtil.nowTs());
-            audit.removedLegacy();
-            auditInserts.add(audit);
+    try (ReviewDb db = schema.open()) {
+      for (AccountGroupMember m : removed) {
+        AccountGroupMemberAudit audit = null;
+        for (AccountGroupMemberAudit a : db.accountGroupMembersAudit()
+            .byGroupAccount(m.getAccountGroupId(), m.getAccountId())) {
+          if (a.isActive()) {
+            audit = a;
+            break;
           }
         }
-        db.accountGroupMembersAudit().update(auditUpdates);
-        db.accountGroupMembersAudit().insert(auditInserts);
-      } finally {
-        db.close();
+
+        if (audit != null) {
+          audit.removed(me, TimeUtil.nowTs());
+          auditUpdates.add(audit);
+        } else {
+          audit = new AccountGroupMemberAudit(m, me, TimeUtil.nowTs());
+          audit.removedLegacy();
+          auditInserts.add(audit);
+        }
       }
+      db.accountGroupMembersAudit().update(auditUpdates);
+      db.accountGroupMembersAudit().insert(auditInserts);
     } catch (OrmException e) {
       logOrmExceptionForAccounts(
           "Cannot log delete accounts from group event performed by user", me,
@@ -129,13 +119,8 @@
           new AccountGroupByIdAud(groupInclude, me, TimeUtil.nowTs());
       includesAudit.add(audit);
     }
-    try {
-      ReviewDb db = schema.open();
-      try {
-        db.accountGroupByIdAud().insert(includesAudit);
-      } finally {
-        db.close();
-      }
+    try (ReviewDb db = schema.open()) {
+      db.accountGroupByIdAud().insert(includesAudit);
     } catch (OrmException e) {
       logOrmExceptionForGroups(
           "Cannot log add groups to group event performed by user", me, added,
@@ -147,28 +132,23 @@
   public void onDeleteGroupsFromGroup(Account.Id me,
       Collection<AccountGroupById> removed) {
     final List<AccountGroupByIdAud> auditUpdates = Lists.newLinkedList();
-    try {
-      ReviewDb db = schema.open();
-      try {
-        for (final AccountGroupById g : removed) {
-          AccountGroupByIdAud audit = null;
-          for (AccountGroupByIdAud a : db.accountGroupByIdAud()
-              .byGroupInclude(g.getGroupId(), g.getIncludeUUID())) {
-            if (a.isActive()) {
-              audit = a;
-              break;
-            }
-          }
-
-          if (audit != null) {
-            audit.removed(me, TimeUtil.nowTs());
-            auditUpdates.add(audit);
+    try (ReviewDb db = schema.open()) {
+      for (final AccountGroupById g : removed) {
+        AccountGroupByIdAud audit = null;
+        for (AccountGroupByIdAud a : db.accountGroupByIdAud()
+            .byGroupInclude(g.getGroupId(), g.getIncludeUUID())) {
+          if (a.isActive()) {
+            audit = a;
+            break;
           }
         }
-        db.accountGroupByIdAud().update(auditUpdates);
-      } finally {
-        db.close();
+
+        if (audit != null) {
+          audit.removed(me, TimeUtil.nowTs());
+          auditUpdates.add(audit);
+        }
       }
+      db.accountGroupByIdAud().update(auditUpdates);
     } catch (OrmException e) {
       logOrmExceptionForGroups(
           "Cannot log delete groups from group event performed by user", me,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java
index c0522d5..909cb53 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/SiteIndexer.java
@@ -235,12 +235,12 @@
       @Override
       public Void call() throws Exception {
         Multimap<ObjectId, ChangeData> byId = ArrayListMultimap.create();
-        Repository repo = null;
-        ReviewDb db = null;
-        try {
-          repo = repoManager.openRepository(project);
+        // TODO(dborowitz): Opening all repositories in a live server may be
+        // wasteful; see if we can determine which ones it is safe to close
+        // with RepositoryCache.close(repo).
+        try (Repository repo = repoManager.openRepository(project);
+            ReviewDb db = schemaFactory.open()) {
           Map<String, Ref> refs = repo.getRefDatabase().getRefs(ALL);
-          db = schemaFactory.open();
           for (Change c : changeCache.get(project)) {
             Ref r = refs.get(c.currentPatchSetId().toRefName());
             if (r != null) {
@@ -256,16 +256,6 @@
               verboseWriter).call();
         } catch (RepositoryNotFoundException rnfe) {
           log.error(rnfe.getMessage());
-        } finally {
-          if (db != null) {
-            db.close();
-          }
-          if (repo != null) {
-            repo.close();
-          }
-          // TODO(dborowitz): Opening all repositories in a live server may be
-          // wasteful; see if we can determine which ones it is safe to close
-          // with RepositoryCache.close(repo).
         }
         return null;
       }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java
index 689c596..9bb0816 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java
@@ -406,27 +406,23 @@
     TemporaryBuffer.Heap buf =
         new TemporaryBuffer.Heap(Math.min(HEAP_EST_SIZE, maxSize), maxSize);
     try (DiffFormatter fmt = new DiffFormatter(buf)) {
-      Repository git;
-      try {
-        git = args.server.openRepository(change.getProject());
+      try (Repository git = args.server.openRepository(change.getProject())) {
+        try {
+          fmt.setRepository(git);
+          fmt.setDetectRenames(true);
+          fmt.format(patchList.getOldId(), patchList.getNewId());
+          return RawParseUtils.decode(buf.toByteArray());
+        } catch (IOException e) {
+          if (JGitText.get().inMemoryBufferLimitExceeded.equals(e.getMessage())) {
+            return "";
+          }
+          log.error("Cannot format patch", e);
+          return "";
+        }
       } catch (IOException e) {
         log.error("Cannot open repository to format patch", e);
         return "";
       }
-      try {
-        fmt.setRepository(git);
-        fmt.setDetectRenames(true);
-        fmt.format(patchList.getOldId(), patchList.getNewId());
-        return RawParseUtils.decode(buf.toByteArray());
-      } catch (IOException e) {
-        if (JGitText.get().inMemoryBufferLimitExceeded.equals(e.getMessage())) {
-          return "";
-        }
-        log.error("Cannot format patch", e);
-        return "";
-      } finally {
-        git.close();
-      }
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
index 8147cff..3d0041c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
@@ -116,8 +116,7 @@
 
   public String getInlineComments(int lines) {
     StringBuilder cmts = new StringBuilder();
-    final Repository repo = getRepository();
-    try {
+    try (Repository repo = getRepository()) {
       PatchList patchList = null;
       if (repo != null) {
         try {
@@ -164,10 +163,6 @@
         }
         cmts.append("\n\n");
       }
-    } finally {
-      if (repo != null) {
-        repo.close();
-      }
     }
     return cmts.toString();
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/SmtpEmailSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/SmtpEmailSender.java
index 2f8f75d..9baada5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/SmtpEmailSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/SmtpEmailSender.java
@@ -192,8 +192,8 @@
           }
         }
 
-        Writer w = client.sendMessageData();
-        if (w == null) {
+        Writer messageDataWriter = client.sendMessageData();
+        if (messageDataWriter == null) {
           /* Include rejected recipient error messages here to not lose that
            * information. That piece of the puzzle is vital if zero recipients
            * are accepted and the server consequently rejects the DATA command.
@@ -201,21 +201,20 @@
           throw new EmailException(rejected + "Server " + smtpHost
               + " rejected DATA command: " + client.getReplyString());
         }
-        w = new BufferedWriter(w);
-
-        for (Map.Entry<String, EmailHeader> h : hdrs.entrySet()) {
-          if (!h.getValue().isEmpty()) {
-            w.write(h.getKey());
-            w.write(": ");
-            h.getValue().write(w);
-            w.write("\r\n");
+        try (Writer w = new BufferedWriter(messageDataWriter)) {
+          for (Map.Entry<String, EmailHeader> h : hdrs.entrySet()) {
+            if (!h.getValue().isEmpty()) {
+              w.write(h.getKey());
+              w.write(": ");
+              h.getValue().write(w);
+              w.write("\r\n");
+            }
           }
-        }
 
-        w.write("\r\n");
-        w.write(body);
-        w.flush();
-        w.close();
+          w.write("\r\n");
+          w.write(body);
+          w.flush();
+        }
 
         if (!client.completePendingCommand()) {
           throw new EmailException("Server " + smtpHost
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
index 75cf81c..b1ca9e7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
@@ -54,19 +54,11 @@
       loadDefaults();
       return self();
     }
-    Repository repo;
-    try {
-      repo = repoManager.openMetadataRepository(getProjectName());
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-    try {
+    try (Repository repo = repoManager.openMetadataRepository(getProjectName())) {
       load(repo);
       loaded = true;
     } catch (ConfigInvalidException | IOException e) {
       throw new OrmException(e);
-    } finally {
-      repo.close();
     }
     return self();
   }
@@ -77,15 +69,9 @@
     } else if (!migration.enabled()) {
       return null;
     }
-    Repository repo;
-    try {
-      repo = repoManager.openMetadataRepository(getProjectName());
-      try {
-        Ref ref = repo.getRefDatabase().exactRef(getRefName());
-        return ref != null ? ref.getObjectId() : null;
-      } finally {
-        repo.close();
-      }
+    try (Repository repo = repoManager.openMetadataRepository(getProjectName())) {
+      Ref ref = repo.getRefDatabase().exactRef(getRefName());
+      return ref != null ? ref.getObjectId() : null;
     } catch (IOException e) {
       throw new OrmException(e);
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
index fbca668..96322d2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
@@ -93,13 +93,10 @@
 
   private void load() throws IOException {
     if (migration.writeChanges() && getRevision() == null) {
-      Repository repo = repoManager.openMetadataRepository(getProjectName());
-      try {
+      try (Repository repo = repoManager.openMetadataRepository(getProjectName())) {
         load(repo);
       } catch (ConfigInvalidException e) {
         throw new IOException(e);
-      } finally {
-        repo.close();
       }
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentsInNotesUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentsInNotesUtil.java
index b3bbbb4..e65f8e82 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentsInNotesUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentsInNotesUtil.java
@@ -439,82 +439,82 @@
   public byte[] buildNote(List<PatchLineComment> comments) {
     ByteArrayOutputStream buf = new ByteArrayOutputStream();
     OutputStreamWriter streamWriter = new OutputStreamWriter(buf, UTF_8);
-    PrintWriter writer = new PrintWriter(streamWriter);
-    PatchLineComment first = comments.get(0);
+    try (PrintWriter writer = new PrintWriter(streamWriter)) {
+      PatchLineComment first = comments.get(0);
 
-    short side = first.getSide();
-    PatchSet.Id psId = PatchLineCommentsUtil.getCommentPsId(first);
-    appendHeaderField(writer, side == 0
-        ? BASE_PATCH_SET
-        : PATCH_SET,
-        Integer.toString(psId.get()));
-    appendHeaderField(writer, REVISION, first.getRevId().get());
+      short side = first.getSide();
+      PatchSet.Id psId = PatchLineCommentsUtil.getCommentPsId(first);
+      appendHeaderField(writer, side == 0
+          ? BASE_PATCH_SET
+          : PATCH_SET,
+          Integer.toString(psId.get()));
+      appendHeaderField(writer, REVISION, first.getRevId().get());
 
-    String currentFilename = null;
+      String currentFilename = null;
 
-    for (PatchLineComment c : comments) {
-      PatchSet.Id currentPsId = PatchLineCommentsUtil.getCommentPsId(c);
-      checkArgument(psId.equals(currentPsId),
-          "All comments being added must all have the same PatchSet.Id. The"
-          + "comment below does not have the same PatchSet.Id as the others "
-          + "(%s).\n%s", psId.toString(), c.toString());
-      checkArgument(side == c.getSide(),
-          "All comments being added must all have the same side. The"
-          + "comment below does not have the same side as the others "
-          + "(%s).\n%s", side, c.toString());
-      String commentFilename =
-          QuotedString.GIT_PATH.quote(c.getKey().getParentKey().getFileName());
+      for (PatchLineComment c : comments) {
+        PatchSet.Id currentPsId = PatchLineCommentsUtil.getCommentPsId(c);
+        checkArgument(psId.equals(currentPsId),
+            "All comments being added must all have the same PatchSet.Id. The"
+            + "comment below does not have the same PatchSet.Id as the others "
+            + "(%s).\n%s", psId.toString(), c.toString());
+        checkArgument(side == c.getSide(),
+            "All comments being added must all have the same side. The"
+            + "comment below does not have the same side as the others "
+            + "(%s).\n%s", side, c.toString());
+        String commentFilename =
+            QuotedString.GIT_PATH.quote(c.getKey().getParentKey().getFileName());
 
-      if (!commentFilename.equals(currentFilename)) {
-        currentFilename = commentFilename;
-        writer.print("File: ");
-        writer.print(commentFilename);
+        if (!commentFilename.equals(currentFilename)) {
+          currentFilename = commentFilename;
+          writer.print("File: ");
+          writer.print(commentFilename);
+          writer.print("\n\n");
+        }
+
+        // The CommentRange field for a comment is allowed to be null.
+        // If it is indeed null, then in the first line, we simply use the line
+        // number field for a comment instead. If it isn't null, we write the
+        // comment range itself.
+        CommentRange range = c.getRange();
+        if (range != null) {
+          writer.print(range.getStartLine());
+          writer.print(':');
+          writer.print(range.getStartCharacter());
+          writer.print('-');
+          writer.print(range.getEndLine());
+          writer.print(':');
+          writer.print(range.getEndCharacter());
+        } else {
+          writer.print(c.getLine());
+        }
+        writer.print("\n");
+
+        writer.print(formatTime(serverIdent, c.getWrittenOn()));
+        writer.print("\n");
+
+        PersonIdent ident =
+            newIdent(accountCache.get(c.getAuthor()).getAccount(),
+                c.getWrittenOn());
+        String nameString = ident.getName() + " <" + ident.getEmailAddress()
+            + ">";
+        appendHeaderField(writer, AUTHOR, nameString);
+
+        String parent = c.getParentUuid();
+        if (parent != null) {
+          appendHeaderField(writer, PARENT, parent);
+        }
+
+        appendHeaderField(writer, UUID, c.getKey().get());
+
+        byte[] messageBytes = c.getMessage().getBytes(UTF_8);
+        appendHeaderField(writer, LENGTH,
+            Integer.toString(messageBytes.length));
+
+        writer.print(c.getMessage());
         writer.print("\n\n");
       }
-
-      // The CommentRange field for a comment is allowed to be null.
-      // If it is indeed null, then in the first line, we simply use the line
-      // number field for a comment instead. If it isn't null, we write the
-      // comment range itself.
-      CommentRange range = c.getRange();
-      if (range != null) {
-        writer.print(range.getStartLine());
-        writer.print(':');
-        writer.print(range.getStartCharacter());
-        writer.print('-');
-        writer.print(range.getEndLine());
-        writer.print(':');
-        writer.print(range.getEndCharacter());
-      } else {
-        writer.print(c.getLine());
-      }
-      writer.print("\n");
-
-      writer.print(formatTime(serverIdent, c.getWrittenOn()));
-      writer.print("\n");
-
-      PersonIdent ident =
-          newIdent(accountCache.get(c.getAuthor()).getAccount(),
-              c.getWrittenOn());
-      String nameString = ident.getName() + " <" + ident.getEmailAddress()
-          + ">";
-      appendHeaderField(writer, AUTHOR, nameString);
-
-      String parent = c.getParentUuid();
-      if (parent != null) {
-        appendHeaderField(writer, PARENT, parent);
-      }
-
-      appendHeaderField(writer, UUID, c.getKey().get());
-
-      byte[] messageBytes = c.getMessage().getBytes(UTF_8);
-      appendHeaderField(writer, LENGTH,
-          Integer.toString(messageBytes.length));
-
-      writer.print(c.getMessage());
-      writer.print("\n\n");
     }
-    writer.close();
     return buf.toByteArray();
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java
index 4fff619..5f6113f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java
@@ -163,8 +163,7 @@
 
   private void writeObject(final ObjectOutputStream output) throws IOException {
     final ByteArrayOutputStream buf = new ByteArrayOutputStream();
-    final DeflaterOutputStream out = new DeflaterOutputStream(buf);
-    try {
+    try (DeflaterOutputStream out = new DeflaterOutputStream(buf)) {
       writeCanBeNull(out, oldId);
       writeNotNull(out, newId);
       writeVarInt32(out, againstParent ? 1 : 0);
@@ -174,16 +173,13 @@
       for (PatchListEntry p : patches) {
         p.writeTo(out);
       }
-    } finally {
-      out.close();
     }
     writeBytes(output, buf.toByteArray());
   }
 
   private void readObject(final ObjectInputStream input) throws IOException {
     final ByteArrayInputStream buf = new ByteArrayInputStream(readBytes(input));
-    final InflaterInputStream in = new InflaterInputStream(buf);
-    try {
+    try (InflaterInputStream in = new InflaterInputStream(buf)) {
       oldId = readCanBeNull(in);
       newId = readNotNull(in);
       againstParent = readVarInt32(in) != 0;
@@ -195,8 +191,6 @@
         all[i] = PatchListEntry.readFrom(in);
       }
       patches = all;
-    } finally {
-      in.close();
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java
index f29953c..bcdcda1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java
@@ -106,11 +106,8 @@
   @Override
   public PatchList load(final PatchListKey key) throws IOException,
       PatchListNotAvailableException {
-    final Repository repo = repoManager.openRepository(key.projectKey);
-    try {
+    try (Repository repo = repoManager.openRepository(key.projectKey)) {
       return readPatchList(key, repo);
-    } finally {
-      repo.close();
     }
   }
 
@@ -384,11 +381,8 @@
             fmt.formatMerge(buf, p, "BASE", oursName, theirsName, "UTF-8");
             buf.close();
 
-            InputStream in = buf.openInputStream();
-            try {
+            try (InputStream in = buf.openInputStream()) {
               resolved.put(entry.getKey(), ins.insert(Constants.OBJ_BLOB, buf.length(), in));
-            } finally {
-              in.close();
             }
           } finally {
             buf.destroy();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java
index 3bdb6b2..acea515 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java
@@ -155,9 +155,25 @@
       throw new NoSuchChangeException(changeId);
     }
 
-    final Repository git;
-    try {
-      git = repoManager.openRepository(projectKey);
+    try (Repository git = repoManager.openRepository(projectKey)) {
+      try {
+        final PatchList list = listFor(keyFor(diffPrefs.getIgnoreWhitespace()));
+        final PatchScriptBuilder b = newBuilder(list, git);
+        final PatchListEntry content = list.get(fileName);
+
+        loadCommentsAndHistory(content.getChangeType(), //
+            content.getOldName(), //
+            content.getNewName());
+
+        return b.toPatchScript(content, comments, history);
+      } catch (PatchListNotAvailableException e) {
+        throw new NoSuchChangeException(changeId, e);
+      } catch (IOException e) {
+        log.error("File content unavailable", e);
+        throw new NoSuchChangeException(changeId, e);
+      } catch (org.eclipse.jgit.errors.LargeObjectException err) {
+        throw new LargeObjectException("File content is too large", err);
+      }
     } catch (RepositoryNotFoundException e) {
       log.error("Repository " + projectKey + " not found", e);
       throw new NoSuchChangeException(changeId, e);
@@ -165,26 +181,6 @@
       log.error("Cannot open repository " + projectKey, e);
       throw new NoSuchChangeException(changeId, e);
     }
-    try {
-      final PatchList list = listFor(keyFor(diffPrefs.getIgnoreWhitespace()));
-      final PatchScriptBuilder b = newBuilder(list, git);
-      final PatchListEntry content = list.get(fileName);
-
-      loadCommentsAndHistory(content.getChangeType(), //
-          content.getOldName(), //
-          content.getNewName());
-
-      return b.toPatchScript(content, comments, history);
-    } catch (PatchListNotAvailableException e) {
-      throw new NoSuchChangeException(changeId, e);
-    } catch (IOException e) {
-      log.error("File content unavailable", e);
-      throw new NoSuchChangeException(changeId, e);
-    } catch (org.eclipse.jgit.errors.LargeObjectException err) {
-      throw new LargeObjectException("File content is too large", err);
-    } finally {
-      git.close();
-    }
   }
 
   private PatchListKey keyFor(final Whitespace whitespace) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
index 1e4ffce..83856db 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
@@ -79,13 +79,8 @@
 
   public PatchSetInfo get(Change change, PatchSet patchSet)
       throws PatchSetInfoNotAvailableException {
-    Repository repo;
-    try {
-      repo = repoManager.openRepository(change.getProject());
-    } catch (IOException e) {
-      throw new PatchSetInfoNotAvailableException(e);
-    }
-    try (RevWalk rw = new RevWalk(repo)) {
+    try (Repository repo = repoManager.openRepository(change.getProject());
+        RevWalk rw = new RevWalk(repo)) {
       final RevCommit src =
           rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get()));
       PatchSetInfo info = get(src, patchSet.getId());
@@ -93,8 +88,6 @@
       return info;
     } catch (IOException e) {
       throw new PatchSetInfoNotAvailableException(e);
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
index 0f4aa6c..6eb336d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
@@ -185,11 +185,8 @@
   private static byte[] read(JarFile jarFile, JarEntry entry)
       throws IOException {
     byte[] data = new byte[(int) entry.getSize()];
-    InputStream in = jarFile.getInputStream(entry);
-    try {
+    try (InputStream in = jarFile.getInputStream(entry)) {
       IO.readFully(in, data, 0, data.length);
-    } finally {
-      in.close();
     }
     return data;
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java
index 0c3766d..b9768bc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java
@@ -117,8 +117,7 @@
 
     final Branch.NameKey name = new Branch.NameKey(rsrc.getNameKey(), ref);
     final RefControl refControl = rsrc.getControl().controlForRef(name);
-    final Repository repo = repoManager.openRepository(rsrc.getNameKey());
-    try {
+    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
       final ObjectId revid = parseBaseRevision(repo, rsrc.getNameKey(), input.revision);
       final RevWalk rw = verifyConnected(repo, revid);
       RevObject object = rw.parseAny(revid);
@@ -184,8 +183,6 @@
       }
     } catch (InvalidRevisionException e) {
       throw new BadRequestException("invalid revision \"" + input.revision + "\"");
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
index 0abffde..ba0220b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
@@ -229,8 +229,7 @@
       final String head =
           args.permissionsOnly ? RefNames.REFS_CONFIG
               : args.branch.get(0);
-      Repository repo = repoManager.createRepository(nameKey);
-      try {
+      try (Repository repo = repoManager.createRepository(nameKey)) {
         NewProjectCreatedListener.Event event = new NewProjectCreatedListener.Event() {
           @Override
           public String getProjectName() {
@@ -262,8 +261,6 @@
         }
 
         return projectCache.get(nameKey).getProject();
-      } finally {
-        repo.close();
       }
     } catch (RepositoryCaseMismatchException e) {
       throw new ResourceConflictException("Cannot create " + nameKey.get()
@@ -273,16 +270,11 @@
     } catch (RepositoryNotFoundException badName) {
       throw new BadRequestException("invalid project name: " + nameKey);
     } catch (IllegalStateException err) {
-      try {
-        Repository repo = repoManager.openRepository(nameKey);
-        try {
-          if (repo.getObjectDatabase().exists()) {
-            throw new ResourceConflictException("project \"" + nameKey + "\" exists");
-          }
-          throw err;
-        } finally {
-          repo.close();
+      try (Repository repo = repoManager.openRepository(nameKey)) {
+        if (repo.getObjectDatabase().exists()) {
+          throw new ResourceConflictException("project \"" + nameKey + "\" exists");
         }
+        throw err;
       } catch (IOException ioErr) {
         String msg = "Cannot create " + nameKey;
         log.error(msg, err);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java
index 7822fa6..665d5ad 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java
@@ -132,21 +132,15 @@
       throw new ResourceNotFoundException(id);
     }
 
-    Repository git;
-    try {
-      git = gitManager.openRepository(ctl.getProject().getNameKey());
-    } catch (RepositoryNotFoundException e) {
-      throw new ResourceNotFoundException(id);
-    }
-    try {
+    try (Repository git = gitManager.openRepository(ctl.getProject().getNameKey())) {
       ObjectId objId = git.resolve(ref + ":" + path);
       if (objId == null) {
         throw new ResourceNotFoundException(id);
       }
       BlobBasedConfig cfg = new BlobBasedConfig(null, git, objId);
       return new DashboardResource(myCtl, ref, path, cfg, false);
-    } finally {
-      git.close();
+    } catch (RepositoryNotFoundException e) {
+      throw new ResourceNotFoundException(id);
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java
index 202dc0e..2aa6b0b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java
@@ -82,8 +82,7 @@
           + " has open changes");
     }
 
-    Repository r = repoManager.openRepository(rsrc.getNameKey());
-    try {
+    try (Repository r = repoManager.openRepository(rsrc.getNameKey())) {
       RefUpdate.Result result;
       RefUpdate u = r.updateRef(rsrc.getRef());
       u.setForceUpdate(true);
@@ -129,8 +128,6 @@
           log.error("Cannot delete " + rsrc.getBranchKey() + ": " + result.name());
           throw new ResourceConflictException("cannot delete branch: " + result.name());
       }
-    } finally {
-      r.close();
     }
     return Response.none();
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java
index fc34917..e420771 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java
@@ -93,8 +93,7 @@
   public Response<?> apply(ProjectResource project, Input input)
       throws OrmException, IOException, ResourceConflictException {
     input = Input.init(input);
-    Repository r = repoManager.openRepository(project.getNameKey());
-    try {
+    try (Repository r = repoManager.openRepository(project.getNameKey())) {
       BatchRefUpdate batchUpdate = r.getRefDatabase().newBatchUpdate();
       for (String branch : input.branches) {
         batchUpdate.addCommand(createDeleteCommand(project, r, branch));
@@ -113,8 +112,6 @@
       if (errorMessages.length() > 0) {
         throw new ResourceConflictException(errorMessages.toString());
       }
-    } finally {
-      r.close();
     }
     return Response.none();
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java
index 7e52381..41d4f94 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java
@@ -78,8 +78,7 @@
       throw new AuthException("not project owner");
     }
 
-    Repository repo = repoManager.openRepository(rsrc.getNameKey());
-    try {
+    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
       ReflogReader r = repo.getReflogReader(rsrc.getRef());
       if (r == null) {
         throw new ResourceNotFoundException(rsrc.getRef());
@@ -108,8 +107,6 @@
         public ReflogEntryInfo apply(ReflogEntry e) {
           return new ReflogEntryInfo(e);
         }});
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java
index 2b9d11f..afbf51b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java
@@ -45,18 +45,13 @@
   @Override
   public RepositoryStatistics apply(ProjectResource rsrc)
       throws ResourceNotFoundException, ResourceConflictException {
-    try {
-      Repository repo = repoManager.openRepository(rsrc.getNameKey());
-      try {
-        GarbageCollectCommand gc = Git.wrap(repo).gc();
-        return new RepositoryStatistics(gc.getStatistics());
-      } catch (GitAPIException e) {
-        throw new ResourceConflictException(e.getMessage());
-      } catch (JGitInternalException e) {
-        throw new ResourceConflictException(e.getMessage());
-      } finally {
-        repo.close();
-      }
+    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
+      GarbageCollectCommand gc = Git.wrap(repo).gc();
+      return new RepositoryStatistics(gc.getStatistics());
+    } catch (GitAPIException e) {
+      throw new ResourceConflictException(e.getMessage());
+    } catch (JGitInternalException e) {
+      throw new ResourceConflictException(e.getMessage());
     } catch (IOException e) {
       throw new ResourceNotFoundException(rsrc.getName());
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
index 70613dc..04058f2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
@@ -343,8 +343,7 @@
 
           try {
             if (!showBranch.isEmpty()) {
-              Repository git = repoManager.openRepository(projectName);
-              try {
+              try (Repository git = repoManager.openRepository(projectName)) {
                 if (!type.matches(git)) {
                   continue;
                 }
@@ -363,17 +362,12 @@
                     info.branches.put(showBranch.get(i), ref.getObjectId().name());
                   }
                 }
-              } finally {
-                git.close();
               }
             } else if (!showTree && type != FilterType.ALL) {
-              Repository git = repoManager.openRepository(projectName);
-              try {
+              try (Repository git = repoManager.openRepository(projectName)) {
                 if (!type.matches(git)) {
                   continue;
                 }
-              } finally {
-                git.close();
               }
             }
 
@@ -511,20 +505,15 @@
   private List<Ref> getBranchRefs(Project.NameKey projectName,
       ProjectControl projectControl) {
     Ref[] result = new Ref[showBranch.size()];
-    try {
-      Repository git = repoManager.openRepository(projectName);
-      try {
-        for (int i = 0; i < showBranch.size(); i++) {
-          Ref ref = git.getRef(showBranch.get(i));
-          if (ref != null
-            && ref.getObjectId() != null
-            && (projectControl.controlForRef(ref.getLeaf().getName()).isVisible())
-                || (all && projectControl.isOwner())) {
-            result[i] = ref;
-          }
+    try (Repository git = repoManager.openRepository(projectName)) {
+      for (int i = 0; i < showBranch.size(); i++) {
+        Ref ref = git.getRef(showBranch.get(i));
+        if (ref != null
+          && ref.getObjectId() != null
+          && (projectControl.controlForRef(ref.getLeaf().getName()).isVisible())
+              || (all && projectControl.isOwner())) {
+          result[i] = ref;
         }
-      } finally {
-        git.close();
       }
     } catch (IOException ioe) {
       // Fall through and return what is available.
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java
index 6a76a69..1c140e3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java
@@ -69,9 +69,7 @@
       ResourceNotFoundException {
     List<TagInfo> tags = Lists.newArrayList();
 
-    Repository repo = getRepository(resource.getNameKey());
-
-    try {
+    try (Repository repo = getRepository(resource.getNameKey())) {
       RevWalk rw = new RevWalk(repo);
       try {
         Map<String, Ref> all = visibleTags(resource.getControl(), repo,
@@ -82,8 +80,6 @@
       } finally {
         rw.dispose();
       }
-    } finally {
-      repo.close();
     }
 
     Collections.sort(tags, new Comparator<TagInfo>() {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
index 3b2dfbc..ad94d64 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
@@ -288,13 +288,10 @@
     @Override
     public ProjectState load(String projectName) throws Exception {
       Project.NameKey key = new Project.NameKey(projectName);
-      Repository git = mgr.openRepository(key);
-      try {
+      try (Repository git = mgr.openRepository(key)) {
         ProjectConfig cfg = new ProjectConfig(key);
         cfg.load(git);
         return projectStateFactory.create(cfg);
-      } finally {
-        git.close();
       }
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
index 3bbcf71..b782e3d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
@@ -535,14 +535,9 @@
   }
 
   public boolean canReadCommit(ReviewDb db, RevWalk rw, RevCommit commit) {
-    try {
-      Repository repo = openRepository();
-      try {
-        return isMergedIntoVisibleRef(repo, db, rw, commit,
-            repo.getAllRefs().values());
-      } finally {
-        repo.close();
-      }
+    try (Repository repo = openRepository()) {
+      return isMergedIntoVisibleRef(repo, db, rw, commit,
+          repo.getAllRefs().values());
     } catch (IOException e) {
       String msg = String.format(
           "Cannot verify permissions to commit object %s in repository %s",
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
index 128da4a..2f031a0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
@@ -163,17 +163,12 @@
   }
 
   private boolean isRevisionOutOfDate() {
-    try {
-      Repository git = gitMgr.openRepository(getProject().getNameKey());
-      try {
-        Ref ref = git.getRefDatabase().exactRef(RefNames.REFS_CONFIG);
-        if (ref == null || ref.getObjectId() == null) {
-          return true;
-        }
-        return !ref.getObjectId().equals(config.getRevision());
-      } finally {
-        git.close();
+    try (Repository git = gitMgr.openRepository(getProject().getNameKey())) {
+      Ref ref = git.getRefDatabase().exactRef(RefNames.REFS_CONFIG);
+      if (ref == null || ref.getObjectId() == null) {
+        return true;
       }
+      return !ref.getObjectId().equals(config.getRevision());
     } catch (IOException gone) {
       return true;
     }
@@ -228,13 +223,8 @@
     }
 
     ProjectLevelConfig cfg = new ProjectLevelConfig(fileName, this);
-    try {
-      Repository git = gitMgr.openRepository(getProject().getNameKey());
-      try {
-        cfg.load(git);
-      } finally {
-        git.close();
-      }
+    try (Repository git = gitMgr.openRepository(getProject().getNameKey())) {
+      cfg.load(git);
     } catch (IOException e) {
       log.warn("Failed to load " + fileName + " for " + getProject().getName(), e);
     } catch (ConfigInvalidException e) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
index e507de7..cfabf13 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
@@ -328,17 +328,12 @@
 
   private boolean isMergedIntoBranchOrTag(ReviewDb db, RevWalk rw,
       RevCommit commit) {
-    try {
-      Repository repo = projectControl.openRepository();
-      try {
-        List<Ref> refs = new ArrayList<>(
-            repo.getRefDatabase().getRefs(Constants.R_HEADS).values());
-        refs.addAll(repo.getRefDatabase().getRefs(Constants.R_TAGS).values());
-        return projectControl.isMergedIntoVisibleRef(
-            repo, db, rw, commit, refs);
-      } finally {
-        repo.close();
-      }
+    try (Repository repo = projectControl.openRepository()) {
+      List<Ref> refs = new ArrayList<>(
+          repo.getRefDatabase().getRefs(Constants.R_HEADS).values());
+      refs.addAll(repo.getRefDatabase().getRefs(Constants.R_TAGS).values());
+      return projectControl.isMergedIntoVisibleRef(
+          repo, db, rw, commit, refs);
     } catch (IOException e) {
       String msg = String.format(
           "Cannot verify permissions to commit object %s in repository %s",
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java
index 2e5082c..25e2db3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java
@@ -76,9 +76,7 @@
     }
     String ref = RefNames.fullName(input.ref);
 
-    Repository repo = null;
-    try {
-      repo = repoManager.openRepository(rsrc.getNameKey());
+    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
       Map<String, Ref> cur =
           repo.getRefDatabase().exactRef(Constants.HEAD, ref);
       if (!cur.containsKey(ref)) {
@@ -129,10 +127,6 @@
       return ref;
     } catch (RepositoryNotFoundException e) {
       throw new ResourceNotFoundException(rsrc.getName());
-    } finally {
-      if (repo != null) {
-        repo.close();
-      }
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java
index fe5b992..a859fb3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java
@@ -90,8 +90,7 @@
   }
 
   public void update(final UpdateUI ui) throws OrmException {
-    final ReviewDb db = schema.open();
-    try {
+    try (ReviewDb db = schema.open()) {
       final SchemaVersion u = updater.get();
       final CurrentSchemaVersion version = getSchemaVersion(db);
       if (version == null) {
@@ -112,8 +111,6 @@
 
         updateSystemConfig(db);
       }
-    } finally {
-      db.close();
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java
index c809af4..245e94d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java
@@ -48,31 +48,26 @@
 
   @Override
   public void start() {
-    try {
-      final ReviewDb db = schema.open();
-      try {
-        final CurrentSchemaVersion currentVer = getSchemaVersion(db);
-        final int expectedVer = SchemaVersion.getBinaryVersion();
+    try (ReviewDb db = schema.open()) {
+      final CurrentSchemaVersion currentVer = getSchemaVersion(db);
+      final int expectedVer = SchemaVersion.getBinaryVersion();
 
-        if (currentVer == null) {
-          throw new ProvisionException("Schema not yet initialized."
-              + "  Run init to initialize the schema:\n"
-              + "$ java -jar gerrit.war init -d "
-              + site.site_path.toAbsolutePath());
-        }
-        if (currentVer.versionNbr < expectedVer) {
-          throw new ProvisionException("Unsupported schema version "
-              + currentVer.versionNbr + "; expected schema version " + expectedVer
-              + ".  Run init to upgrade:\n"
-              + "$ java -jar " + site.gerrit_war.toAbsolutePath() + " init -d "
-              + site.site_path.toAbsolutePath());
-        } else if (currentVer.versionNbr > expectedVer) {
-          throw new ProvisionException("Unsupported schema version "
-              + currentVer.versionNbr + "; expected schema version " + expectedVer
-              + ". Downgrade is not supported.");
-        }
-      } finally {
-        db.close();
+      if (currentVer == null) {
+        throw new ProvisionException("Schema not yet initialized."
+            + "  Run init to initialize the schema:\n"
+            + "$ java -jar gerrit.war init -d "
+            + site.site_path.toAbsolutePath());
+      }
+      if (currentVer.versionNbr < expectedVer) {
+        throw new ProvisionException("Unsupported schema version "
+            + currentVer.versionNbr + "; expected schema version " + expectedVer
+            + ".  Run init to upgrade:\n"
+            + "$ java -jar " + site.gerrit_war.toAbsolutePath() + " init -d "
+            + site.site_path.toAbsolutePath());
+      } else if (currentVer.versionNbr > expectedVer) {
+        throw new ProvisionException("Unsupported schema version "
+            + currentVer.versionNbr + "; expected schema version " + expectedVer
+            + ". Downgrade is not supported.");
       }
     } catch (OrmException e) {
       throw new ProvisionException("Cannot read schema_version", e);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java
index ef7e291..ecdf28f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java
@@ -61,38 +61,33 @@
     ui.message(String.format("creating reflog files for %s branches ...",
         RefNames.REFS_CONFIG));
     for (Project.NameKey project : repoList) {
-      try {
-        Repository repo = repoManager.openRepository(project);
-        try {
-          File metaConfigLog =
-              new File(repo.getDirectory(), "logs/" + RefNames.REFS_CONFIG);
-          if (metaConfigLog.exists()) {
-            continue;
-          }
+      try (Repository repo = repoManager.openRepository(project)) {
+        File metaConfigLog =
+            new File(repo.getDirectory(), "logs/" + RefNames.REFS_CONFIG);
+        if (metaConfigLog.exists()) {
+          continue;
+        }
 
-          if (!metaConfigLog.getParentFile().mkdirs()
-              || !metaConfigLog.createNewFile()) {
-            throw new IOException(String.format(
-                "Failed to create reflog for %s in repository %s",
-                RefNames.REFS_CONFIG, project));
-          }
+        if (!metaConfigLog.getParentFile().mkdirs()
+            || !metaConfigLog.createNewFile()) {
+          throw new IOException(String.format(
+              "Failed to create reflog for %s in repository %s",
+              RefNames.REFS_CONFIG, project));
+        }
 
-          ObjectId metaConfigId = repo.resolve(RefNames.REFS_CONFIG);
-          if (metaConfigId != null) {
-            try (PrintWriter writer =
-                new PrintWriter(metaConfigLog, UTF_8.name())) {
-              writer.print(ObjectId.zeroId().name());
-              writer.print(" ");
-              writer.print(metaConfigId.name());
-              writer.print(" ");
-              writer.print(serverUser.toExternalString());
-              writer.print("\t");
-              writer.print("create reflog");
-              writer.println();
-            }
+        ObjectId metaConfigId = repo.resolve(RefNames.REFS_CONFIG);
+        if (metaConfigId != null) {
+          try (PrintWriter writer =
+              new PrintWriter(metaConfigLog, UTF_8.name())) {
+            writer.print(ObjectId.zeroId().name());
+            writer.print(" ");
+            writer.print(metaConfigId.name());
+            writer.print(" ");
+            writer.print(serverUser.toExternalString());
+            writer.print("\t");
+            writer.print("create reflog");
+            writer.println();
           }
-        } finally {
-          repo.close();
         }
       } catch (IOException e) {
         ui.message(String.format("ERROR: Failed to create reflog file for the"
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java
index 13ab09a..c2c2305 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java
@@ -31,11 +31,8 @@
 
   @Override
   protected void migrateData(ReviewDb db, UpdateUI ui) throws SQLException {
-    Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
-    try {
+    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement()) {
       stmt.executeUpdate("UPDATE accounts set mute_common_path_prefixes = 'Y'");
-    } finally {
-      stmt.close();
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java
index 2347f87..8ef32c0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java
@@ -73,8 +73,7 @@
   }
 
   private List<String> parse(final InputStream in) throws IOException {
-    BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
-    try {
+    try (BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"))) {
       String delimiter = ";";
       List<String> commands = new ArrayList<>();
       StringBuilder buffer = new StringBuilder();
@@ -107,8 +106,6 @@
         commands.add(buffer.toString());
       }
       return commands;
-    } finally {
-      br.close();
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java b/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java
index 3e41858..21634ac 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java
@@ -109,21 +109,15 @@
 
   private static byte[] read(String path) {
     String name = "root/" + path;
-    InputStream in = ToolsCatalog.class.getResourceAsStream(name);
-    if (in == null) {
-      return null;
-    }
-
-    try {
+    try (InputStream in = ToolsCatalog.class.getResourceAsStream(name)) {
+      if (in == null) {
+        return null;
+      }
       final ByteArrayOutputStream out = new ByteArrayOutputStream();
-      try {
-        final byte[] buf = new byte[8192];
-        int n;
-        while ((n = in.read(buf, 0, buf.length)) > 0) {
-          out.write(buf, 0, n);
-        }
-      } finally {
-        in.close();
+      final byte[] buf = new byte[8192];
+      int n;
+      while ((n = in.read(buf, 0, buf.length)) > 0) {
+        out.write(buf, 0, n);
       }
       return out.toByteArray();
     } catch (Exception e) {
diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
index 123d1ef..2ff8c4d 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
@@ -99,11 +99,10 @@
   protected void consult(BufferingPrologControl env,
       Class<?> clazz,
       String prologResource) throws CompileException, IOException {
-    InputStream in = clazz.getResourceAsStream(prologResource);
-    if (in == null) {
-      throw new FileNotFoundException(prologResource);
-    }
-    try {
+    try (InputStream in = clazz.getResourceAsStream(prologResource)) {
+      if (in == null) {
+        throw new FileNotFoundException(prologResource);
+      }
       SymbolTerm pathTerm = SymbolTerm.create(prologResource);
       JavaObjectTerm inTerm =
           new JavaObjectTerm(new PushbackReader(new BufferedReader(
@@ -111,8 +110,6 @@
       if (!env.execute(Prolog.BUILTIN, "consult_stream", pathTerm, inTerm)) {
         throw new CompileException("Cannot consult " + prologResource);
       }
-    } finally {
-      in.close();
     }
   }
 
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java
index 181ba15..b3f7894 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java
@@ -188,13 +188,10 @@
   }
 
   private ProjectConfig loadAllProjects() throws Exception {
-    Repository repo = repoManager.openRepository(allProjects);
-    try {
+    try (Repository repo = repoManager.openRepository(allProjects)) {
       ProjectConfig pc = new ProjectConfig(allProjects);
       pc.load(repo);
       return pc;
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
index 6067442..01f964b 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
@@ -444,23 +444,23 @@
       RevCommit commitWithComments = commitWithApprovals.getParent(0);
       assertThat(commitWithComments).isNotNull();
 
-      ChangeNotesParser notesWithComments =
-          new ChangeNotesParser(c, commitWithComments.copy(), rw, repoManager);
-      notesWithComments.parseAll();
-      ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals1 =
-          notesWithComments.buildApprovals();
-      assertThat(approvals1).isEmpty();
-      assertThat(notesWithComments.comments).hasSize(1);
-      notesWithComments.close();
+      try (ChangeNotesParser notesWithComments =
+          new ChangeNotesParser(c, commitWithComments.copy(), rw, repoManager)) {
+        notesWithComments.parseAll();
+        ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals1 =
+            notesWithComments.buildApprovals();
+        assertThat(approvals1).isEmpty();
+        assertThat(notesWithComments.comments).hasSize(1);
+      }
 
-      ChangeNotesParser notesWithApprovals =
-          new ChangeNotesParser(c, commitWithApprovals.copy(), rw, repoManager);
-      notesWithApprovals.parseAll();
-      ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals2 =
-          notesWithApprovals.buildApprovals();
-      assertThat(approvals2).hasSize(1);
-      assertThat(notesWithApprovals.comments).hasSize(1);
-      notesWithApprovals.close();
+      try (ChangeNotesParser notesWithApprovals =
+          new ChangeNotesParser(c, commitWithApprovals.copy(), rw, repoManager)) {
+        notesWithApprovals.parseAll();
+        ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals2 =
+            notesWithApprovals.buildApprovals();
+        assertThat(approvals2).hasSize(1);
+        assertThat(notesWithApprovals.comments).hasSize(1);
+      }
     } finally {
       batch.close();
     }
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java
index d4398cd..87b5322 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java
@@ -102,13 +102,10 @@
   private LabelTypes getLabelTypes() throws Exception {
     db.create();
     ProjectConfig c = new ProjectConfig(allProjects);
-    Repository repo = repoManager.openRepository(allProjects);
-    try {
+    try (Repository repo = repoManager.openRepository(allProjects)) {
       c.load(repo);
       return new LabelTypes(
           ImmutableList.copyOf(c.getLabelSections().values()));
-    } finally {
-      repo.close();
     }
   }
 
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
index cb65e96..458e100 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
@@ -111,17 +111,10 @@
   public InMemoryDatabase create() throws OrmException {
     if (!created) {
       created = true;
-      final ReviewDb c = open();
-      try {
-        try {
-          schemaCreator.create(c);
-        } catch (IOException e) {
-          throw new OrmException("Cannot create in-memory database", e);
-        } catch (ConfigInvalidException e) {
-          throw new OrmException("Cannot create in-memory database", e);
-        }
-      } finally {
-        c.close();
+      try (ReviewDb c = open()) {
+        schemaCreator.create(c);
+      } catch (IOException | ConfigInvalidException e) {
+        throw new OrmException("Cannot create in-memory database", e);
       }
     }
     return this;
@@ -142,20 +135,14 @@
   }
 
   public SystemConfig getSystemConfig() throws OrmException {
-    final ReviewDb c = open();
-    try {
+    try (ReviewDb c = open()) {
       return c.systemConfig().get(new SystemConfig.Key());
-    } finally {
-      c.close();
     }
   }
 
   public CurrentSchemaVersion getSchemaVersion() throws OrmException {
-    final ReviewDb c = open();
-    try {
+    try (ReviewDb c = open()) {
       return c.schemaVersion().get(new CurrentSchemaVersion.Key());
-    } finally {
-      c.close();
     }
   }
 
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
index bacb167..579c78b 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
@@ -127,8 +127,7 @@
 
     @Override
     public Iterable<SshKeyCacheEntry> load(String username) throws Exception {
-      final ReviewDb db = schema.open();
-      try {
+      try (ReviewDb db = schema.open()) {
         final AccountExternalId.Key key =
             new AccountExternalId.Key(SCHEME_USERNAME, username);
         final AccountExternalId user = db.accountExternalIds().get(key);
@@ -147,8 +146,6 @@
           return NO_KEYS;
         }
         return Collections.unmodifiableList(kl);
-      } finally {
-        db.close();
       }
     }
 
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java
index 15e030f..a70d581 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java
@@ -92,10 +92,22 @@
 
     IdentifiedUser user = userFactory.create(userAccount.getId());
     ProjectControl userProjectControl = projectControl.forUser(user);
-    Repository repo;
-    try {
-      repo = repoManager.openRepository(userProjectControl.getProject()
-              .getNameKey());
+    try (Repository repo = repoManager.openRepository(
+        userProjectControl.getProject().getNameKey())) {
+      try {
+        Map<String, Ref> refsMap =
+            new VisibleRefFilter(tagCache, changeCache, repo, userProjectControl,
+                db, true).filter(repo.getRefDatabase().getRefs(ALL), false);
+
+        for (final String ref : refsMap.keySet()) {
+          if (!onlyRefsHeads || ref.startsWith(RefNames.REFS_HEADS)) {
+            stdout.println(ref);
+          }
+        }
+      } catch (IOException e) {
+        throw new Failure(1, "fatal: Error reading refs: '"
+            + projectControl.getProject().getNameKey(), e);
+      }
     } catch (RepositoryNotFoundException e) {
       throw new UnloggedFailure("fatal: '"
           + projectControl.getProject().getNameKey() + "': not a git archive");
@@ -103,22 +115,5 @@
       throw new UnloggedFailure("fatal: Error opening: '"
           + projectControl.getProject().getNameKey());
     }
-
-    try {
-      Map<String, Ref> refsMap =
-          new VisibleRefFilter(tagCache, changeCache, repo, userProjectControl,
-              db, true).filter(repo.getRefDatabase().getRefs(ALL), false);
-
-      for (final String ref : refsMap.keySet()) {
-        if (!onlyRefsHeads || ref.startsWith(RefNames.REFS_HEADS)) {
-          stdout.println(ref);
-        }
-      }
-    } catch (IOException e) {
-      throw new Failure(1, "fatal: Error reading refs: '"
-          + projectControl.getProject().getNameKey(), e);
-    } finally {
-      repo.close();
-    }
   }
 }
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java
index 929f7ea..379ee4b 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java
@@ -171,11 +171,10 @@
           throw new Failure(5, "fatal: cannot perform upload-archive operation");
       }
 
-      try {
         // The archive is sent in DATA sideband channel
-        SideBandOutputStream sidebandOut =
+      try (SideBandOutputStream sidebandOut =
             new SideBandOutputStream(SideBandOutputStream.CH_DATA,
-                SideBandOutputStream.MAX_BUF, out);
+                SideBandOutputStream.MAX_BUF, out)) {
         new ArchiveCommand(repo)
             .setFormat(f.name())
             .setFormatOptions(getFormatOptions(f))
@@ -185,18 +184,17 @@
             .setOutputStream(sidebandOut)
             .call();
         sidebandOut.flush();
-        sidebandOut.close();
       } catch (GitAPIException e) {
         throw new Failure(7, "fatal: git api exception, " + e);
       }
     } catch (Failure f) {
       // Report the error in ERROR sideband channel
-      SideBandOutputStream sidebandError =
+      try (SideBandOutputStream sidebandError =
           new SideBandOutputStream(SideBandOutputStream.CH_ERROR,
-              SideBandOutputStream.MAX_BUF, out);
-      sidebandError.write(f.getMessage().getBytes(UTF_8));
-      sidebandError.flush();
-      sidebandError.close();
+              SideBandOutputStream.MAX_BUF, out)) {
+        sidebandError.write(f.getMessage().getBytes(UTF_8));
+        sidebandError.flush();
+      }
       throw f;
     } finally {
       // In any case, cleanly close the packetOut channel
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java
index 60f389e..33f9ae3 100644
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java
+++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java
@@ -43,8 +43,7 @@
 
   private static Path read(SchemaFactory<ReviewDb> schemaFactory)
       throws OrmException {
-    ReviewDb db = schemaFactory.open();
-    try {
+    try (ReviewDb db = schemaFactory.open()) {
       List<SystemConfig> all = db.systemConfig().all().toList();
       switch (all.size()) {
         case 1:
@@ -55,8 +54,6 @@
           throw new OrmException("system_config must have exactly 1 row;"
               + " found " + all.size() + " rows instead");
       }
-    } finally {
-      db.close();
     }
   }
 }
diff --git a/lib/asciidoctor/java/AsciiDoctor.java b/lib/asciidoctor/java/AsciiDoctor.java
index c7562df..dce939d 100644
--- a/lib/asciidoctor/java/AsciiDoctor.java
+++ b/lib/asciidoctor/java/AsciiDoctor.java
@@ -132,31 +132,31 @@
       return;
     }
 
-    ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile));
-    for (String inputFile : inputFiles) {
-      if (!inputFile.endsWith(inExt)) {
-        // We have to use UNSAFE mode in order to make embedding work. But in
-        // UNSAFE mode we'll also need css file in the same directory, so we
-        // have to add css files into the SRCS.
-        continue;
-      }
+    try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile))) {
+      for (String inputFile : inputFiles) {
+        if (!inputFile.endsWith(inExt)) {
+          // We have to use UNSAFE mode in order to make embedding work. But in
+          // UNSAFE mode we'll also need css file in the same directory, so we
+          // have to add css files into the SRCS.
+          continue;
+        }
 
-      String outName = mapInFileToOutFile(inputFile, inExt, outExt);
-      File out = new File(tmpdir, outName);
-      out.getParentFile().mkdirs();
-      Options options = createOptions(out);
-      renderInput(options, new File(inputFile));
-      zipFile(out, outName, zip);
+        String outName = mapInFileToOutFile(inputFile, inExt, outExt);
+        File out = new File(tmpdir, outName);
+        out.getParentFile().mkdirs();
+        Options options = createOptions(out);
+        renderInput(options, new File(inputFile));
+        zipFile(out, outName, zip);
+      }
     }
-    zip.close();
   }
 
   public static void zipFile(File file, String name, ZipOutputStream zip)
       throws IOException {
     zip.putNextEntry(new ZipEntry(name));
-    FileInputStream input = new FileInputStream(file);
-    ByteStreams.copy(input, zip);
-    input.close();
+    try (FileInputStream input = new FileInputStream(file)) {
+      ByteStreams.copy(input, zip);
+    }
     zip.closeEntry();
   }
 
diff --git a/lib/asciidoctor/java/DocIndexer.java b/lib/asciidoctor/java/DocIndexer.java
index f06c662..081cdd8 100644
--- a/lib/asciidoctor/java/DocIndexer.java
+++ b/lib/asciidoctor/java/DocIndexer.java
@@ -81,15 +81,15 @@
       return;
     }
 
-    byte[] compressedIndex = zip(index());
-    JarOutputStream jar = new JarOutputStream(new FileOutputStream(outFile));
-    JarEntry entry = new JarEntry(
-        String.format("%s/%s", Constants.PACKAGE, Constants.INDEX_ZIP));
-    entry.setSize(compressedIndex.length);
-    jar.putNextEntry(entry);
-    jar.write(compressedIndex);
-    jar.closeEntry();
-    jar.close();
+    try (JarOutputStream jar = new JarOutputStream(new FileOutputStream(outFile))) {
+      byte[] compressedIndex = zip(index());
+      JarEntry entry = new JarEntry(
+          String.format("%s/%s", Constants.PACKAGE, Constants.INDEX_ZIP));
+      entry.setSize(compressedIndex.length);
+      jar.putNextEntry(entry);
+      jar.write(compressedIndex);
+      jar.closeEntry();
+    }
   }
 
   private RAMDirectory index() throws IOException,
@@ -99,63 +99,60 @@
         new StandardAnalyzer(CharArraySet.EMPTY_SET));
     config.setOpenMode(OpenMode.CREATE);
     config.setCommitOnClose(true);
-    IndexWriter iwriter = new IndexWriter(directory, config);
-    for (String inputFile : inputFiles) {
-      File file = new File(inputFile);
-      if (file.length() == 0) {
-        continue;
-      }
+    try (IndexWriter iwriter = new IndexWriter(directory, config)) {
+      for (String inputFile : inputFiles) {
+        File file = new File(inputFile);
+        if (file.length() == 0) {
+          continue;
+        }
 
-      BufferedReader titleReader = new BufferedReader(
-          new InputStreamReader(new FileInputStream(file), "UTF-8"));
-      String title = titleReader.readLine();
-      if (title != null && title.startsWith("[[")) {
-        // Generally the first line of the txt is the title. In a few cases the
-        // first line is a "[[tag]]" and the second line is the title.
-        title = titleReader.readLine();
-      }
-      titleReader.close();
-      Matcher matcher = SECTION_HEADER.matcher(title);
-      if (matcher.matches()) {
-        title = matcher.group(1);
-      }
+        String title;
+        try (BufferedReader titleReader = new BufferedReader(
+            new InputStreamReader(new FileInputStream(file), "UTF-8"))) {
+          title = titleReader.readLine();
+          if (title != null && title.startsWith("[[")) {
+            // Generally the first line of the txt is the title. In a few cases the
+            // first line is a "[[tag]]" and the second line is the title.
+            title = titleReader.readLine();
+          }
+        }
+        Matcher matcher = SECTION_HEADER.matcher(title);
+        if (matcher.matches()) {
+          title = matcher.group(1);
+        }
 
-      String outputFile = AsciiDoctor.mapInFileToOutFile(
-          inputFile, inExt, outExt);
-      FileReader reader = new FileReader(file);
-      Document doc = new Document();
-      doc.add(new TextField(Constants.DOC_FIELD, reader));
-      doc.add(new StringField(
+        String outputFile = AsciiDoctor.mapInFileToOutFile(
+            inputFile, inExt, outExt);
+        try (FileReader reader = new FileReader(file)) {
+          Document doc = new Document();
+          doc.add(new TextField(Constants.DOC_FIELD, reader));
+          doc.add(new StringField(
             Constants.URL_FIELD, prefix + outputFile, Field.Store.YES));
-      doc.add(new TextField(Constants.TITLE_FIELD, title, Field.Store.YES));
-      iwriter.addDocument(doc);
-      reader.close();
+          doc.add(new TextField(Constants.TITLE_FIELD, title, Field.Store.YES));
+          iwriter.addDocument(doc);
+        }
+      }
     }
-    iwriter.close();
     return directory;
   }
 
   private byte[] zip(RAMDirectory dir) throws IOException {
     ByteArrayOutputStream buf = new ByteArrayOutputStream();
-    ZipOutputStream zip = new ZipOutputStream(buf);
-
-    for (String name : dir.listAll()) {
-      IndexInput in = dir.openInput(name, null);
-      try {
-        int len = (int) in.length();
-        byte[] tmp = new byte[len];
-        ZipEntry entry = new ZipEntry(name);
-        entry.setSize(len);
-        in.readBytes(tmp, 0, len);
-        zip.putNextEntry(entry);
-        zip.write(tmp, 0, len);
-        zip.closeEntry();
-      } finally {
-        in.close();
+    try (ZipOutputStream zip = new ZipOutputStream(buf)) {
+      for (String name : dir.listAll()) {
+        try (IndexInput in = dir.openInput(name, null)) {
+          int len = (int) in.length();
+          byte[] tmp = new byte[len];
+          ZipEntry entry = new ZipEntry(name);
+          entry.setSize(len);
+          in.readBytes(tmp, 0, len);
+          zip.putNextEntry(entry);
+          zip.write(tmp, 0, len);
+          zip.closeEntry();
+        }
       }
     }
 
-    zip.close();
     return buf.toByteArray();
   }
 
diff --git a/lib/prolog/java/BuckPrologCompiler.java b/lib/prolog/java/BuckPrologCompiler.java
index 0cbe10e..6010be2 100644
--- a/lib/prolog/java/BuckPrologCompiler.java
+++ b/lib/prolog/java/BuckPrologCompiler.java
@@ -47,11 +47,8 @@
   private static void jar(File jar, File classes) throws IOException {
     File tmp = File.createTempFile("prolog", ".jar", tmpdir);
     try {
-      JarOutputStream out = new JarOutputStream(new FileOutputStream(tmp));
-      try {
+      try (JarOutputStream out = new JarOutputStream(new FileOutputStream(tmp))) {
         add(out, classes, "");
-      } finally {
-        out.close();
       }
       if (!tmp.renameTo(jar)) {
         throw new IOException("Cannot create " + jar);