繁体   English   中英

在使用gradle构建的shadowJar中使用truezip

[英]using truezip in shadowJar built with gradle

我有一个用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包含所有必需的类,但是也许缺少某些东西?

我怎么知道哪个班级,哪个包不见了? 还有什么可能导致这个?

将其运行在日食之外...

谢谢你的帮助。

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

因此,您需要修复创建uber-JAR的工具的配置。 如果您将Maven与maven-shade-plugin ,则只需添加ServicesResourceTransformer请参阅https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#ServicesResourceTransformer

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

Eclipse可以读取Maven项目并从中建立其元数据,因此也许您想考虑将您的项目转换为使用Maven(如果尚未使用)。

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

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

shadowJar {
    mergeServiceFiles()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM