2014-11-18 16 views
5

Sto tentando di esportare la mia applicazione di primavera da glassfish 4 a JBoss wildfly 8.xo 9 alpha, ma quando la mia applicazione inizia in una parte di il mio codice genera l'eccezione:JBoss wildfly 8.x Provider "vfs" non installato quando si utilizzano i percorsi java nio

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 

nella mia classe BaseEntityInitializer in quella linea eccezione ho:

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

dove path suo un percorso pacchetto come com.something.model, quindi perché nel mio server GlassFish 4 questo funziona perfettamente e quello di cui ho bisogno usarlo in wildfly? non so cosa manca in wildfly o se ho bisogno di includere qualche libreria.

risposta

3

Capita di funzionare per caso in GlassFish. Da nessuna parte nel contratto ClassLoader (o nella specifica della piattaforma JavaEE) viene specificato che tipo di URL si torna indietro. In GlassFish ClasLoder probabilmente si tratta di un URL jar:// o file:// con il quale si verifica un FileSystemProvider (jar:// solo per errore BTW). In WildFly questo è un URL VB JBoss. Ci sono vari hack che puoi applicare per farlo funzionare per ora, ma non tutti possono nascondere il fatto che stai facendo affidamento su un comportamento non portatile. Stai meglio usando qualcosa come URL#openStream() invece è portatile e dovrebbe quindi funzionare ovunque.

Aggiornamento

Che cosa si può provare a fare è fare di più in fase di compilazione. Le opzioni includono:

  • Eseguire la trasformazione con Javassist in fase di compilazione. Ciò riduce anche le possibilità di conflitti con la spedizione Javassist con WildFly.
  • Raccogliere le informazioni sulle risorse in fase di compilazione e memorizzarle in un file in una posizione ben nota. È possibile avere lo stesso nome file in più JAR poiché ClassLoader#getResources(String) può restituire più risultati.

Se fornisci informazioni più specifiche sul problema che stai cercando di risolvere, potrei essere in grado di fornire risposte più specifiche.

+0

grazie, hai un codice di esempio o un URL dove posso vedere come usarlo per la classe Paths? –

+0

A cosa serve il 'Percorso'? Vuoi solo leggere una risorsa o vuoi elencare tutte le risorse in una cartella? –

+2

ho bisogno di leggere tutte le risorse in una cartella (pacchetto) e ottenere i loro nomi come com.package.otherpachage.classname, perché sto usando javassist così come posso leggere le risorse di un pacchetto usando inputput o come posso installare vfs per java nio ? non trovo nulla a riguardo –

0

Questa è la mia soluzione come iterare file/directory oltre a 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

aggiungere il seguente jboss-deployment-structure.xml

<deployment> 

    <dependencies> 

     <system export="true"> 

      <paths> 

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

      </paths> 

     </system> 

    </dependencies> 

</deployment> 

Problemi correlati