Frage Verwalten von Datenabhängigkeiten von Java-Klassen, die zur Laufzeit Daten aus dem Klassenpfad laden


Was ist der einfachste Möglichkeit, Abhängigkeiten von Java-Klassen zu Datendateien im Klassenpfad zu verwalten?

Genauer:
Wie sollten Datenabhängigkeiten kommentiert werden? Vielleicht mithilfe von Java-Annotationen (z. B. @Data)? Oder eher einige Build-Einträge in einem Build-Skript oder einer Eigenschaftendatei? Gibt es ein Build-Tool, das solche Informationen integriert und auswertet (Ant, Scons, ...)? Hast du Beispiele?

Stellen Sie sich das folgende Szenario vor:
Ein paar Zeilen von Ant erzeugen ein Jar aus meinen Quellen, das alles enthält, was auf dem Klassenpfad gefunden wird. Dann wird jarjar verwendet, um alle .class-Dateien zu entfernen, die nicht ausgeführt werden müssen, sagen wir Klasse Foo. Das Problem ist, dass alle Datendateien, von denen die Klasse Bar abhängt, immer noch im Jar vorhanden sind. Das ideale Verteilungsskript würde jedoch erkennen, dass die Datendateien, von denen nur die Klasse Bar abhängt, entfernt werden können, während Datendateien, von denen die Klasse Foo abhängt, beibehalten werden müssen.

Irgendwelche Hinweise?


9
2018-05-19 14:38


Ursprung


Antworten:


Ich denke nicht, dass eine generische Lösung für das System existiert, das Sie beschreiben, aber ich hatte nur eine Stichprobe von Anmerkungen zu Klassen mit ASM, da das auch von jarjar verwendet wird. Es ist nicht schwer, die Annotationsdaten so zu lesen (übergeben Sie einen ClassVisitor an die accept () -Methode von ClassReader und tun Sie etwas Nützliches für den Aufruf von visitAnnotation). Dies bedeutet, dass Sie Ihr beabsichtigtes Verhalten entweder versuchen und in jarjar aufnehmen können, oder Sie können es als benutzerdefinierten Schritt zu Ihrem Build-Prozess hinzufügen.


0
2018-05-24 21:32



Dies ist eines der vielen Probleme Maven hat bereits mit seiner Build, Abhängigkeit und Ressourcenverwaltung gelöst. Jedes Maven-Projekt folgt einem Standard-Verzeichnis-Layout, das vorgibt, wo Sie Ihre Datendateien ablegen sollten: in den 'Ressourcen'-Verzeichnissen. Die herkömmliche Maven-Verzeichnisstruktur ist wie folgt ...

/
/src/
/src/main/java/
/src/main/java/App.java
/src/main/resources/
/src/main/resources/my.prod.data.or.cfg.or.whatever
/src/test/java/
/src/test/java/AppTest.java
/src/test/resources/
/src/test/resources/my.test.data.or.cfg.or.whatever
/pom.xml

Dies hat den Vorteil, dass alle Dateien, die in den Hauptverzeichnissen (prod) enthalten sind, Ihrer Anwendung zur Laufzeit vom Classpath aus zur Verfügung stehen. Alle "Test / Ressourcen" -Dateien stehen Ihrem Code während der Build & Unit-Testzeit zur Verfügung, sind jedoch NICHT in Ihrem endgültigen Artefakt enthalten.


1
2018-05-20 23:38



Können Sie Ihr Projekt nicht so umgestalten, dass Sie Submodule haben, die jeweils die relevanten Dateien für das Projekt selbst enthalten; Bar-Klasse und Bar-bezogene Dateien werden in ihrem Bundle verpackt, während Foo-Einsen in ein anderes verpackt werden?

Eine andere Möglichkeit wäre, eine Paketbenennungskonvention zu verwenden, um die Dateien filtern zu können, die Sie in Ihren Bundles sehen möchten.


0
2018-05-20 08:31