diff --git a/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginProvider.java b/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginProvider.java
index 97bd60e..915805e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginProvider.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.scripting.groovyprovider;
 
 import com.google.common.collect.Sets;
+import com.google.common.io.Files;
 import com.google.gerrit.extensions.annotations.Listen;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.server.plugins.InvalidPluginException;
@@ -25,7 +26,7 @@
 
 import org.eclipse.jgit.internal.storage.file.FileSnapshot;
 
-import java.io.File;
+import java.nio.file.Path;
 import java.util.Set;
 
 /**
@@ -64,7 +65,7 @@
   }
 
   @Override
-  public ServerPlugin get(File srcFile, FileSnapshot snapshot,
+  public ServerPlugin get(Path srcFile, FileSnapshot snapshot,
       PluginDescription description) throws InvalidPluginException {
     GroovyPluginScriptEngine scriptEngine = scriptEngineProvider.get();
     return new ServerPlugin(getPluginName(srcFile), description.canonicalUrl,
@@ -74,16 +75,14 @@
   }
 
   @Override
-  public boolean handles(File srcFile) {
-    String srcFileName = srcFile.getName();
-    String scriptExtension =
-        srcFileName.substring(srcFileName.lastIndexOf('.') + 1).toLowerCase();
-    return GROOVY_EXTENSIONS.contains(scriptExtension.toLowerCase());
+  public boolean handles(Path srcFile) {
+    String scriptExtension = Files.getFileExtension(srcFile.toString()).toLowerCase();
+    return GROOVY_EXTENSIONS.contains(scriptExtension);
   }
 
   @Override
-  public String getPluginName(File srcFile) {
-    String srcFileName = srcFile.getName();
+  public String getPluginName(Path srcFile) {
+    String srcFileName = srcFile.getFileName().toString();
     int dashPos = srcFileName.lastIndexOf('-');
     int dotPos = srcFileName.lastIndexOf('.');
     return srcFileName.substring(0, dashPos > 0 ? dashPos:dotPos);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginScanner.java b/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginScanner.java
index 1f5f017..77bfcfd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginScanner.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginScanner.java
@@ -27,12 +27,12 @@
 
 import org.codehaus.groovy.runtime.InvokerHelper;
 
-import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -40,13 +40,13 @@
 
 public class GroovyPluginScanner extends AbstractPreloadedPluginScanner {
 
-  public GroovyPluginScanner(String pluginName, GroovyPluginScriptEngine scriptEngine, File srcFile)
+  public GroovyPluginScanner(String pluginName, GroovyPluginScriptEngine scriptEngine, Path srcFile)
       throws InvalidPluginException {
     super(pluginName, getPluginVersion(srcFile), load(scriptEngine, srcFile), ApiType.PLUGIN);
   }
 
-  private static String getPluginVersion(File srcFile) {
-    String srcFileName = srcFile.getName();
+  private static String getPluginVersion(Path srcFile) {
+    String srcFileName = srcFile.getFileName().toString();
     int dashPos = srcFileName.lastIndexOf('-');
     int dotPos = srcFileName.lastIndexOf('.');
     return dashPos > 0 ? srcFileName.substring(dashPos + 1, dotPos) : "0";
@@ -68,10 +68,9 @@
     return Collections.emptyEnumeration();
   }
 
-  public static Set<Class<?>> load(GroovyPluginScriptEngine scriptEngine, File srcFile) throws InvalidPluginException {
+  public static Set<Class<?>> load(GroovyPluginScriptEngine scriptEngine, Path srcFile) throws InvalidPluginException {
     try {
-      return scanGroovyScriptBindings(scriptEngine.loadScriptByName(srcFile
-          .getName()));
+      return scanGroovyScriptBindings(scriptEngine.loadScriptByName(srcFile.toString()));
     } catch (ResourceException | ScriptException e) {
       throw new InvalidPluginException(
           "Cannot compile and execute Groovy script " + srcFile, e);
@@ -85,7 +84,7 @@
     try {
       Method mainMethod = scriptClass.getMethod("main", String[].class);
       int modifiers = mainMethod.getModifiers();
-      if (mainMethod != null && Modifier.isPublic(modifiers)
+      if (Modifier.isPublic(modifiers)
           && Modifier.isStatic(modifiers)) {
         classes.addAll(getMainBindings(scriptClass));
       }
@@ -99,8 +98,7 @@
     return classes;
   }
 
-  private static Set<Class<?>> getMainBindings(Class<?> scriptClass)
-      throws InvalidPluginException {
+  private static Set<Class<?>> getMainBindings(Class<?> scriptClass) {
     Set<Class<?>> classes = Sets.newHashSet();
     Binding binding = new Binding();
     Script script = InvokerHelper.createScript(scriptClass, binding);
@@ -122,8 +120,7 @@
     return classes;
   }
 
-  private static Set<Class<?>> scanArrayOfObjectOrClass(Object value)
-      throws InvalidPluginException {
+  private static Set<Class<?>> scanArrayOfObjectOrClass(Object value) {
     Set<Class<?>> classes = Sets.newHashSet();
     ArrayList<?> list = (ArrayList<?>) value;
     for (Object element : list) {
@@ -135,8 +132,7 @@
     return classes;
   }
 
-  private static Class<?> scanObjectOrClass(Object element)
-      throws InvalidPluginException {
+  private static Class<?> scanObjectOrClass(Object element) {
     if (Class.class.isAssignableFrom(element.getClass())) {
       return (Class<?>) element;
     } else {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginScriptEngine.java b/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginScriptEngine.java
index e26ca86..1462bc4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginScriptEngine.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/scripting/groovyprovider/GroovyPluginScriptEngine.java
@@ -26,6 +26,6 @@
   @Inject
   public GroovyPluginScriptEngine(SitePaths sitePaths)
       throws MalformedURLException {
-    super(new URL[] {sitePaths.plugins_dir.toURI().toURL()});
+    super(new URL[] {sitePaths.plugins_dir.toUri().toURL()});
   }
 }
