2

TrueZip 6 で問題なく動作する小さなプログラムがあります。最近、プロジェクトのクラスパスに 6 つのパッケージを追加して、TrueZip jar をバージョン 7.7.9 に更新しました: truezip-driver-file、truezip-driver-tar、truezip-driver-zip 、truezip-file、truezip-kernel、および truezip-swingと必要なすべての依存関係 (xz 1.5 など)。

ただし、メイン メソッドで実行しようとすると、コンパイル中にエラーは発生しません。

TConfig.get().setArchiveDetector(
    new TArchiveDetector(TArchiveDetector.NULL, new Object[][] {
        { "tar", new TarDriver(IOPoolLocator.SINGLETON) },
        { "tgz|tar.gz", new TarGZipDriver(IOPoolLocator.SINGLETON) },
        { "zip|alt|alib", new ZipDrive(IOPoolLocator.SINGLETON) } })); 

de.schlichtherle.truezip.socket.sl.IOPoolLocator$Boot を IOPoolLocator でインスタンス化できなかったことを示しています

ブートは内部の静的最終クラスです http://grepcode.com/file/repo1.maven.org/maven2/de.schlichtherle.truezip/truezip-kernel/7.7.9/de/schlichtherle/truezip/socket/sl/ IOPoolLocator.java#IOPoolLocator

参考文献はほとんど見つかりませんでしたが、残念ながらあまり役に立ちませんでした。

4

1 に答える 1

1

私は同じ問題を抱えていましたが、これらの TrueZip クラスパス エントリを別々の行に追加していると思いますか?

この場合、私の解決策は次のとおりです。パスをコンマ「、」で区切って1行に追加します

JVM のクラス Boot の最初のインスタンス化から実際のエラーを深く掘り下げてデバッグしてみてください。

static final IOPool<?> pool;
static {
    final Class<?> clazz = IOPoolLocator.class;
    final Logger logger = Logger.getLogger(clazz.getName(), clazz.getName());
    final ServiceLocator locator = new ServiceLocator(clazz.getClassLoader());
    pool = decorate((IOPool) create(locator, logger), locator, logger);
}

最後に、後の例外のソースである行に移動することがわかります。

this.l1 = null != loader ? loader : ClassLoader.getSystemClassLoader();

基本的に ServiceLoader または ClassLoader を使用しています。main メソッドでテストを実行します。

aClassLoader.getResourceAsStream("/META-INF/services/de.schlichtherle.truezip.socket.spi.IOPoolService") 

6 つの jar ファイルのそれぞれに含まれるさまざまなクラスを使用すると、truezip-kernel.jar 内のクラスだけが IOPoolService を見つけることができることがわかります。これは、すべての jar ファイルが異なるローダー (同じオブジェクト ID ではない) によってロードされるためです。

于 2015-08-20T12:33:36.103 に答える