- 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:
fszimnau
2025-12-03 15:13:16 +01:00
parent 8be9cf81d7
commit dc690f3350
2 changed files with 61 additions and 25 deletions

View File

@@ -2,13 +2,25 @@
set -uo pipefail set -uo pipefail
# when executed as executable file in "git for windows" bash some things won't work, so always run with prefixed command # when executed as executable file in "git for windows" bash some things won't work, so always run with prefixed command
originDir=$(pwd); jarDir=/g/zeitlaeufer/dist/;
cd /g/zeitlaeufer/; if [[ $# == 0 || ($1 != -quick && $1 != -class) ]]; then
tmpDir="/tmp/zeitlaeufer_$RANDOM"; tmpDir=/tmp/zeitlaeufer_$RANDOM;
mkdir $tmpDir; mkdir $tmpDir;
cp dist/zeitlaeufer.jar $tmpDir; cp ${jarDir}zeitlaeufer.jar $tmpDir;
cd $originDir; jarDir=$tmpDir;
elif [[ $1 == -quick ]]; then
shift;
elif [[ $1 == -class ]]; then
originDir=$(pwd);
cd /g/zeitlaeufer/target/;
java de.szimnau.zeitlaeufer.$2;
exitCode=$?;
cd originDir;
return $exitCode;
fi
# java -jar $tmpDir/zeitlaeufer.jar $@; # java -jar $tmpDir/zeitlaeufer.jar $@;
# -p <=> --module-path | -m <=> --module # -p <=> --module-path | -m <=> --module
java --module-path $tmpDir/zeitlaeufer.jar --module zeitlaeufer $@; java --module-path $jarDir/zeitlaeufer.jar --module zeitlaeufer $@;
if [[ -n $tmpDir && -d $tmpDir ]]; then
rm -r $tmpDir; rm -r $tmpDir;
fi

View File

@@ -2,6 +2,7 @@ package de.szimnau.zeitlaeufer;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@@ -45,25 +46,15 @@ public class Main {
private static SortedMap<Integer, Class<?>> getAllrelevantClasses() { private static SortedMap<Integer, Class<?>> getAllrelevantClasses() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
List<String> fileNames = new ArrayList<>(); URL resourceUrl = classLoader.getResource("de/szimnau/zeitlaeufer");
URL jarUrl = classLoader.getResource("de/szimnau/zeitlaeufer"); if (resourceUrl == null) {
if (jarUrl == null) {
throw new RuntimeException("Kann ausführbare Klassen nicht eruieren, da keine Ressource \"de/szimnau/zeitlaeufer\" verfügbar."); throw new RuntimeException("Kann ausführbare Klassen nicht eruieren, da keine Ressource \"de/szimnau/zeitlaeufer\" verfügbar.");
} }
String path = jarUrl.getPath().split(":", 2)[1]; Set<String> fileNames;
String cleanPath = path.substring(0, path.lastIndexOf('!')); if (resourceUrl.getPath().contains(".jar")) {
Enumeration<JarEntry> entries; fileNames = getFileNamesStreamFromJar(resourceUrl);
try (var jarFile = new JarFile(URLDecoder.decode(cleanPath, StandardCharsets.UTF_8))) { } else {
entries = jarFile.entries(); fileNames = getFileNamesStreamFromPackage(resourceUrl);
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);
} }
var increment = new AtomicInteger(); var increment = new AtomicInteger();
return Collections.unmodifiableSortedMap(new TreeMap<>( 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) { private static Class<?> getClass(String className) {
String classWithPath = className.replace("/", "."); String classWithPath = className.replace("/", ".");
return getClassForName(classWithPath.substring(0, className.lastIndexOf('.'))); return getClassForName(classWithPath.substring(0, className.lastIndexOf('.')));