Compare commits

..

5 Commits

Author SHA1 Message Date
fszimnau
094dfd9daf corrected alternative execute command 2025-11-19 11:12:01 +01:00
fszimnau
4dd18d03f0 added explanatory comment 2025-11-19 11:03:28 +01:00
fszimnau
5a596e28da set main class as entry point 2025-11-19 10:49:01 +01:00
fszimnau
3929ce2666 added "main" class as main entrypoint 2025-11-19 10:45:14 +01:00
fszimnau
c872efa459 adjusted gitignore (to intellij usage) 2025-11-19 10:42:28 +01:00
4 changed files with 100 additions and 6 deletions

6
.gitignore vendored
View File

@@ -1,3 +1,5 @@
target/
dist/
/target/
/dist/
*.class
/.idea/
/*.iml

View File

@@ -6,4 +6,9 @@ if [[ ! -e dist ]]; then
mkdir dist;
fi
rm -r dist/* 2>/dev/null;
jar cf ../dist/zeitlaeufer.jar target/**/*;
dir=$(pwd)
cd target;
# jar [...] --manifest=[...] with main class does work when running with "java -jar" but not with "java --module-path"
# --create --file <=> cf
jar --create --file=../dist/zeitlaeufer.jar --main-class=de.szimnau.zeitlaeufer.Main ./**/*;
cd $dir

View File

@@ -3,12 +3,12 @@ set -uo pipefail
# when executed as executable file in "git for windows" bash some things won't work, so always run with prefixed command
originDir=$(pwd);
cd ~/zeitlaeufer/;
cd /g/zeitlaeufer/;
tmpDir="/tmp/zeitlaeufer_$RANDOM";
mkdir $tmpDir;
cp dist/zeitlaeufer.jar $tmpDir;
cd $originDir;
# java -cp $tmpDir/zeitlaeufer.jar $@;
# java -jar $tmpDir/zeitlaeufer.jar $@;
# -p <=> --module-path | -m <=> --module
java --module-path $tmpDir/zeitlaeufer.jar --module zeitlaeufer/$@;
java --module-path $tmpDir/zeitlaeufer.jar --module zeitlaeufer $@;
rm -r $tmpDir;

View File

@@ -0,0 +1,87 @@
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.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
import static de.szimnau.zeitlaeufer.tools.CommonTools.print;
import static de.szimnau.zeitlaeufer.tools.CommonTools.println;
public class Main {
public static void main(String[] args) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
if (args.length == 0) {
askParametersAndRun();
} else {
parseParametersAndRun(args);
}
}
private static void askParametersAndRun() throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
var br = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
Map<Integer, Class<?>> classes = getAllrelevantClasses();
String printedClasses = classes.entrySet().stream()
.map(e -> e.getKey() + ": " + e.getValue().getCanonicalName().substring(e.getValue().getCanonicalName().lastIndexOf('.') + 1))
.reduce("", (a, b) -> a + "\n" + b);
print("Welcher Zeitläufer soll verwendet werden? " + printedClasses + "\n: ");
var num = Integer.parseInt(br.readLine());
Class<?> selectedClass = classes.get(num);
var mainMethod = selectedClass.getMethod("main", String[].class);
mainMethod.invoke(null, (Object) new String[0]);
}
private static Map<Integer, Class<?>> getAllrelevantClasses() {
InputStream stream = ClassLoader.getSystemClassLoader()
.getResourceAsStream("de/szimnau/zeitlaeufer");
var br = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
var increment = new AtomicInteger();
return Collections.unmodifiableSortedMap(new TreeMap<>(
br.lines()
.filter(line -> line.endsWith(".class") && !"Main.class".equals(line))
.sorted()
.map(Main::getClass)
.filter(Objects::nonNull)
.filter(clazz ->
Arrays.stream(clazz.getMethods()).anyMatch(m ->
"main".equals(m.getName()) && m.getParameterCount() == 1 && m.getParameterTypes()[0] == String[].class
)
)
.collect(Collectors.toMap(c -> increment.incrementAndGet(), Function.identity()))
));
}
private static Class<?> getClass(String className) {
return getClassForName(className.substring(0, className.lastIndexOf('.')));
}
private static Class<?> getClassForName(String className) {
String fqnClassName = "de.szimnau.zeitlaeufer." + className;
try {
return Class.forName(fqnClassName);
} catch (ClassNotFoundException cnfe) {
println("ERROR: could not find Class for Name: de.szimnau.zeitlaeufer." + fqnClassName);
}
return null;
}
private static void parseParametersAndRun(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> selectedClass = getClassForName(args[0]);
if (selectedClass == null) {
System.exit(1);
}
var mainMethod = selectedClass.getMethod("main", String[].class);
mainMethod.invoke(null, (Object) Arrays.copyOfRange(args, 1, args.length));
}
}