Spring配置文件加载在WebSphere 7上不起作用

Spring配置文件加载在WebSphere 7上不起作用,spring,jakarta-ee,jboss,websphere,classpath,Spring,Jakarta Ee,Jboss,Websphere,Classpath,我的应用程序打包如下: +EAR +WAR +ejb.jar +lib +core.jar +plugin1.jar +plugin2.jar ... 每个“pluginX.jar”根目录中都包含一个spring配置文件。 当应用程序启动时,core.jar会尝试加载spring配置文件: String matchString = "classpath*:/./Plugin.*.spring.xml"; PathMatch

我的应用程序打包如下:

+EAR
  +WAR
  +ejb.jar
  +lib
     +core.jar
     +plugin1.jar
     +plugin2.jar
     ...
每个“pluginX.jar”根目录中都包含一个spring配置文件。 当应用程序启动时,core.jar会尝试加载spring配置文件:

String matchString = "classpath*:/./Plugin.*.spring.xml";
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources(matchString);
这适用于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”:

com.ibm.ws.classloader。CompoundClassLoader@48da48da[应用程序:CG EAR]

本地类路径: /opt/IBM/WAS7/AppServer/profiles/srv01/installedApp/cell01/CG.EAR.EAR/lib/pluginX.jar
父级:com.ibm.ws.classloader。ProtectionClassLoader@4c654c65
委派模式:父\上一次

有什么想法吗?

这是类加载器的问题。 我建议您尝试为EAR和WAR更改类加载策略

我们有一个非常类似的部署,我们在WAS 6中的配置如下:转到WAS控制台,访问企业应用程序=>您的应用程序=>类加载器并在常规属性下设置:

类装入器顺序:“用应用程序类装入器装入的类”

War类加载器策略:“应用程序中每个War文件的类加载器”

关于源代码,下面的代码段比较安全,建议在加载资源时避免类加载问题:

Thread.currentThread().getContextClassLoader().getResource(“Plugin.1.spring.xml”)


希望能有帮助

我今天在WebSphere 8.5中遇到了同样的问题, 问题似乎在于,ClassLoader.getResources()返回的URL是协议“file”而不是“jar”,在某些情况下,不会将共享库中的jar文件作为单独的资源URL返回,而是将共享库位置(例如,包含jar的文件夹)作为单个资源URL返回。这似乎混淆了道路上的某个地方的
路径匹配源模式解析程序

我用计算机解决了它

  • 如果URL协议为“file”,扩展名为“.JAR”,则覆盖
    convertClassLoaderURL
    方法并显式实例化JAR资源,以及
  • 覆盖
    doFindPathMatchingFileResources
    方法,以在JAR文件中搜索表示目录的资源
  • AnnotationConfigWebApplicationContext applicationContext=新的AnnotationConfigWebApplicationContext(){
    受保护的ResourcePatternResolver getResourcePatternResolver(){
    返回新的ServletContextResourcePatternResolver(此){
    受保护的资源转换器ClassLoaderUrl(URL){
    if(url.getProtocol().equals(“file”)和&url.getFile().endsWith(“.jar”)){
    试一试{
    返回新的url资源(“jar”,url+“!/”);
    }捕获(最终畸形){
    //原木捕获(ex);
    }
    }
    返回新的url资源(url);
    }
    受保护集doFindPathMatchingFileResources(Resource rootDirResource,String子模式)引发IOException{
    Set matches=super.dofindpathmachingfileresources(rootDirResource,子模式);
    试一试{
    File rootDir=rootDirResource.getFile();
    if(rootDir.isDirectory()){
    Set containedJARs=doFindMatchingFileSystemResources(rootDir,“*.jar”);
    for(资源jar:containedJARs){
    设置matchingResourcesFoundInJar=doFindPathMatchingJarResources(convertClassLoaderURL(jar.getURL()),子模式);
    matches.addAll(matchengresourcesfoundinjar);
    }
    }
    }捕获(最终IOEX){
    //原木捕获(ex);
    }
    返回比赛;
    }
    }
    };
    
    此更改还将删除日志消息:

    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
    

    虽然这适用于WAS8:我偶然发现了这条线索,但它可能值得一提


    有这样一个设置:“com.ibm.ws.webcontainer.skipmetanfersourcesprocessing”您可能需要将其从websphere配置中删除(如果有人设置),或者将其值设置为false。

    什么是“classpath*://Plugin.*.spring.xml”应该是什么意思?为什么会有这么复杂的模式?这是一个用于查找每个xml文件的Ant样式模式“Plugin.1.spring.xml”。它在JBossSOLVED上工作:似乎spring类PathMatchingResourcePatternResolver无法遍历WebSphere中的jar文件。类javadocs状态:如果获得jar URL,解析程序必须能够从中获取java.net.jarUrl连接,或者手动解析jar URL,才能遍历jar的内容并解析通配符。这在大多数环境中都有效,但在其他环境中会失败…”