2013-10-13 9 views
5

を読んでいるので、.jarが有効かどうかは、mainfestファイルのいくつかの値を調べることで確認しようとしています。 javaを使用してファイルを読み込んで解析する最善の方法は何ですか?私は Javaを使用して.jarマニフェストファイル

jar -xvf anyjar.jar META-INF/MANIFEST.MF 

ファイルを抽出するには、このコマンドを使用するのではと思ったんだけど、何か行うことができます。

File manifest = Command.exec("jar -xvf anyjar.jar META-INF/MAINFEST.MF"); 

次に、ファイルの行を解析するために、いくつかのバッファリングリーダーか何かを使用しますか?任意の助け

おかげで...

+0

の可能性のある重複http://stackoverflow.com/questions/2198525/can-values-defined-in-manifest-mf-be-accessed-programmatically/2198542 –

答えて

8

jarツールを使用しての問題は、それがインストールされて完全なJDKを必要とすることです。 Javaの多くのユーザーは、jarを含まないJREのみをインストールします。

また、jarは、ユーザーのPATHにある必要があります。

ので、代わりに私はこのように、適切なAPIを使用することをお勧めします:実際に簡単なはず

Manifest m = new JarFile("anyjar.jar").getManifest(); 

こと!

+0

ああ、それは意味をなさないです。私もCommand.exec( "jarを抽出するコード")を使用していますので、お待ちください。それを行う簡単な方法はありますか? – Kyle

+0

はい。しかし、すでにStackoverflowでそれについての質問があるはずです。 –

+0

これまで私はコマンドプロンプトを使用していることがわかりましたが、このリンクはうまくいくようですが、ちょっと笑ったようです。なぜjarfile.run()なんかのような単純なものではないのですか? http://www.programcreek.com/2012/08/unzip-a-jar-file-in-java-program/ – Kyle

4

のパッケージクラスjava.lang.Packageには、必要な操作を行うメソッドがあります。ここでは、Javaコードを使用して、マニフェストの内容を取得する簡単な方法は次のとおりです。

String t = this.getClass().getPackage().getImplementationTitle(); 
String v = this.getClass().getPackage().getImplementationVersion(); 

私は共有ユーティリティclass.The方法で静的メソッドにこれを入れ、パラメータとしてクラスハンドルオブジェクトを受け取ります。こうすることで、システム内のどのクラスでも必要なときに独自のマニフェスト情報を取得できます。明らかに、このメソッドは、値の配列またはハッシュマップを返すように簡単に変更できます。

呼び出し方法:

String ver = GeneralUtils.checkImplVersion(this); 

GeneralUtils.javaと呼ばれるファイル内のメソッド:

public static String checkImplVersion(Object classHandle) 
{ 
    String v = classHandle.getClass().getPackage().getImplementationVersion(); 
    return v; 
} 

そして、あなたがパッケージを経由して取得することができます以外のマニフェストのフィールド値を取得しますクラス(例えばあなた自身のビルド - 日付)、あなたは、メインアトリビュートを取得し、それらを介して、あなたが望む特定のものを求める。以下のコードは私が見つけた似たような質問からのわずかな改造ですが、おそらくここにあります。

これをtry-catchブロックに入れ、メソッドにclassHandle( "this"またはMyClass.class)を渡します。 "classHandleは" Class型は次のとおりです。いくつかのケースで...class.getProtectionDomain().getCodeSource().getLocation();vfs:/でパスを与えるので、これはさらに処理する必要がありますので

String className = getClass().getSimpleName() + ".class"; 
String classPath = getClass().getResource(className).toString(); 
if (!classPath.startsWith("jar")) { 
    return DEFAULT_PROPERTY_VALUE; 
} 

URL url = new URL(classPath); 
JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); 
Manifest manifest = jarConnection.getManifest(); 
Attributes attributes = manifest.getMainAttributes(); 
return attributes.getValue(PROPERTY_NAME); 

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; 
+0

パッケージメソッドに関しては、java.util.jar.Attributes.Nameクラスにある正しい名前(例: "Implementation-Version")を使用してマニフェストで定義する必要があります。これは特に詳しくは書かれていません。 –

0

最も簡単な方法ははJarURLConnectionクラスを使用することです。ProtectionDomainを使っ

または、:

File file = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); 
if (file.isFile()) { 
    JarFile jarFile = new JarFile(file); 
    Manifest manifest = jarFile.getManifest(); 
    Attributes attributes = manifest.getMainAttributes(); 
    return attributes.getValue(PROPERTY_NAME); 
} 
関連する問題