当前位置: 首页 > 面试题库 >

如何从清单文件读取元数据

公羊宇定
2023-03-14
问题内容

我正在尝试从清单文件中提取信息以在文件中的一种方法中显示jar,但是似乎存在一些问题。任何帮助表示赞赏。

清单文件:

Manifest-Version: 1.0
Created-By: 1.8.0_60 (Oracle Corporation)
Main-Class: com.example.package1.myClass

Name: com/example/package1
Specification-Title: MyPackage
Specification-Version: v1.1
Specification-Vendor: MyCompanyName
Implementation-Title: MP
Implementation-Version: 2015-11-05-C
Implementation-Vendor: MyName

Name: com/example/package2
Specification-Title: MySecondaryPackage
Specification-Version: v2.0
Specification-Vendor: MyCompanyName
Implementation-Title: M2ndP
Implementation-Version: 2015-11-05-C
Implementation-Vendor: MyName

myClass.java:

package com.example.package1;
import com.example.package2;

class myClass {
  public static void main(String[] args) {
    try {
      myClass clz = new myClass();
      Thread.sleep(10000); //pause 10 seconnds so we can see what's spit out
    } catch (Exception e) {
    //excluded in example
    }
  }

  public myClass() {
    Package pkg = getClass().getPackage();
    if (pkg == null)
      System.out.println("No Package Found");
    else {
      System.out.println("specs: " + pkg.getSpecificationTitle() + " - " + pkg.getSpecificationVersion());
      System.out.println("imps:  " + pkg.getImplementationTitle() + " - " + pkg.getImplementationVersion());
      System.out.println("name:  " + pkg.getName());
    }
    //other code here excluded from example
  }
}

输出:

specs: null - null
imps:  null - null
name:  com.example.package1

那有什么呢?看起来pkg对象已正确定义,但是它不读取任何Specification或Implementation属性。


问题答案:

所以我终于弄清楚了,以为我愿意和别人分享我的头,以防其他人像我那样把头撞在那堵砖墙上。我再也无法让Package类中的方法返回除以外的任何值null。请参阅下面的修订代码,以了解如何实现这一目标。

package com.example.package1;
import java.util.*;
import java.util.jar.*;
import java.net.*;

class myClass {
  public static void main(String[] args) {
    try {
    new myClass();
    } catch (Exception e) {
    System.out.println(e.getMessage());
    } finally {
    System.out.println("Done");
    try{Thread.sleep(40000);}catch(Exception ee){}
    }
  }

public myClass() throws Exception {
  String clz = getClass().getSimpleName() + ".class";
  String pth = getClass().getResource(clz).toString();
  String mnf = pth.substring(0, pth.lastIndexOf("!") + 1) + "/META-INF/MANIFEST.MF";
  String pkg = getClass().getPackage().getName().replaceAll("\\.","/");
  URL url = new URL(mnf);
  Manifest manifest = new Manifest(url.openStream());

  Attributes attr = manifest.getAttributes(pkg);
  String value = attr.getValue("Specification-Title") + " - " + 
  attr.getValue("Implementation-Title") + " " + 
  attr.getValue("Specification-Version") + " build # " + 
  attr.getValue("Implementation-Version");
  System.out.println(value);
  }
}

输出:

MyPackage - MP v1.1 build # 2015-11-05-C
Done

提取四段元数据的代码很多。

因此,如果您希望少写几行,这就是我使用的:

public myClass() throws Exception {
  Attributes attr = new Manifest(new URL(getClass().getResource(getClass().getSimpleName() + ".class").toString().substring(0, getClass().getResource(getClass().getSimpleName() + ".class").toString().lastIndexOf("!") + 1) + "/META-INF/MANIFEST.MF").openStream()).getAttributes(getClass().getPackage().getName().replaceAll("\\.","/"));
  String value = attr.getValue("Specification-Title") + " - " + attr.getValue("Implementation-Title") + " " + attr.getValue("Specification-Version") + " build # " + attr.getValue("Implementation-Version");
  System.out.println(value);
}


 类似资料:
  • 问题内容: 我在JAR文件中有一个文件。这,例如。 我该如何访问?我的源代码是: 问题答案: 您不能使用File,因为此文件在文件系统上并不独立存在。相反,您需要getResourceAsStream(),如下所示:

  • 在产品代码中,我可以使用以下代码从和读取属性 然而,在单元测试中,相同的代码不起作用,变量始终为空。 我试图添加以下注释,但它不起作用。

  • 如何读取其-依赖关系中的-file清单属性? UPD:这里不使用servlet(这是Springbean初始化代码)。

  • 问题内容: 我想从一个文本文件(例如contactids.txt)读取整数值。在文件中我有像 我想从文本文件中读取它们…请帮助 问题答案: 您可能想要做这样的事情(如果您使用的是Java 5及更高版本) 通过Julian Grenier从数组中的文件读取整数

  • 问题内容: 我知道如何读取字节,但是如何在Python中读取位? 我只需要从二进制文件中读取5位(而不是8位[1字节]) 有什么想法或方法吗? 问题答案: Python一次只能读取一个字节。您需要读完整的字节,然后从该字节中提取所需的值,例如 或者,如果您想要5个最低有效位,而不是5个最高有效位: 一些其他有用的位操作信息可以在这里找到:http : //wiki.python.org/moin/

  • 在我的maven项目中,我有一个PDF文件,它位于文件夹中。我的函数从文件夹读取PDF文件,并根据用户的数据在文档中添加一些值。 此项目使用打包为文件,并在我的其他Spring Boot应用程序中用作依赖项。 在我的Spring启动项目中,我创建了将在PDF上执行一些工作的类的instace。一旦PDF文件上的所有工作都完成,并且当PDF文件保存在文件系统上时,它始终是空的(所有页面都是空白的)。