本文介紹了讀取類(lèi)的JAR版本的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
對(duì)于Web服務(wù)客戶(hù)端,我希望使用JAR文件中的Implementation-Title和Implementation-Version作為用戶(hù)代理字符串。問(wèn)題是如何讀取JAR的清單。
這個(gè)問(wèn)題已經(jīng)被問(wèn)了很多次,但是答案似乎不適用于我。(例如Reading my own Jar's Manifest)
問(wèn)題在于,簡(jiǎn)單地讀取/META-INF/MANIFEST.MF幾乎總是產(chǎn)生錯(cuò)誤的結(jié)果。在我的情況下,它幾乎總是指JBoss。
https://stackoverflow.com/a/1273196/4222206中提出的解決方案
這對(duì)我來(lái)說(shuō)是有問(wèn)題的,因?yàn)槟仨氂簿幋a庫(kù)名稱(chēng)來(lái)停止迭代,然后它仍然可能意味著同一個(gè)庫(kù)的兩個(gè)版本在類(lèi)路徑上,您只返回第一個(gè)-不一定是正確的-命中。
https://stackoverflow.com/a/1273432/4222206中的解決方案
似乎只使用jar://URL,這在JBoss中完全失敗,在JBoss中,應(yīng)用程序類(lèi)加載器生成vfs://URL。
類(lèi)中的代碼是否有辦法查找其自己的清單?
我嘗試了上面提到的項(xiàng)目,這些項(xiàng)目似乎在從java命令行運(yùn)行的小型應(yīng)用程序中運(yùn)行得很好,但是我想要一個(gè)便攜的解決方案,因?yàn)槲覠o(wú)法預(yù)測(cè)我的庫(kù)稍后將在哪里使用。
public static Manifest getManifest() {
log.debug("getManifest()");
synchronized(Version.class) {
if(manifest==null) {
try {
// this works wrongly in JBoss
//ClassLoader cl = Version.class.getProtectionDomain().getClassLoader();
//log.debug("found classloader={}", cl);
//URL manifesturl = cl.getResource("/META-INF/MANIFEST.MF");
URL jar = Version.class.getProtectionDomain().getCodeSource().getLocation();
log.debug("Class loaded from {}", jar);
URL manifesturl = null;
switch(jar.getProtocol()) {
case "file":
manifesturl = new URL(jar.toString()+"META-INF/MANIFEST.MF");
break;
default:
manifesturl = new URL(jar.toString()+"!/META-INF/MANIFEST.MF");
}
log.debug("Expecting manifest at {}", manifesturl);
manifest = new Manifest(manifesturl.openStream());
}
catch(Exception e) {
log.info("Could not read version", e);
}
}
}
代碼將檢測(cè)正確的JAR路徑。我假設(shè)通過(guò)將url修改為指向清單會(huì)給出所需的結(jié)果,但我得到的結(jié)果是:
Class loaded from vfs:/C:/Users/user/Documents/JavaLibs/wildfly-18.0.0.Final/bin/content/webapp.war/WEB-INF/lib/library-1.0-18.jar
Expecting manifest at vfs:/C:/Users/user/Documents/JavaLibs/wildfly-18.0.0.Final/bin/content/webapp.war/WEB-INF/lib/library-1.0-18.jar!/META-INF/MANIFEST.MF
Could not read version: java.io.FileNotFoundException: C:UsershiranDocumentsJavaLibswildfly-18.0.0.Finalstandalone mpvfs emp empfc75b13f07296e98content-e4d5ca96cbe6b35eWEB-INFliblibrary-1.0-18.jar!META-INFMANIFEST.MF (The system cannot find the path specified)
我檢查了該路徑,似乎連JAR的第一個(gè)URL(通過(guò)Version.class.getProtectionDomain().getCodeSource().getLocation()獲得)都已經(jīng)錯(cuò)誤了。應(yīng)該是C:UsersuserDocumentsJavaLibswildfly-18.0.0.Finalstandalone mpvfs emp empfc75b13f07296e98content-e4d5ca96cbe6b35eWEB-INFliblibrary-1.0.18.jar.
所以這甚至可能指向WildFly中的問(wèn)題?
推薦答案
我似乎在這里找到了一些合適的解決方案:
https://stackoverflow.com/a/37325538/4222206
因此,最終此代碼可以(至少)在JBoss中顯示JAR的正確版本:
this.getClass().getPackage().getImplementationTitle();
this.getClass().getPackage().getImplementationVersion();
希望我下次搜索時(shí)能找到這個(gè)答案.
這篇關(guān)于讀取類(lèi)的JAR版本的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,