8

Eclipseからエクスポートしている実行可能なJARファイルのコンパイル時間を取得しようとしています。これを行う1つの方法は、META-INF/MANIFEST.MFファイルの変更時刻を取得することです。残念ながら、この情報を取得する方法を見つけることができないようです(マニフェスト自体を使用して読み取る方法は知っていますがgetResourceAsStream("/META-INF/MANIFEST.MF")、変更時刻を読み取ることができないようです)。

誰かがそれを行う方法についていくつかの洞察を持っていますか?

4

2 に答える 2

7

jarファイル自体にアクセスできる場合は、java.util.jarパッケージを使用してjarファイルを読み取ってからZipEntry、マニフェストファイルをgetTime()取得し、それを使用して最終更新時刻を取得できるはずです。

JarFile jf = new JarFile("myfile.jar");
ZipEntry manifest = jf.getEntry("META-INF/MANIFEST.MF");
long manifestTime = manifest.getTime();  //in standard millis

特定のクラスを処理する必要がある場合は、このコードも役立つ場合があります。

String rn = this.getClass().getName().replace('.', '/') + ".class";
String path = getClass().getClassLoader().getResource(rn).getPath();
String jarFile = path.substring(0, path.indexOf("!"));

次にjarFile、jarのパス名が含まれます。クラスがjarファイルからロードされていない場合、-3行目は失敗し、path.indexOf-1が返されることに注意してください。

于 2012-03-29T14:47:48.263 に答える
5

結局、Aleks Gの回答や他の場所で見つかった他の回答に基づいて、より堅牢なソリューションを思いつきました(たとえば、ネットワーク共有でも機能します)。

public static Long getTime(Class<?> cl) {
    try {
        String rn = cl.getName().replace('.', '/') + ".class";
        JarURLConnection j = (JarURLConnection) cl.getClassLoader().getResource(rn).openConnection();
        return j.getJarFile().getEntry("META-INF/MANIFEST.MF").getTime();
    } catch (Exception e) {
        return null;
    }
}

Classオブジェクトからリソース名に移動するためのより良い方法を望んでいましたが、これが必要になると思います。

于 2012-03-30T10:26:04.723 に答える