-
Notifications
You must be signed in to change notification settings - Fork 0
Description
System.getProperty("java.class.path") wird verwendet um eine Liste sämtlicher Jar-Dateien im Classpath zu erhalten. Das funktioniert in paar Fällen nicht wie gewünscht:
- (Spring Boot) Fatjars: Da sieht man nur die Fatjar resp. es werden die Jar im Fatjar gemeldet aber so, dass man sie nicht weiterverwenden kann.
- Spring Boot layered: Man kann die Fatjar wieder auseinandernehmen (insb. für schneller Docker builds). Da ist aber der gemeldete Classpath nur ".". Die Main-Klasse ist dann ein "JarLauncher".
Bei Spring Boot konnte ich es lösen, indem ich gar keine Fatjar herstelle, sondern direkt einfach meinen Code build und noch die Dependencies in ein Verzeichnis kopiere. Dann wird zwar der Aufruf bissle komplizierter aber es funktioniert.
Mit Gradle sehe ich momentan keine Lösung. Da meldet es mir den Classpath /Users/stefan/.sdkman/candidates/gradle/5.1.1/lib/gradle-launcher-5.1.1.jar. Also auch wieder so ein Launcher-Teil, das sich wohl um den "richtigen" Classpath kümmert. Das Arbeiten mit dem normalen Plugins-Ordner führt aus gleichem Grund zu ähnlichen Problemen. Da findet es die Custom Functions schon gar nicht. Das war schon früher das Problem. Kann man umgehen, wenn man die Functions "registriert".
Weil es (?) keine einfache Lösung gibt, um den Klassenpfad nach Resourcen zu durchsuchen, war meine Idee, eine weitere Variante der Funktion zu definieren. Man muss zusätzlich den Namen der Datei angeben, die gefunden werden soll:
IsInsideExternalDataset2("ch.so.agi.hoheitsgrenzen.xtf", "SO_Hoheitsgrenzen_Publikation_20170626.Hoheitsgrenzen.Gemeindegrenze.Geometrie", "39969c9c-ca50-40af-ab67-f7f018182a66", THIS, "Pos");
Classloader loader = getClass().getClassloader();
try (InputStream in = loader.getResourceAsStream(datasetFileName)) {
doStuff(in);
}
@Philippluca @patrickackermann Was meint ihr? Man kann sichs auch ein wenig schön reden: Immerhin wäre es jetzt qualifizierter. Wenn man nur den qualifizierten Attributnamen angibt und es mehrere XTF mit diesem gibt, passiert vielleicht was, was man nicht will. Mit dem zusätzlichen "Identifikator" (dem Dateinamen) gibt es bereits weniger Kollisionen.
Oder gar komplett auf diesen Zug aufspringen? Auch mit meinem Vorschlag könnte man zuerst im Classpath suchen und dann im lokalen Filesystem.