sustain/src/main/java/net/happyonroad/component/core/support/ComponentURLStreamHandlerFactory.java
public File getMappingFile(URL url) throws IOException {
        if (componentFiles == null) initFastIndexes("app", "lib", "repository");
        String fileName = FilenameUtils.normalize(url.getFile(), true);
        if( !fileName.endsWith(".jar") ) fileName = fileName + ".jar";
        if( fileName.startsWith("boot/") || fileName.startsWith("boot\\") ){
            fileName = "net.happyonroad/" + FilenameUtils.getName(fileName);
        }else if(fileName.startsWith("lib/") || fileName.startsWith("lib\\")){/* Only 3rd lib file will be put into jar classpath*/
            //正常的组件component url里面肯定不是lib开头；
            // 但是 spring-component-framework的Class-Path指定的那些url被normalize之后却会如此
            fileName  = ComponentUtils.relativePath(fileName);
        }
        File componentFile = componentFiles.get(fileName);
        if( componentFile == null )
        {
            // 当第一次建立的快速索引中没有相应文件时
            // 尝试看lib下后来有没有相应的文件
            componentFile = guessFile(url, "app", "lib", "repository");
            if( componentFile == null )
                throw new IOException("there is no component named as " + fileName);
        }
        return componentFile;
    }
public File getMappingFile(URL url) throws IOException {
        if (componentFiles == null) initFastIndexes("app", "lib", "repository");
        String fileName = FilenameUtils.normalize(url.getFile(), true);
        if( !fileName.endsWith(".jar") ) fileName = fileName + ".jar";
        if( fileName.startsWith("boot/") || fileName.startsWith("boot\\") ){
            fileName = "net.happyonroad/" + FilenameUtils.getName(fileName);
        }else if(fileName.startsWith("lib/") || fileName.startsWith("lib\\")){/* Only 3rd lib file will be put into jar classpath*/
            //正常的组件component url里面肯定不是lib开头；
            // 但是 spring-component-framework的Class-Path指定的那些url被normalize之后却会如此
            fileName  = ComponentUtils.relativePath(fileName);
        }
        File componentFile = componentFiles.get(fileName);
        if( componentFile == null )
        {
            // 当第一次建立的快速索引中没有相应文件时
            // 尝试看lib下后来有没有相应的文件
            componentFile = guessFile(url, "app", "lib", "repository");
            if( componentFile == null )
                throw new IOException("there is no component named as " + fileName);
        }
        return componentFile;
    }
Get the real file of component url
@param url the component url
@return the real file
@throws IOException