- enable running project 'quck' - run the jar in the dist directory directly
- enable running any class directly without needing a jar in the first place
This commit is contained in:
@@ -2,6 +2,7 @@ package de.szimnau.zeitlaeufer;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
@@ -45,25 +46,15 @@ public class Main {
|
||||
|
||||
private static SortedMap<Integer, Class<?>> getAllrelevantClasses() {
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
List<String> fileNames = new ArrayList<>();
|
||||
URL jarUrl = classLoader.getResource("de/szimnau/zeitlaeufer");
|
||||
if (jarUrl == null) {
|
||||
URL resourceUrl = classLoader.getResource("de/szimnau/zeitlaeufer");
|
||||
if (resourceUrl == null) {
|
||||
throw new RuntimeException("Kann ausführbare Klassen nicht eruieren, da keine Ressource \"de/szimnau/zeitlaeufer\" verfügbar.");
|
||||
}
|
||||
String path = jarUrl.getPath().split(":", 2)[1];
|
||||
String cleanPath = path.substring(0, path.lastIndexOf('!'));
|
||||
Enumeration<JarEntry> entries;
|
||||
try (var jarFile = new JarFile(URLDecoder.decode(cleanPath, StandardCharsets.UTF_8))) {
|
||||
entries = jarFile.entries();
|
||||
while (entries.hasMoreElements()) {
|
||||
JarEntry entry = entries.nextElement();
|
||||
if (entry.isDirectory()) {
|
||||
continue;
|
||||
}
|
||||
fileNames.add(entry.getName());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Kann JAR-Datei zwecks Reflection nicht öffnen:", e);
|
||||
Set<String> fileNames;
|
||||
if (resourceUrl.getPath().contains(".jar")) {
|
||||
fileNames = getFileNamesStreamFromJar(resourceUrl);
|
||||
} else {
|
||||
fileNames = getFileNamesStreamFromPackage(resourceUrl);
|
||||
}
|
||||
var increment = new AtomicInteger();
|
||||
return Collections.unmodifiableSortedMap(new TreeMap<>(
|
||||
@@ -82,6 +73,39 @@ public class Main {
|
||||
}
|
||||
|
||||
|
||||
private static Set<String> getFileNamesStreamFromJar(URL resourceUrl) {
|
||||
Set<String> fileNames = new HashSet<>();
|
||||
String path = resourceUrl.getPath().split(":", 2)[1];
|
||||
String cleanPath = path.substring(0, path.lastIndexOf('!'));
|
||||
Enumeration<JarEntry> entries;
|
||||
try (var jarFile = new JarFile(URLDecoder.decode(cleanPath, StandardCharsets.UTF_8))) {
|
||||
entries = jarFile.entries();
|
||||
while (entries.hasMoreElements()) {
|
||||
JarEntry entry = entries.nextElement();
|
||||
if (entry.isDirectory()) {
|
||||
continue;
|
||||
}
|
||||
fileNames.add(entry.getName());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Kann JAR-Datei zwecks Reflection nicht öffnen:", e);
|
||||
}
|
||||
return fileNames;
|
||||
}
|
||||
|
||||
|
||||
private static Set<String> getFileNamesStreamFromPackage(URL resourceUrl) {
|
||||
try (InputStream stream = resourceUrl.openStream();
|
||||
var br = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) {
|
||||
return br.lines()
|
||||
.map(line -> "de/szimnau/zeitlaeufer." + line)
|
||||
.collect(Collectors.toSet());
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("ausführbare Klassen nicht eruieren, da Ressource " + resourceUrl + " nicht auslesbar.", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static Class<?> getClass(String className) {
|
||||
String classWithPath = className.replace("/", ".");
|
||||
return getClassForName(classWithPath.substring(0, className.lastIndexOf('.')));
|
||||
|
||||
Reference in New Issue
Block a user