本文介紹了讀取類的JAR版本的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
對于Web服務(wù)客戶端,我希望使用JAR文件中的Implementation-Title和Implementation-Version作為用戶代理字符串。問題是如何讀取JAR的清單。
這個問題已經(jīng)被問了很多次,但是答案似乎不適用于我。(例如Reading my own Jar's Manifest)
問題在于,簡單地讀取/META-INF/MANIFEST.MF幾乎總是產(chǎn)生錯誤的結(jié)果。在我的情況下,它幾乎總是指JBoss。
https://stackoverflow.com/a/1273196/4222206中提出的解決方案
這對我來說是有問題的,因為您必須硬編碼庫名稱來停止迭代,然后它仍然可能意味著同一個庫的兩個版本在類路徑上,您只返回第一個-不一定是正確的-命中。
https://stackoverflow.com/a/1273432/4222206中的解決方案
似乎只使用jar://URL,這在JBoss中完全失敗,在JBoss中,應(yīng)用程序類加載器生成vfs://URL。
類中的代碼是否有辦法查找其自己的清單?
我嘗試了上面提到的項目,這些項目似乎在從java命令行運(yùn)行的小型應(yīng)用程序中運(yùn)行得很好,但是我想要一個便攜的解決方案,因為我無法預(yù)測我的庫稍后將在哪里使用。
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);
}
}
}
代碼將檢測正確的JAR路徑。我假設(shè)通過將url修改為指向清單會給出所需的結(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的第一個URL(通過Version.class.getProtectionDomain().getCodeSource().getLocation()獲得)都已經(jīng)錯誤了。應(yīng)該是C:UsersuserDocumentsJavaLibswildfly-18.0.0.Finalstandalone mpvfs emp empfc75b13f07296e98content-e4d5ca96cbe6b35eWEB-INFliblibrary-1.0.18.jar.
所以這甚至可能指向WildFly中的問題?
推薦答案
我似乎在這里找到了一些合適的解決方案:
https://stackoverflow.com/a/37325538/4222206
因此,最終此代碼可以(至少)在JBoss中顯示JAR的正確版本:
this.getClass().getPackage().getImplementationTitle();
this.getClass().getPackage().getImplementationVersion();
希望我下次搜索時能找到這個答案.
這篇關(guān)于讀取類的JAR版本的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,