java.lang.Packageの Package クラスには、必要なことを行うためのメソッドがあります。Java コードを使用してマニフェスト コンテンツを取得する簡単な方法を次に示します。
String t = this.getClass().getPackage().getImplementationTitle();
String v = this.getClass().getPackage().getImplementationVersion();
これを共有ユーティリティ クラスの静的メソッドに入れました。このメソッドは、クラス ハンドル オブジェクトをパラメーターとして受け入れます。このようにして、システム内のどのクラスも、必要なときに独自のマニフェスト情報を取得できます。明らかに、値の配列またはハッシュマップを返すようにメソッドを簡単に変更できます。
メソッドを呼び出します。
String ver = GeneralUtils.checkImplVersion(this);
GeneralUtils.javaというファイルのメソッド:
public static String checkImplVersion(Object classHandle)
{
String v = classHandle.getClass().getPackage().getImplementationVersion();
return v;
}
また、Package クラス (独自の Build-Date など) を介して取得できるもの以外のマニフェスト フィールド値を取得するには、Main Attibutes を取得し、それらを処理して、必要な特定のものを求めます。この次のコードは、おそらくSOで見つけた同様の質問からのわずかな変更です。(クレジットしたいのですが、紛失してしまいました。申し訳ありません。)
これを try-catch ブロックに入れて、classHandle (「this」または MyClass.class ) をメソッドに渡します。「classHandle」はクラス型です:
String buildDateToReturn = null;
try
{
String path = classHandle.getProtectionDomain().getCodeSource().getLocation().getPath();
JarFile jar = new JarFile(path); // or can give a File handle
Manifest mf = jar.getManifest();
final Attributes mattr = mf.getMainAttributes();
LOGGER.trace(" --- getBuildDate: "
+"\n\t path: "+ path
+"\n\t jar: "+ jar.getName()
+"\n\t manifest: "+ mf.getClass().getSimpleName()
);
for (Object key : mattr.keySet())
{
String val = mattr.getValue((Name)key);
if (key != null && (key.toString()).contains("Build-Date"))
{
buildDateToReturn = val;
}
}
}
catch (IOException e)
{ ... }
return buildDateToReturn;