Dopo aver testato e cercato i documenti di Spring, ho trovato un modo per leggere il file manifest.
Prima di tutto, Spring Boot implementa il proprio ClassLoader che cambia il modo in cui vengono caricate le risorse. Quando chiami getResource()
, Spring Boot caricherà la prima risorsa che corrisponde al nome di risorsa specificato nell'elenco di tutti i JAR disponibili nel percorso di classe e il tuo contenitore di applicazioni non è la prima scelta.
Così, quando l'emissione di un comando come:
getClassLoader().getResourceAsStream("/META-INF/MANIFEST.MF");
Il primo file MANIFEST.MF si trovano in qualunque vaso del percorso di classe viene restituito. Nel mio caso, proveniva da una libreria jar JDK.
SOLUZIONE:
sono riuscito a ottenere un elenco di tutti i Jars caricate dal app che contiene la risorsa "/META-INF/MANIFEST.MF" e controllato se la risorsa è venuto dal mio vaso di applicazione. Se è così, leggere il suo file MANIFEST.MF e tornare alla app, come quella:
private Manifest getManifest() {
// get the full name of the application manifest file
String appManifestFileName = this.getClass().getProtectionDomain().getCodeSource().getLocation().toString() + JarFile.MANIFEST_NAME;
Enumeration resEnum;
try {
// get a list of all manifest files found in the jars loaded by the app
resEnum = Thread.currentThread().getContextClassLoader().getResources(JarFile.MANIFEST_NAME);
while (resEnum.hasMoreElements()) {
try {
URL url = (URL)resEnum.nextElement();
// is the app manifest file?
if (url.toString().equals(appManifestFileName)) {
// open the manifest
InputStream is = url.openStream();
if (is != null) {
// read the manifest and return it to the application
Manifest manifest = new Manifest(is);
return manifest;
}
}
}
catch (Exception e) {
// Silently ignore wrong manifests on classpath?
}
}
} catch (IOException e1) {
// Silently ignore wrong manifests on classpath?
}
return null;
}
Questo metodo restituirà tutti i dati da un file MANIFEST.MF all'interno di un oggetto Manifest.
ho preso in prestito parte della soluzione da reading MANIFEST.MF file from jar file using JAVA
fonte
2015-09-09 18:42:00
Funziona correttamente con altre app Java, ma apparentemente Spring Boot ha un approccio diverso. Ho bisogno di leggere il file manifest perché è proprio lì che Maven include informazioni su numero di versione, numero di build, fornitore di implementazione, ecc. E voglio mostrarlo all'utente. –
@RicardoMemoria Date un'occhiata a [java.lang.Package] (https://docs.oracle.com/javase/7/docs/api/java/lang/Package.html) per tali informazioni. Come ho detto, ci sono * molti * file manifest nel tuo classpath. Riceverai * il tuo * file solo se hai la certezza che il tuo barattolo è il primo. È molto raramente una garanzia che puoi ottenere. – Andreas
Grazie ... Sembra che l'utilizzo di java.lang.Package risolverà il mio problema. Ma tu dici di non provare a leggere me stesso il manifesto.Probabilmente la classe Properties non è il modo migliore (anche se ha funzionato per ciò di cui avevo bisogno), ma esiste una classe manifest in Java che può essere utilizzata specificamente per gestire il contenuto del file manifest. C'è qualche ragione specifica per cui non dovremmo provare a leggere noi stessi il manifest? –