java - 使用 java nio 路径时未安装 JBoss wildfly 8.x Provider "vfs"

标签 java jboss wildfly

我正在尝试将我的 spring 应用程序从 glassfish 4 导出到 JBoss wildfly 8.x 或 9 alpha,但是当我的应用程序在我的代码的某些部分启动时抛出异常:

Caused by: java.lang.RuntimeException: java.nio.file.FileSystemNotFoundException: Provider "vfs" not installed
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:218)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:87)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:72)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
    ... 3 more
Caused by: java.nio.file.FileSystemNotFoundException: Provider "vfs" not installed
    at java.nio.file.Paths.get(Paths.java:147) [rt.jar:1.7.0_72]
    at com.springmvcangular.backend.utils.entity.BaseEntityInitializer.extendsEntities(BaseEntityInitializer.java:123)
    at com.springmvcangular.backend.utils.entity.BaseEntityInitializer.initializeBaseEntities(BaseEntityInitializer.java:88)
    at com.springmvcangular.backend.config.ApplicationInitializer.onStartup(ApplicationInitializer.java:60)
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:178)
    ... 7 more

在我的类 BaseEntityInitializer 中,在该异常行中我有:

packagepath = Paths.get(this.getClass().getClassLoader()
                            .getResource(path.replace('.', '/')).toURI());

path 是一个类似 com.something.model 的包路径,那么为什么在我的 glassfish 4 服务器中它工作得很好,我需要什么才能在 wildfly 中使用它?我不知道 wildfly 缺少什么,或者我是否需要包含一些库。

最佳答案

它碰巧在 GlassFish 中起作用。 ClassLoader 契约(或 Java EE 平台规范)中没有任何地方指定您返回哪种类型的 URL。在 GlassFish ClasLoder 中,它可能恰好是 jar://file:// URL,其中恰好有一个 FileSystemProvider (jar:// 顺便说一句)。在 WildFly 中,URL 恰好是一个 JBoss VFS URL。您可以应用各种 hack 来使其暂时工作,但它们都无法掩盖您依赖不可移植行为的事实。你最好使用像 URL#openStream() 这样的东西,它是可移植的,因此应该可以在任何地方工作。

更新

您可以尝试做的是在编译时做更多的事情。选项包括:

  • 在编译时使用 Javassist 进行转换。这也减少了与 WildFly 随附的 Javassist 发生冲突的可能性。
  • 在编译时收集有关资源的信息,并将其存储在一个众所周知位置的文件中。您可以在多个 JAR 中使用相同的文件名,因为 ClassLoader#getResources(String) 可以返回多个结果。

如果您提供有关您要解决的问题的更具体的信息,我可能会给出更具体的答案。

关于java - 使用 java nio 路径时未安装 JBoss wildfly 8.x Provider "vfs",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27001497/

相关文章:

java - 如何在包外访问 protected 内部类?

java - JBOSS部署报错javax.management.InstanceNotFoundException

java - 我们如何在远程 jboss 8.2 wildfly 服务器中部署ear文件?

wildfly - Wildfly 10 中的内容类型问题

java - 在 TimSort 方法中调用什么方法?

java - 如何在不使用事务的情况下使用 JDBC/jTDS 执行存储过程?

javascript - 数据库日期和今天日期之间的差异

security - JBoss - server.xml 连接器未正确配置证书识别

java - 在 Java Batch 中从读取器获取属性

java - Jboss 上的 Logback 在记录时重复前缀和新行