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());

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.

5
demandé sur Diego Fernando Murillo Valenci 2014-11-18 21:34:43

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.

3
répondu Philippe Marschall 2014-12-09 15:42:24

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());
}
0
répondu Piotr Korlaga 2017-09-01 08:32:33

ajouter le texte suivant jboss-deployment-structure.xml

<deployment>

    <dependencies>

        <system export="true">

            <paths>

                <path name="com/sun/nio/zipfs" />

            </paths>

        </system>

    </dependencies>

</deployment>

0
répondu En NuNYet de Can CalÇadA 2017-12-08 15:27:07