1

java-webstartを使用してダウンロードしたjarファイルからいくつかのファイルを抽出しようとしています。以下のコードを使用して、jarを検索し、ファイルシステムを開始しました

1 final ProtectionDomain domain = this.getClass().getProtectionDomain();
2 final CodeSource source = domain.getCodeSource();
3 final URL url    = source.getLocation();
4 final URI uri    = url.toURI();
5 Path jarPath = Paths.get(uri);
6
7 FileSystem fs = FileSystems.newFileSystem(jarPath, null);

これは、jarファイルがローカルディスク上にある場合は正常に機能しますが、JWSシナリオの5行目で失敗します。

ログによると:url = http:// localhost:8080 / myjarfile.jar

java.nio.file.FileSystemNotFoundException: Provider "http" not installed
at java.nio.file.Paths.get(Unknown Source)

JWSを正しく理解していれば、myjarfile.jarはすでにキャッシュにダウンロードされているため、http用のFileSystemProviderを実装してmyjarfile.jarからコンテンツを取得するのは時間がかかり複雑に思えます。では、どのように進めるかについての良いアイデアはありますか?

4

2 に答える 2

1

以下はあなたのアイデアAndrewの実装です、それは私がここで見つけたDirUtilパッケージを利用しています:http: //codingjunkie.net/java-7-copy-move/

public class Zipper {

    private static final String TEMP_FILE_PREFIX = "temp-";
    private static final String TEMP_FILE_SUFIX = ".jar";

    private Logger logger = Logger.getLogger(getClass().getName());

    public Path extractProgram(String locationOfEmbeddedJar, String installDir) {
        Path installPath = null;
        try {
            installPath = Paths.get(installDir);
            if (Files.isDirectory(installPath)) {
                logger.warn("program already installed");
            } else {
                installPath = Files.createDirectory(installPath);
                Path tempJar = Files.createTempFile(TEMP_FILE_PREFIX,
                        TEMP_FILE_SUFIX);
                this.extractEmbeddedJar(locationOfEmbeddedJar, tempJar.toFile());

                logger.warn("in jarfile");
                // in jar file
                FileSystem fs = FileSystems.newFileSystem(tempJar, null);
                Path programPath = fs.getPath("/");

                logger.warn("programPath=" + programPath + " fileSystem="
                        + programPath.getFileSystem());

                DirUtils.copy(programPath, installPath);
            }
        } catch (IOException e) {
            logger.warn(e);
        }

        return (installPath);

    }

    private void extractEmbeddedJar(String locationOfEmbeddedJar,
            File locationOfTargetJar) {
        logger.warn("extractEmbeddedJar() " + locationOfEmbeddedJar);
        ClassLoader loader = this.getClass().getClassLoader();

        InputStream inputStream = loader
                .getResourceAsStream(locationOfEmbeddedJar);
        try {
            OutputStream out = new FileOutputStream(locationOfTargetJar);
            byte buf[] = new byte[1024];
            int len;
            while ((len = inputStream.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            out.close();
            inputStream.close();

        } catch (IOException e) {
            logger.warn(e);
        }
    }
}
于 2012-07-03T04:58:16.203 に答える
1

ログには次のように記載されています:url = http:// localhost:8080 / myjarfile.jar

これは、Oracleが買収する前にSunが行ったセキュリティ上の決定でした。彼らは、それがアプレットやJWSアプリのビジネスではないと判断しました。ローカルファイルシステム上のリソースの場所を知るために、リソースがローカルおよびアプリにキャッシュされている場合でも、返されるURIは常にサーバーを指すようになります。all-permissionsセキュリティレベルがあります。

では、どのように進めるかについての良いアイデアはありますか?

アプリを再設計します。それが唯一の実用的な解決策です。

コンテンツに対してZipまたはJarを反復処理する方法はいくつかありますが、最も簡単な方法は、Jarの既知の場所にコンテンツのリストを含め、を使用してコンテンツを検索し、それをgetResource()読み取ってから、各リソースを抽出することです。

于 2012-06-26T19:54:18.377 に答える