0

注:これは、ここでの私の質問のフォローアップです。


ディレクトリの内容を取得し、すべてをJARファイルにバンドルするプログラムがあります。これを行うために使用するコードは次のとおりです。

    try
    {
        FileOutputStream stream = new FileOutputStream(target);
        JarOutputStream jOS = new JarOutputStream(stream);

        LinkedList<File> fileList = new LinkedList<File>();
        buildList(directory, fileList);

        JarEntry jarAdd;

        String basePath = directory.getAbsolutePath();
        byte[] buffer = new byte[4096];
        for(File file : fileList)
        {
            String path = file.getPath().substring(basePath.length() + 1);
            path.replaceAll("\\\\", "/");
            jarAdd = new JarEntry(path);
            jarAdd.setTime(file.lastModified());
            jOS.putNextEntry(jarAdd);

            FileInputStream in = new FileInputStream(file);
            while(true)
            {
                int nRead = in.read(buffer, 0, buffer.length);
                if(nRead <= 0)
                    break;
                jOS.write(buffer, 0, nRead);
            }
            in.close();
        }
        jOS.close();
        stream.close();

つまり、すべてが順調で、jarが作成され、7-zipでその内容を調べると、必要なすべてのファイルが含まれています。ただし、URLClassLoaderを介してJarのコンテンツにアクセスしようとすると(jarはクラスパス上になく、意図しないため)、nullポインター例外が発生します。

奇妙なことに、EclipseからエクスポートしたJarを使用すると、そのコンテンツに好きなようにアクセスできます。これは、私がどういうわけか正しくJarを作成しておらず、何かを省略していると私に信じさせます。上記の方法に欠けているものはありますか?

4

1 に答える 1

1

この質問に基づいて理解しました-問題は、バックスラッシュを適切に処理していないことでした。

修正コードはこちら:

        FileOutputStream stream = new FileOutputStream(target);
        JarOutputStream jOS = new JarOutputStream(stream);

        LinkedList<File> fileList = new LinkedList<File>();
        buildList(directory, fileList);

        JarEntry entry;

        String basePath = directory.getAbsolutePath();
        byte[] buffer = new byte[4096];
        for(File file : fileList)
        {
            String path = file.getPath().substring(basePath.length() + 1);
            path = path.replace("\\", "/");
            entry = new JarEntry(path);
            entry.setTime(file.lastModified());
            jOS.putNextEntry(entry);
            FileInputStream in = new FileInputStream(file);
            while(true)
            {
                int nRead = in.read(buffer, 0, buffer.length);
                if(nRead <= 0)
                    break;
                jOS.write(buffer, 0, nRead);
            }
            in.close();
            jOS.closeEntry();
        }
        jOS.close();
        stream.close();
于 2012-06-16T21:43:47.837 に答える