2013-07-02 16 views
0

我已經打包爲後續的應用程序:Spring配置文件裝載不工作的WebSphere 7

+EAR 
    +WAR 
    +ejb.jar 
    +lib 
    +core.jar 
    +plugin1.jar 
    +plugin2.jar 
    ... 

每個「pluginX.jar」包含根彈簧的配置文件。 應用程序啓動時,將core.jar添加試圖加載彈簧的配置文件:

這非常適用於JBoss的EAP 5.1,但不爲WebSphere 7

我試圖直接加載資源:

ClassLoader cl = this.getClass().getClassLoader(); 
log.info("class loader: " + cl.toString()); 
URL u = cl.getResource("Plugin.1.spring.xml"); 

,並得到了相同的結果,雖然日誌的WebSphere告訴當地的類路徑中包含「pluginX.jar」:

[email protected] [應用程式:CG EAR]

本地CLASSPATH: /opt/IBM/WAS7/AppServer/profiles/srv01/installedApp/cell01/CG.EAR.ear /lib/pluginX.jar
家長:[email protected]
代表團模式:PARENT_LAST

什麼想法?

+0

'classpath *:/./ Plugin。*。spring.xml'應該是什麼意思?爲什麼這樣複雜的模式? – fnt

+0

它是一種Ant風格的模式,用於查找每個文件xml,如「Plugin.1.spring.xml」。它適用於JBoss –

+0

已解決:似乎Spring類** PathMatchingResourcePatternResolver **不能遍歷WebSphere中的jar文件。 javadocs類聲稱:「如果獲得了一個jar URL,解析器必須能夠從它獲得一個java.net.JarURLConnection,或手動解析jar的URL,以便能夠遍歷jar的內容,並解析通配符,這將在大多數環境中工作,但在其他環境中會失敗......「 –

回答

0

這是一個Classloader問題。 我建議您嘗試更改您的EAR和WAR類加載策略。

我們有一個非常類似的部署,我們配置像這樣爲6:去WAS控制檯,訪問企業應用 =>您的應用程序 =>類加載器常規屬性集:

類加載器訂單:「加載應用程序類加載器拳頭的類」。

戰爭類加載器策略:「應用程序中每個WAR文件的類加載器」。

關於源代碼下面的代碼片段更安全,並建議以避免類加載器加載的問題資源時:

Thread.currentThread().getContextClassLoader().getResource("Plugin.1.spring.xml"))

希望它可以幫助!

1

我今天打了同樣的問題與WebSphere 8.5, 它看起來像問題是,在中ClassLoader.getResources()返回協議「文件」的網址,而不是「罐子」在某些情況下不返回的jar共享庫中的文件作爲單獨的資源URL,但共享庫位置(例如包含JAR的文件夾)作爲單個資源URL。這似乎將PathMatchingResourcePatternResolver混淆在某個地方。

我解決它通過

  1. 覆蓋convertClassLoaderURL方法,如果該URL的協議是「file」,並且擴展名是「的.jar」明確實例化一個JAR資源,
  2. 覆蓋doFindPathMatchingFileResources方法在代表目錄的資源內搜索JAR文件。
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext() { 

    protected ResourcePatternResolver getResourcePatternResolver() { 
     return new ServletContextResourcePatternResolver(this) { 

      protected Resource convertClassLoaderURL(URL url) { 
       if (url.getProtocol().equals("file") && url.getFile().endsWith(".jar")) { 
        try { 
         return new UrlResource("jar", url + "!/"); 
        } catch (final MalformedURLException ex) { 
         //LOG.catching(ex); 
        } 
       } 
       return new UrlResource(url); 
      } 

      protected Set<Resource> doFindPathMatchingFileResources(Resource rootDirResource, String subPattern) throws IOException { 
       Set<Resource> matches = super.doFindPathMatchingFileResources(rootDirResource, subPattern); 
       try { 
        File rootDir = rootDirResource.getFile(); 
        if (rootDir.isDirectory()) { 
         Set<Resource> containedJARs = doFindMatchingFileSystemResources(rootDir, "*.jar"); 
         for (Resource jar : containedJARs) { 
          Set<Resource> matchingResourcesFoundInJar = doFindPathMatchingJarResources(convertClassLoaderURL(jar.getURL()), subPattern); 
          matches.addAll(matchingResourcesFoundInJar); 
         } 
        } 
       } catch (final IOException ex) { 
        // LOG.catching(ex); 
       } 
       return matches; 
      } 

     } 

    }; 

這種變化也擺脫了日誌消息:

WARN org.springframework.core.io.support.PathMatchingResourcePatternResolver: 
* Skipping [.m2/repository/org/springframework/spring-webmvc/4.1.2.RELEASE/spring-webmvc-4.1.2.RELEASE.jar] because it does not denote a directory 
相關問題