1

次の構造の JAR ファイルがあります。

com
-- pack1
   -- A.class
-- pack2
   -- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.class

Linux と Windows の両方でファイル名が長すぎると表示されますpack2/AA...AA.class(ファイル名は 262 バイトです)。JAR ファイル内での名前変更も機能しません。

この問題を解決し、長いクラス ファイルを読み取り可能にする方法はありますか?

4

2 に答える 2

2

このページには、ファイル システムの通常の制限がリストされています: http://en.wikipedia.org/wiki/Comparison_of_file_systems

「制限」セクションでわかるように、255 文字を超えるファイル システムはほとんどありません。

唯一のチャンスは、ファイルを抽出し、長すぎるファイル名を短くするプログラムを作成することです。Java は少なくともアーカイブを開くことができるはずです (jar -tvfコンテンツを一覧表示してみてください。それが機能する場合は、切り捨ても同様に機能するはずです)。

于 2013-11-13T15:36:16.410 に答える
2

java.util.jarそれを処理できます:

try {
    JarFile jarFile = new JarFile("/path/to/target.jar");
    Enumeration<JarEntry> jarEntries = jarFile.entries();
    int i = 0;
    while (jarEntries.hasMoreElements()) {
        JarEntry jarEntry = jarEntries.nextElement();
        System.out.println("processing entry: " + jarEntry.getName());
        InputStream jarFileInputStream = jarFile.getInputStream(jarEntry);
        OutputStream jarOutputStream = new FileOutputStream(new File("/tmp/test/test" + (i++) + ".class")); // give temporary name to class
        while (jarFileInputStream.available() > 0) {
            jarOutputStream.write(jarFileInputStream.read());
        }
        jarOutputStream.close();
        jarFileInputStream.close();
    }
} catch (IOException ex) {
    Logger.getLogger(JARExtractor.class.getName()).log(Level.SEVERE, null, ex);
}

出力test<n>.classはクラスごとになります。

于 2013-11-15T17:54:46.260 に答える