Ich möchte alle XML-Dateien entdecken, die mein ClassLoader mit einem Platzhaltermuster kennt. Gibt es eine Möglichkeit, dies zu tun?Wie kann ich Ressourcen in einem Java-Jar mit einem Platzhalternamen erkennen?
Antwort
Es erfordert ein wenig Trickerei, aber hier ist eine relevante blog entry. Sie ermitteln zuerst die URLs der Gläser, öffnen dann das Glas und scannen seinen Inhalt. Ich denke, dass Sie die URLs aller Gläser entdecken würden, indem Sie nach `/META-INF/MANIFEST.MF 'suchen. Verzeichnisse wären eine andere Sache.
Nun, ist es nicht von innen Java, aber
jar -tvf jarname | grep xml$
zeigt Ihnen alle XMLs in das Glas.
Unfortuneately ich eine Lösung benötigen, die in Java ist. –
Eine JAR-Datei ist nur eine andere ZIP-Datei, oder?
Also nehme ich an Sie die JAR-Dateien http://java.sun.com/javase/6/docs/api/java/util/zip/ZipInputStream.html
Ich denke, mit so etwas wie laufen könnte:
ZipSearcher searcher = new ZipSearcher(new ZipInputStream(new FileInputStream("my.jar"))); List xmlFilenames = searcher.search(new RegexFilenameFilter(".xml$"));
Beifall. Keith.
ein Frühlings-ApplicationContext
kann dies trivialerweise tun:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationConext.xml");
Resource[] xmlResources = context.getResources("classpath:/**/*.xml");
Siehe ResourcePatternResolver#getResources oder ApplicationContext.
Im neueren Frühling wird das Muster nicht funktionieren. Das Präfix muss 'classpath *:' sein, um die Ressourcen innerhalb von jars zu finden. Dies zumindest mit einer WAR-Datei und einer JAR-Bibliothek, die XML-Dateien enthält. – Kayaman
List<URL> resources = CPScanner.scanResources(new PackageNameFilter("net.sf.corn.cps.sample"), new ResourceNameFilter("A*.xml"));
setzen das Snippet in Ihrem pom.xml
<dependency>
<groupId>net.sf.corn</groupId>
<artifactId>corn-cps</artifactId>
<version>1.0.1</version>
</dependency>
Dies scheint eine der einfachsten Lösungen zu sein. Die neueste Version ist 1.1.7 in maven central, Stand vom 20.8.2014. –
Das sieht so aus, als würde es funktionieren, würde aber eine Menge Suchen erfordern, um zu den Dateinamen zu gelangen, die ich möchte. Ich denke, dass es einfacher wird, eine Datei zum Zeitpunkt des Aufbaus zu erstellen, die die Dateien enthält, die ich mir ansehe. Diese neue Datei hätte einen bekannten Namen und könnte mit dem ClassLoader gefunden werden. –