2014-11-18 16 views
5

Tôi đang cố gắng xuất ứng dụng mùa xuân từ glassfish 4 sang JBoss wildfly 8.x hoặc 9 alpha, nhưng khi ứng dụng của tôi bắt đầu trong một số phần mã của tôi ném ngoại lệ:JBoss wildfly 8.x Nhà cung cấp "vfs" chưa được cài đặt khi sử dụng java nio Đường dẫn

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 

trong lớp học của tôi BaseEntityInitializer trong dòng ngoại lệ tôi có:

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

nơi path mình một con đường gói như com.something.model, vậy tại sao trong máy chủ glassfish 4 của tôi này hoạt động hoàn hảo và những gì tôi cần sử dụng nó trong wildfly? tôi không biết những gì còn thiếu trong wildfly hoặc nếu tôi cần phải bao gồm một số thư viện.

Trả lời

3

Điều đó sẽ xảy ra khi có cơ hội trong GlassFish. Không nơi nào trong hợp đồng ClassLoader (hoặc đặc tả nền tảng JavaEE) là nó được chỉ định loại URL bạn quay lại. Trong GlassFish ClasLoder nó có thể xảy ra là một jar:// hoặc file:// URL mà có xảy ra là một FileSystemProvider (jar:// chỉ do tai nạn BTW). Trong WildFly, điều này xảy ra là một URL Voss JBoss. Có nhiều hack khác nhau mà bạn có thể áp dụng để làm cho nó hoạt động ngay bây giờ nhưng tất cả chúng đều không thể che giấu sự thật rằng bạn đang dựa vào hành vi không di động. Bạn nên sử dụng một cái gì đó như URL#openStream() thay vì với di động và do đó nên làm việc ở khắp mọi nơi.

Cập nhật

Những gì bạn có thể cố gắng làm là làm nhiều hơn tại thời gian biên dịch. Các tùy chọn bao gồm:

  • Thực hiện chuyển đổi với Javassist lúc biên dịch. Điều này cũng làm giảm cơ hội xung đột với việc vận chuyển Javassist với WildFly.
  • Thu thập thông tin về tài nguyên tại thời gian biên dịch và lưu trữ nó trong một tệp tại một vị trí nổi tiếng. Bạn có thể có cùng tên tệp trong nhiều JAR như ClassLoader#getResources(String) có thể trả về nhiều kết quả.

Nếu bạn cung cấp thêm thông tin cụ thể về sự cố bạn đang cố giải quyết, tôi có thể cung cấp thêm câu trả lời cụ thể.

+0

cảm ơn, bạn có một mã số ví dụ hoặc url nơi tôi có thể xem cách sử dụng nó cho lớp Đường dẫn? –

+0

Bạn cần 'Đường dẫn' để làm gì? Bạn chỉ muốn đọc một tài nguyên hay bạn muốn liệt kê tất cả các tài nguyên trong một thư mục? –

+2

tôi cần phải đọc tất cả các tài nguyên trong một thư mục (gói) và lấy tên của chúng như com.package.otherpachage.classname, bởi vì tôi đang sử dụng javassist vì vậy làm thế nào tôi có thể đọc tài nguyên gói bằng cách sử dụng inputstream hoặc cách cài đặt vfs cho java nio ? tôi không tìm thấy gì về nó –

0

Đây là giải pháp của tôi làm thế nào để lặp qua các tập tin/thư mục trong 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

thêm jboss-deployment-structure.xml sau

<deployment> 

    <dependencies> 

     <system export="true"> 

      <paths> 

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

      </paths> 

     </system> 

    </dependencies> 

</deployment> 

Các vấn đề liên quan