gpt4 book ai didi

java - 读取类的 jar 版本

转载 作者:行者123 更新时间:2023-12-01 21:48:53 30 4
gpt4 key购买 nike

对于 Web 服务客户端,我想使用 jar 文件中的实现标题和实现版本作为用户代理字符串。问题是如何读取 jar 的 list 。

这个问题已被问过多次,但答案似乎不适用于我。 (例如Reading my own Jar's Manifest)

问题在于,简单地读取/META-INF/MANIFEST.MF 几乎总是会给出错误的结果。就我而言,它几乎总是指 JBoss。

https://stackoverflow.com/a/1273196/4222206中提出的解决方案对我来说是有问题的,因为您必须对库名称进行硬编码才能停止迭代,然后它仍然可能意味着同一库的两个版本位于类路径上,而您只需返回第一个(不一定是正确的)命中。

https://stackoverflow.com/a/1273432/4222206中的解决方案似乎仅适用于 jar://url,这在 JBoss 中完全失败,其中应用程序类加载器生成 vfs://url。

有没有办法让类中的代码找到它自己的 list ?

我尝试了上述项目,这些项目似乎在从 java 命令行运行的小型应用程序中运行良好,但后来我想要一个可移植的解决方案,因为我无法预测我的库稍后将在哪里使用。

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 路径。我假设通过修改 url 以指向 list 将给出所需的结果,但是我得到了:

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:\Users\hiran\Documents\JavaLibs\wildfly-18.0.0.Final\standalone\tmp\vfs\temp\tempfc75b13f07296e98\content-e4d5ca96cbe6b35e\WEB-INF\lib\library-1.0-18.jar!\META-INF\MANIFEST.MF (The system cannot find the path specified)

我检查了该路径,似乎甚至 jar 的第一个 URL(通过 Version.class.getProtectionDomain().getCodeSource().getLocation() 获得)也已经错误了。它应该是 C:\Users\user\Documents\JavaLibs\wildfly-18.0.0.Final\standalone\tmp\vfs\temp\tempfc75b13f07296e98\content-e4d5ca96cbe6b35e\WEB-INF\lib\library-1.0.18.jar .

那么这甚至可能表明 Wildfly 存在问题?

最佳答案

看来我在这里找到了一些合适的解决方案: https://stackoverflow.com/a/37325538/4222206

所以最后这段代码可以在 JBoss 中(至少)显示正确的 jar 版本:

this.getClass().getPackage().getImplementationTitle();
this.getClass().getPackage().getImplementationVersion();

希望下次搜索时我能找到这个答案...

关于java - 读取类的 jar 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58769644/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com