我必须通过阅读清单来扫描EAR以确定其中一个JAR的版本......
我碰巧有这样的内容:MyApplication.ear / MyLibrary.jar / META-INF / Manifest.MF
我无法想象如何以最简单的方式做到这一点......我一直在与JarFile,JarInputStream,JarURLConnection斗争,到目前为止还没有运气。
这是我当时所拥有的:
JarFile myEAR = new JarFile(urlOfMyEAR);
JarEntry myJAR = myEAR.getJarEntry(libname);
Attributes m = myJAR.getAttributes();
System.out.println(m.getValue("Implementation-Version"));
但getAttributes()
会返回null
...
我认为这肯定是一种复杂/通过这种方式(通过提取文件或其他方式),但我希望它更简单...
感谢您的帮助。
编辑:我自己的答案在下面......
答案 0 :(得分:2)
我设法通过使用此代码来解决我的问题:
JarFile myEAR = new JarFile(urlOfMyEAR);
File f = File.createTempFile("jar", null);
FileOutputStream resourceOS = new FileOutputStream(f);
byte[] byteArray = new byte[1024];
int i;
InputStream jarIS = myEAR.getInputStream(myEAR.getEntry(libname));
while ((i = jarIS.read(byteArray)) > 0) {
//Write the bytes to the output stream
resourceOS.write(byteArray, 0, i);
}
//Close streams to prevent errors
jarIS.close();
resourceOS.close();
JarFile myJAR = new JarFile(f);
Attributes m = myJAR.getManifest().getMainAttributes();
System.out.println(m.getValue("Implementation-Version"));
(感谢此帖https://stackoverflow.com/a/17902842/2454970)
对于一个接近200MB耳朵的7MB容器,整个解压缩只需要7秒钟......
感谢你的想法,伙计们。
答案 1 :(得分:0)
如果您的扫描程序与您的应用程序在同一个JVM中运行,您可以获得如下所示的清单文件:
Enumeration<URL> resources = this.getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
while(resources.hasMoreElements()){
URL u = resources.nextElement();
try(InputStream is = u.openStream()){
if(is!=null){
Manifest manifest = new Manifest(is);
//do something blabla
}
}
}
如果没有,我认为在您的应用程序中添加一个简单的jar来收集这些数据然后将结果上传到您的仪表板将是一个更好的解决方案。