JBoss wildfly 8.le fournisseur x" vfs " n'est pas installé lorsque vous utilisez java nio Paths
j'essaie d'exporter mon application printanière de glassfish 4 à JBoss wildfly 8.X ou 9 alpha, mais quand mon application commence dans une partie de mon code lance l'exception:
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
dans ma classe BaseEntityInitializer
dans cette ligne d'exception j'ai:
packagepath = Paths.get(this.getClass().getClassLoader()
.getResource(path.replace('.', '/')).toURI());
où path
est un chemin de paquet comme com.something.model
, alors pourquoi dans mon serveur glassfish 4 cela fonctionne parfaitement et ce dont j'ai besoin pour l'utiliser dans wildfly? je ne sais pas ce qui est manquant dans wildfly ou si je dois inclure une bibliothèque.
3 réponses
il se trouve que cela fonctionne par hasard dans GlassFish. Nulle part dans le contrat ClassLoader
(ou la spécification de la plate-forme JavaEE) il n'est précisé quel type de URL
vous obtenez de retour. Dans le Classodeur GlassFish, il se trouve probablement qu'il s'agit d'une URL jar://
ou file://
avec laquelle il se trouve qu'il y a un FileSystemProvider ( jar://
seulement par accident BTW). Dans WildFly, il se trouve que C'est une URL VFS de JBoss. Il ya divers hacks que vous pouvez appliquer pour faire cela fonctionne pour le moment, mais ils tous Je ne peux pas cacher le fait que vous comptez sur un comportement non portable. Vous êtes mieux à l'aide de quelque chose comme URL#openStream()
à la place avec est portable et devrait donc travailler partout.
mise à Jour
Ce que vous pouvez essayer de faire, c'est plus au moment de la compilation. Les Options comprennent:
- faire la transformation avec Javassist au moment de la compilation. Cela réduit également les risques de conflits avec les Javassist expédition avec WildFly.
- rassembler l'information sur les ressources au moment de compiler et de stocker dans un fichier à un endroit bien connu. Vous pouvez avoir le même nom de fichier dans plusieurs pots que
ClassLoader#getResources(String)
peut retourner plusieurs résultats.
si vous fournissez des informations plus précises sur le problème que vous essayez de résoudre, je pourrais peut-être donner des réponses plus spécifiques.
C'est ma solution comment itérer sur les fichiers/répertoires dans Wildfly:
List<String> fileNames = new LinkedList<>();
URL resourceUrl = getClass().getResource("/your/path");
VirtualJarInputStream virtualJarInputStream = (VirtualJarInputStream) resourceUrl.openStream();
JarEntry next = null;
while ((next = virtualJarInputStream.getNextJarEntry()) != null) {
fileNames.add(next.getName());
}
ajouter le texte suivant jboss-deployment-structure.xml
<deployment>
<dependencies>
<system export="true">
<paths>
<path name="com/sun/nio/zipfs" />
</paths>
</system>
</dependencies>
</deployment>