2

私のコードは JAR ファイル内で実行され、そのファイルの完全なパスを取得する必要があります。たとえば、私の JAR は example.jar と呼ばれ、D:\example\ にあるため、その jar 内のコードで "D:\example\example.jar" を取得する必要があります。そのパスを取得するために多くの方法を試しましたが、どれも正しく機能しませんでした。

それらの1つは

getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()

多くの人がこれでうまくいくと言っていますが、私には "rsrc:./" が返されます。

その後検索したところ、MANIFEST.MF に次のものが含まれていることがわかりました。

Manifest-Version: 1.0
Rsrc-Class-Path: ./
Class-Path: .
Rsrc-Main-Class: Example
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

それが何を意味するのかわかりませんが、そのRsrcのものを削除して他のものをそれに置き換えると、jarが壊れていると表示されます. これがうまくいかない原因だと思います。これが何を意味するか知っている人はいますか?

PS: BAT ファイルを使用して JAR を実行しています。

4

5 に答える 5

0
package com.example;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

public class HomeJar {

    public static void main(String[] args) throws IOException {

        URL u = HomeJar.class.getProtectionDomain().getCodeSource().getLocation();

        File f = new File(u.getPath().toString());

        if (!f.isFile()) {
            throw new RuntimeException("'" + u + "' isn't a jar");
        }

        try (JarInputStream jis = new JarInputStream(new BufferedInputStream(new FileInputStream(f)))) {
            JarEntry je = jis.getNextJarEntry();
            while (je != null) {
                System.out.println(je.getName());
                je = jis.getNextJarEntry();
            }
        }
    }

}
于 2016-06-20T16:26:41.867 に答える
0

新しいワークスペースを作成し、すべてのプロジェクトをそこに移動したところ、すべてが正常に機能するようになりました。バグか何かだったと思います...助けてくれてありがとう!

于 2016-06-23T20:41:43.003 に答える