簡體   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