mirror of https://github.com/plexusorg/Plex.git
71 lines
1.9 KiB
Java
71 lines
1.9 KiB
Java
package dev.plex.module.loader;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.net.MalformedURLException;
|
|
import java.net.URL;
|
|
import java.net.URLClassLoader;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.StandardCopyOption;
|
|
|
|
public class CustomClassLoader extends URLClassLoader
|
|
{
|
|
/*public CustomClassLoader(URL[] urls, ClassLoader parent) {
|
|
super(urls, parent);
|
|
for (URL url : urls) {
|
|
super.addURL(url);
|
|
}
|
|
}*/
|
|
|
|
public CustomClassLoader(URL jarInJar, ClassLoader parent)
|
|
{
|
|
super(new URL[]{extractJar(jarInJar)}, parent);
|
|
addURL(jarInJar);
|
|
}
|
|
|
|
|
|
static URL extractJar(URL jarInJar) throws RuntimeException
|
|
{
|
|
// get the jar-in-jar resource
|
|
if (jarInJar == null)
|
|
{
|
|
throw new RuntimeException("Could not locate jar-in-jar");
|
|
}
|
|
|
|
// create a temporary file
|
|
// on posix systems by default this is only read/writable by the process owner
|
|
Path path;
|
|
try
|
|
{
|
|
path = Files.createTempFile("plex-jarinjar", ".jar.tmp");
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
throw new RuntimeException("Unable to create a temporary file", e);
|
|
}
|
|
|
|
// mark that the file should be deleted on exit
|
|
path.toFile().deleteOnExit();
|
|
|
|
// copy the jar-in-jar to the temporary file path
|
|
try (InputStream in = jarInJar.openStream())
|
|
{
|
|
Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
throw new RuntimeException("Unable to copy jar-in-jar to temporary path", e);
|
|
}
|
|
|
|
try
|
|
{
|
|
return path.toUri().toURL();
|
|
}
|
|
catch (MalformedURLException e)
|
|
{
|
|
throw new RuntimeException("Unable to get URL from path", e);
|
|
}
|
|
}
|
|
}
|