resource - spring read file from classpath




Ricerca di risorse con PathMatchingResourcePatternResolver e URLClassloader in JAR (2)

Caricare i file dinamicamente in primavera è semplice, cambierei l'approccio alla ricerca dei file con estensioni.

Prova quanto segue:

ClassLoader cl = this.getClass().getClassLoader(); 
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
Resource[] resources = resolver.getResources("classpath*:/*.xml") ;
for (Resource resource: resources){
    logger.info(resource.getFilename());
}

Sto cercando di caricare tutte le risorse con un'estensione di file specifica che viene caricata dinamicamente in fase di esecuzione utilizzando un URLClassloader.

Sfortunatamente il PathMatchingResourcePatternResolver non restituisce risorse quando utilizzo il classpath*:/*.myextension pattern classpath*:/*.myextension . Quando specifico un file con il suo nome completo come classpath*:/test.myextension la risorsa viene caricata, quindi penso che Classloader sia configurato correttamente.

URLClassloader classloader = new URLClassloader(jarURLs); // jarURLs look like "file:C:/Temp/test.jar"
Thread.getCurrentThread().setContextClassloader(classloader)
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classloader);
Resource[] resources = resolver.getResources("classpath*:/*.myextension") // yields empty array
....

Come posso fare questo? Devo caricare i vasi dinamicamente e non conosco i nomi delle risorse in anticipo.


Come ha detto Tech Trip nel commento alla sua risposta, ho avuto un errore nel mio schema. Anche la Spring-documentation è abbastanza chiara (vedi Avvertenza): "classpath *:" quando combinato con modelli stile Ant funzionerà in modo affidabile con almeno una directory root prima che il pattern abbia inizio ... nasce da una limitazione nel ClassLoader.getResources () di JDK

Così ho cambiato il mio modello in

classpath*/model/*.myextension

Dato che i JAR sono creati da un xText-DSL, devo applicare una convenzione per utilizzare la cartella del modello.





classpath