2

単体テストで正しい jar からマニフェストにアクセスする方法を数多く試しました。私が抱えている問題は、クラスのファイルではなく、最初に到達したjarファイルを読み取っているように見えることです。これが私の最近の試みです

InputStream is = Test.class.getResourceAsStream("/META-INF/MANIFEST.MF");
try {
    if (is == null) {
        System.out.println("null no input stream");
    } else {
        Manifest manifest = new Manifest(is);
        Attributes attributes = manifest.getMainAttributes();
        v = attributes.getValue("Test");
        System.out.println("Test="+v);
        v = attributes.getValue("Created-by");
        System.out.println("By="+v);
    }
} catch (IOException e) {
    System.out.println("error");
} finally {
    if (is != null) {
        is.close();
    }
}

そしてこれらは結果です

Test=null By=1.6.0_18 (Sun Microsystems Inc.)

使用MANIFEST.MFしたい には の値があるためTest、これが間違ったファイルを読み取っていることがわかります

単体テストで使用するマニフェスト ファイルを含む jar を指定する方法を知っている人はいますか?

4

5 に答える 5

2

これが私が思いついたものです..... HTMLDocument をクラス/オブジェクトに置き換えてください。

   HTMLDocument htmlDoc = new HTMLDocument();

    try
    {
      JarFile jarfile = new JarFile(htmlDoc.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());

      // Get the manifest
      Manifest manifest = jarfile.getManifest();

      Map<String,Attributes> msa = manifest.getEntries();

      for (String key : msa.keySet())
      {
        System.out.println("KEY: " + key);

        Attributes a = msa.get(key);

        for (Object k : a.keySet())
        {
          System.out.println(k + " - " + a.get(k));
        }
      }
    }
    catch (IOException e)
    {
      System.out.println("error");
    }
于 2013-02-27T18:48:39.867 に答える
1

あなたはこれで試すことができます:

URLClassLoader classLoader = (URLClassLoader) getClass().getClassLoader();
try {
  URL url = classLoader.findResource("META-INF/MANIFEST.MF");
  Manifest manifest = new Manifest(url.openStream());
  // add your code
  ...
} catch (IOException E) {
  // handle exception
}
于 2013-02-27T16:29:30.267 に答える
1

クラスを含む jar には、次の方法でアクセスできます。

InputStream in = MyClass
                .class
                .getProtectionDomain()
                .getCodeSource()
                .getLocation()
                .openStream();

私はあなたのコードでこの行を変更し、同じ結果を得ましたが、マニフェストファイルが見つかるまで自分でjarファイル全体を歩いて読み、そこからそれを読みたいと思うかもしれません.

于 2013-02-27T17:18:39.073 に答える
0

これは私が最終的に使用した方法です...

String path = Test.class.getProtectionDomain()
            .getCodeSource().getLocation().getPath();

    path = path.replace("classes/", "");

    URL url = null;
    try {
        url = new URL("jar:file:"+path+"test.jar!/");
        JarURLConnection jarConnection = null;
        try {
            jarConnection = (JarURLConnection)url.openConnection();
            Manifest manifest = jarConnection.getManifest();

            java.util.jar.Attributes manifestItem = manifest.getMainAttributes();
            System.out.println(manifestItem.getValue("Test"));
            System.out.println(manifestItem.getValue("Implementation-Version"));


        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }

そのすべてのパス操作とjar名のハードコーディングでかなり汚れています...これは問題ですか? もう一度ありがとう!

于 2013-02-28T19:02:04.587 に答える
0

「テスト」メイン属性ではありません。

getEntries()を試して、そこでカスタム属性を調べてください。

于 2013-02-27T16:40:23.910 に答える