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

9

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

Genauer gesagt:
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 Bereitstellungsskript 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?

    
Martin Potthast 19.05.2010, 14:38
quelle

3 Antworten

0

Ich glaube nicht, dass es eine generische Lösung für das von Ihnen beschriebene System gibt, aber ich hatte nur einen Stich in das Lesen von Anmerkungen zu Klassen mit ASM , da dies 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.

    
Simon Groenewolt 24.05.2010, 21:32
quelle
1

Dies ist eines der vielen Probleme, die Maven bereits mit seiner Build-, Abhängigkeits- und Ressourcenverwaltung gelöst hat. 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 ...

%Vor%

Der Vorteil besteht darin, dass alle Dateien, die in den Hauptverzeichnissen (prod) enthalten sind, Ihrer Anwendung zur Laufzeit vom Classpath aus zur Verfügung stehen. Alle 'test / resources' Dateien stehen während Build & amp; Unit Testzeit, aber sind NICHT in Ihrem endgültigen Artefakt enthalten.

    
Jesse Webb 20.05.2010 23:38
quelle
0

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 diejenigen in einem anderen 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.

    
Matthieu BROUILLARD 20.05.2010 08:31
quelle