[英]How to find version of Jar if not mentioned in Manifest
我有一个项目,其中签入了许多JARS,但没有针对它们的版本信息。
我必须使用Apache Ivy来实现依赖关系管理,但是我不知道在ivy.xml
要指向哪个版本。 我检查了清单,其中许多没有此处提到的JAR版本。
还有另一种方法来查找JARS版本吗? 我知道查找校验和并进行比较是另一种选择,但是为此,我需要对照所有可能的JAR版本的校验和检查每个JAR,因此这不是一个选择。
还有其他建议吗?
我会说-没有别的办法。 如果某个地方有所有jar版本(所涉及的库),则可以对它们进行md5运算,然后与您拥有的未知jar版本的md5总和进行比较。 我可能是错的,但没有其他办法。
要添加到以前的评论中,您可以在http://search.maven.org/#api上找到有关Maven REST API的详细信息。 您在此处感兴趣的URL是http://search.maven.org/solrsearch/select?q=1:“SHA-1校验和”。
我有一个案例,我需要从2个来源中找到数百个JAR的版本作为Java应用程序的一部分。 首先,我打开JAR并首先在“ Implementation-Version”字段中检查了JAR版本的Manifest.MF文件,如果没有,则在“ Bundle-Version”字段中进行了检查。 我用于此的代码如下(显然,您将需要更好的错误处理):
public String getVersionFromJarManifest(File jarFile){
try {
Manifest manifest = new JarFile(jarFile).getManifest();
Attributes mainAttribs = manifest.getMainAttributes();
String version = mainAttribs.getValue("Implementation-Version");
if(version == null || version == "" || version.isEmpty()){
version = mainAttribs.getValue("Bundle-Version");
}
return version;
} catch (Exception e) {
LOGGER.warn("Manifest not found for {}", jarFile.getPath());
return null;
}
}
如果无法从清单文件中获取版本,则我计算了JAR的SHA-1校验和,并在Maven中进行了搜索。 该代码(再次不是很大的错误检查)如下:
public String getVersionFromMavenByChecksum(File jarFile){
String sha = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
FileInputStream fis = new FileInputStream(jarFile);
byte[] dataBytes = new byte[1024];
int nread = 0;
while ((nread = fis.read(dataBytes)) != -1) {
md.update(dataBytes, 0, nread);
}
byte[] mdbytes = md.digest();
//convert the byte to hex format
StringBuffer sb = new StringBuffer("");
for (int i = 0; i < mdbytes.length; i++) {
sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
}
sha = sb.toString();
} catch (Exception e) {
LOGGER.warn("ERROR processing SHA-1 value for {}", jarFile.getPath());
return null;
}
return getVersionBySha(sha);
}
public String getVersionBySha(String sha){
String version = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
List<NameValuePair> suQueryParams = new ArrayList<>();
suQueryParams.add(new BasicNameValuePair("q", "1: \"" + sha + "\""));
String result = null;
try {
result = MavenApiUtil.apiGETCall("http://search.maven.org/solrsearch/select", suQueryParams, null, httpClient);
} catch (Exception e){
LOGGER.warn("ERROR querying Maven for version for SHA {}", sha);
return null;
}
//Parse response
return version;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.