TrueZip类无法实例化

时间:2015-08-19 23:25:45

标签: java classloader truezip

有一个小程序在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等)。

编译期间没有错误,但是,当我尝试在main方法中运行时:

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中实例化

Boot是一个内部和静态的最终类 http://grepcode.com/file/repo1.maven.org/maven2/de.schlichtherle.truezip/truezip-kernel/7.7.9/de/schlichtherle/truezip/socket/sl/IOPoolLocator.java#IOPoolLocator

我发现很少有参考资料,但遗憾的是不太有帮助。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我想你是否会在分隔的行中添加这些TrueZip类路径条目?

在这种情况下,我的解决方案是:将它们添加到一行中,路径用逗号分隔","

尝试深入调试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)。