0

URLClassLoaderクラスは、以下にリストされたコードを使用してプログラムで作成されたjarからクラスをロードできませんが、jar cf%jarname%%sources%を使用して同じクラスでjarを作成すると、正常に機能します。jarcfJarOutputStreamを使用して作成されたjarに違いはありますか?

public static ByteArrayInputStream createJar(File file) throws IOException {
    Manifest manifest = new Manifest();
    manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    JarOutputStream target = new JarOutputStream(bytes, manifest);
    for (File child : file.listFiles()) {
        addJarEntries(child, target, "");
    }
    target.flush();
    target.close();
    return new ByteArrayInputStream(bytes.toByteArray());
}

private static void addJarEntries(File source, JarOutputStream target, String path) throws IOException {
    BufferedInputStream in = null;
    try
    {
        if (source.isDirectory())
        {
            String name = path +source.getName() + File.separator;
            for (File nestedFile: source.listFiles())
                addJarEntries(nestedFile, target, name);
            return;
        }

        in = new BufferedInputStream(new FileInputStream(source));

        JarEntry entry = new JarEntry(path + source.getName());
        entry.setTime(source.lastModified());
        target.putNextEntry(entry);
        while (true)
        {
            int count = in.read(buffer);
            if (count == -1)
                break;
            target.write(buffer, 0, count);
        }
        target.closeEntry();
    }
    finally
    {
        if (in != null)
            in.close();
    }
}

よろしく、ケシャフ

4

1 に答える 1

1

このjarコマンドはJarOutputStreamJARファイル(ソースコード)を作成するために使用するため、そのクラス自体のせいではありません。ただし、JAR作成プロセスの重要なステップを見逃した可能性があります。たとえば、不正な形式のマニフェストが含まれている可能性があります。

コードをコマンドのソースコードと比較して、jar重要なことを見逃していないかどうかを確認できるはずです。

于 2012-07-10T14:31:25.000 に答える