当前位置: 首页 > 面试题库 >

ZipFileSystemProvider无法识别JIMFS

边明煦
2023-03-14
问题内容

我有一个jimfs(内存文件系统中的Google)从字节数组中创建的zip文件。当尝试使用打开该文件时ZipMemoryFileSystem,出现错误,提示无法识别该提供程序。我的代码如下:

public static void test(byte[] document) {
    try {
         try (FileSystem memoryFileSystem = Jimfs.newFileSystem(Configuration.unix())) {
            Files.write(memoryFileSystem.getPath("/file.zip"), document);
            URI uri = URI.create("jar:" + memoryFileSystem.getPath("/file.zip").toUri());
            Map<String, String> env = Collections.singletonMap("create", "false");
            try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
                //do something                  
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

URI类似于:jar:jimfs://bb2c779f-d327-4e2f-9841-bd04785f1365/file.zip

堆栈跟踪为:

java.nio.file.FileSystemNotFoundException: Provider "jimfs" not installed
    at java.nio.file.Paths.get(Paths.java:158)
    at com.sun.nio.zipfs.ZipFileSystemProvider.uriToPath(ZipFileSystemProvider.java:97)
    at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:119)
    at java.nio.file.FileSystems.newFileSystem(FileSystems.java:337)
    at java.nio.file.FileSystems.newFileSystem(FileSystems.java:287)
    at office.ImfsTest.test(ImfsTest.java:88)
    at office.ImfsTest.main(ImfsTest.java:58)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
    at java.lang.reflect.Method.invoke(Method.java:508)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
    at java.lang.Thread.run(Thread.java:785)

jimfs未与一起列出FileSystemProvider.installedProviders()。它位于ZipFileSystemProvider分别Thread.currentThread().getContextClassLoader()
ClassLoader.getSystemClassLoader().getParent()for
相比的单独的类加载器中FileSystemZipProvider

提供者的打印如下:

IM Provider:com.google.common.jimfs.JimfsFileSystemProvider@ed301b1f IM Scheme:jimfs IM Class Loader:java.net.URLClassLoader@4940e7a2
Installed Provider:sun.nio.fs.LinuxFileSystemProvider@d83a6d85 Scheme:file Class Loader:null
Installed Provider:com.sun.nio.zipfs.ZipFileSystemProvider@110a4ec7 Scheme:jar Class Loader:sun.misc.Launcher$ExtClassLoader@59a155ab

我尝试基于jimfs ClassLoaderTest示例手动设置类加载器,但没有成功。我在Linux上运行。

二手jimfs 1.1(也试过2.0快照与修复
https://github.com/google/jimfs/commit/3299e69f75cf524e6d101d88e8c202c1b24bf25a的问题31)。

我如何使我的代码工作?


问题答案:

解决方案:
基于SO问题如何在运行exec:java时注册SPI实现,我理解类加载器问题是由于该代码是通过maven exec:java 运行的。使用普通的jar运行代码即可解决问题!



 类似资料:
  • 我有以下序列

  • 我不确定这是否是一个与我没有这台计算机的管理权限有关的问题。任何帮助,以便我可以进一步排除故障,将非常感谢! 谢谢

  • 问题内容: 我使用,当我得到 我删除了构建路径,然后又做了 ,仍然是同样的错误。 问题答案: 该代码不是Java SE的一部分,因此这些类将不在JRE中。您需要找到并下载包含这些类的JAR文件,然后将其添加到Eclipse构建路径中。 (可以在此处下载JAR的一个地方,但是如果此链接中断,可以轻松进行自己的搜索。请转到Maven Central或findjar。)

  • 问题内容: 有时,我会在页面上寻找可能存在或不存在的元素。我想用/尝试/捕获这种情况,当某些HTML元素不存在时,selenium会抛出该异常。原始例外: 具有讽刺意味的是,它不会让我捕捉到之前抛出的异常吗?代码在这里: 错误在这里: 谷歌搜索/文档整理一无所获…让我感到奇怪的是,selenium可以引发异常但不能捕获它。 问题答案: 您需要先导入异常 然后你可以参考它

  • 问题内容: 我的Java代码有问题。我正在尝试加密文件。但是,当我运行Java代码时,我得到“ java.security.InvalidKeyException:无效的AES密钥长度:162个字节”。 这是代码: 该错误发生在“ KeyPairGenerator keyGen = KeyPairGenerator.getInstance(“ AES”);“行。 问题答案: AES是一种对称算法,

  • 问题内容: 我正在尝试通过使用摩卡咖啡和酶来更新单元测试。我正在测试的代码是在ES6中,使用JSX和React。 我无法在我的测试脚本中在JSX上获得“摩卡”错误。 测试脚本: }); gulpfile.js: 输出为: 我通过通过browserify运行源代码并将其放在测试目录中来证明它不是mocha / enzyme本身,从而成功运行了该测试。我的问题只是试图正确解决大口魔术。 问题答案: 对