我正在尝试将我的 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/