From f2946d85aa2fc5fad15c46cf5e96a51074a5ebcd Mon Sep 17 00:00:00 2001 From: ishland Date: Sun, 4 Jul 2021 00:08:03 +0800 Subject: [PATCH] Fix fabric development environment launch --- .../com/dfsek/terra/api/util/JarUtil.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java b/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java index 981dfdb7f..8dcbff534 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java @@ -6,13 +6,21 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.Enumeration; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class JarUtil { + + private static final AtomicReference terraModJar = new AtomicReference<>(null); + public static void copyResourcesToDirectory(JarFile fromJar, String sourceDir, String destDir) throws IOException { for(Enumeration entries = fromJar.entries(); entries.hasMoreElements(); ) { JarEntry entry = entries.nextElement(); @@ -38,7 +46,28 @@ public class JarUtil { } public static JarFile getJarFile() throws URISyntaxException, IOException { - return new JarFile(new File(getJarURL().toURI())); + final File _jarFile1 = terraModJar.get(); + if(_jarFile1 != null) return new JarFile(_jarFile1); + synchronized(terraModJar) { + final File _jarFile2 = terraModJar.get(); + if(_jarFile2 != null) return new JarFile(_jarFile2); + + // uncached here + final URI jarURI = getJarURL().toURI(); + if(jarURI.getScheme() == null || !jarURI.getScheme().equalsIgnoreCase("file")) { + final File tempFile = File.createTempFile("terra-jar-" + UUID.randomUUID(), ".jar"); + try(final FileOutputStream out = new FileOutputStream(tempFile)) { + Files.copy(Paths.get(jarURI), out); + } + tempFile.deleteOnExit(); + terraModJar.set(tempFile); + return new JarFile(tempFile); + } else { + final File jarFile = new File(jarURI); + terraModJar.set(jarFile); + return new JarFile(jarFile); + } + } } public static URL getJarURL() {