1

我有一个用 gradle 编译的 shadowJar,它使用 truezip 从 zip 文件中获取一些文件。

我使用它得到了这个异常:

Exception in thread "main" java.util.ServiceConfigurationError: file (Unknown file system scheme! May be the class path doesn't contain the respective driver module or it isn't set up correctly?)
    at de.schlichtherle.truezip.fs.FsAbstractCompositeDriver.newController(FsAbstractCompositeDriver.java:33)
    at de.schlichtherle.truezip.fs.FsDefaultManager.getController0(FsDefaultManager.java:95)
    at de.schlichtherle.truezip.fs.FsDefaultManager.getController(FsDefaultManager.java:78)
    at de.schlichtherle.truezip.file.TBIO.getInputSocket(TBIO.java:280)
    at de.schlichtherle.truezip.file.TFileInputStream.newInputStream(TFileInputStream.java:101)
    at de.schlichtherle.truezip.file.TFileInputStream.<init>(TFileInputStream.java:95)

我设置了这样的archiveDetector:

final TArchiveDetector ad = new TArchiveDetector("foo", new ZipDriver(IOPoolLocator.SINGLETON));
TConfig.get().setArchiveDetector(ad);

当我想制作这样的输入流时抛出异常:

final TFileInputStream is = new TFileInputStream(thefile);

据我所知,shadowJar 包含所有必要的类,但也许缺少一些东西?

我怎么知道哪个类,哪个包丢失了?还有什么可能导致这种情况?

把它从日食中运行出来......

谢谢你的帮助。

4

2 回答 2

1

这是创建 uber-JAR 时的常见问题:META-INF/services/*需要附加的各个条目。但是,默认情况下,许多工具会在创建 uber-JAR 时简单地覆盖它们。结果,ServiceLoader该类无法找到所有必要的插件(例如文件系统驱动程序),这就是该异常所抱怨的。

因此,您需要修复创建 uber-JAR 的工具的配置。如果您maven-shade-pluginMavenServicesResourceTransformer.

另一种选择是根本不使用 uber-JAR,这是使用 Maven 时的默认设置。

Eclipse 可以读取 Maven 项目并从中建立元数据,因此您可能需要考虑将您的项目转换为使用 Maven——如果您还没有这样做的话。

于 2015-08-20T07:02:37.947 回答
0

我有同样的问题。经过一番研究,我找到了以下解决方案:

在您的 build.gradle 添加以下内容:

shadowJar {
    mergeServiceFiles()
}
于 2019-01-09T09:11:48.680 回答