private URL extractResource(ZipEntry zipEntry) throws IOException {
        File resourceWorkDir = new File(workDir, "resources");
        if (!resourceWorkDir.exists()) {
            resourceWorkDir.mkdirs();
        }
        File resourceFile = new File(resourceWorkDir, zipEntry.getName());
        if (!resourceFile.isFile()) {
            resourceFile.getParentFile().mkdirs();
            File tmpFile = File.createTempFile("res", ".tmp", resourceWorkDir);
            tmpFile.deleteOnExit();
            copyZipEntryToTmpFile(zipEntry, tmpFile);
            tmpFile.renameTo(resourceFile);
        }
        return resourceFile.toURI().toURL();
    }
Extracts a resource from the plugin artifact ZIP and saves it to the work
directory.  If the resource has already been extracted (we're re-using the
work directory) then this simply returns what is already there.
@param zipEntry a ZIP file entry
@throws IOException if an I/O error has occurred
common/plugin/src/main/java/io/apiman/common/plugin/PluginClassLoader.java