2014-11-18 8 views
5

Próbuję wyeksportować moją aplikację wiosenną z Glassfish 4 do JBoss wildfly 8.x lub 9 alpha, ale kiedy moja aplikacja zaczyna się w jakiejś części mój kod wyrzuca wyjątek:JBoss wildfly 8.x Dostawca "vfs" nie jest zainstalowany podczas używania java nio Paths

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 

w mojej klasie BaseEntityInitializer w tej linii wyjątków mam:

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

gdzie path jego ścieżka pakiet jak com.something.model, więc dlaczego w moim serwerze GlassFish 4 to działa doskonale i czego potrzebuję używać go w wildfly? nie wiem, czego brakuje w wildfly lub czy muszę dołączyć jakąś bibliotekę.

Odpowiedz

3

Zdarza się przypadkiem w GlassFish. Nigdzie w umowie ClassLoader (lub specyfikacji platformy JavaEE) nie określono, jakiego rodzaju URL otrzymasz. W GlassFish ClasLoder prawdopodobnie jest to adres URL o adresie jar:// lub file://, którym przypadkowo jest FileSystemProvider (jar:// tylko przez przypadek BTW). W WildFly jest to adres URL VFS JBoss. Istnieje wiele hacków, które można zastosować, aby działały na czas, ale nie wszystkie ukrywają fakt, że polegasz na nie przenośnym zachowaniu. Lepiej jest użyć czegoś takiego, jak URL#openStream() zamiast tego, ponieważ jest przenośne i dlatego powinno działać wszędzie.

Aktualizacja

Co można spróbować zrobić, to zrobić więcej w czasie kompilacji. Opcje obejmują:

  • Dokonaj transformacji za pomocą Javassist podczas kompilacji. Zmniejsza to również ryzyko konfliktów z wysyłką Javassist z WildFly.
  • Zbierz informacje o zasobach w czasie kompilacji i przechowuj je w pliku w dobrze znanej lokalizacji. Możesz mieć tę samą nazwę pliku w wielu plikach JAR, ponieważ ClassLoader#getResources(String) może zwracać wiele wyników.

Jeśli podasz bardziej szczegółowe informacje na temat problemu, który próbujesz rozwiązać, być może będę mógł podać bardziej szczegółowe odpowiedzi.

+0

dzięki, masz kod przykład lub adres URL, gdzie mogę zobaczyć, jak go używać w klasie Paths? –

+0

Do czego potrzebna jest "ścieżka"? Czy chcesz po prostu czytać zasób lub chcesz wyświetlić listę wszystkich zasobów w folderze? –

+2

Muszę przeczytać wszystkie zasoby w folderze (pakiecie) i uzyskać ich nazwy takie jak com.package.otherpachage.classname, ponieważ używam javassist, więc w jaki sposób mogę odczytać zasoby pakietu za pomocą inputstream lub jak zainstalować vfs dla java nio ? Nic nie znajduję –

0

To jest moje rozwiązanie jak iteracyjne nad pliki/katalogi w JBoss Application Server:

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

dodać następujące jboss-deployment-structure.xml

<deployment> 

    <dependencies> 

     <system export="true"> 

      <paths> 

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

      </paths> 

     </system> 

    </dependencies> 

</deployment>