簡體   English   中英

使用通配符從多個jar加載資源

[英]Loading resources from multiple jars with wild card

我有一個帶有多個模塊的Java應用程序,每個模塊都有一個jar文件。 每個jar文件都遵循稱為META-INF/props相同文件夾結構,java中是否可以使用通配符加載多個jar的`META-INF / props中的所有屬性文件?

就像是

ClassLoader.getSystemResourceAsStream("META-INF/props/*.properties");

我知道此方法不接受通配符,並且不返回流數組,但是可以這樣做嗎?

不,沒有標准/可靠的方法可以做到這一點。 某些庫利用ClassLoader.getResources實現的常見模式(特別是它們通常總是返回“ file:”或“ jar:file:” URL)來支持資源查找中的通配符。 例如, 應用程序上下文構造函數資源路徑中通配符解釋了Spring如何做到這一點,並列出了一些警告(“對可移植性的影響”,“ Classpath *:可移植性”,“與通配符有關的注釋”)。

我寫了一些代碼來解決這個限制。

我從類路徑中讀取所有條目,並確定它是文件夾還是JAR文件,然后在“ META_INF / props”中查找條目。 如果條目是屬性,則將其加載。

下面是代碼,雖然沒有精煉,但給出了總體思路。

try{
    URL[] urls = ((URLClassLoader) LoaderTest.class.getClassLoader()).getURLs();
    HashMap<String, Properties> mapProperties = new HashMap<String, Properties>();

    for(URL url: urls){
        File file = new File(url.getFile());
        if(file.isDirectory()){
            System.out.println("Directory: " +file.getName());
            File propFolder = new File(file.getAbsolutePath() + "/META-INF/props");
            if (propFolder.exists() && propFolder.isDirectory()){
                for(File f: propFolder.listFiles()){
                    if(f.getName().endsWith("properties") || f.getName().endsWith("props")){
                        Properties props = new Properties();
                        props.load(new FileReader(f));
                        String appName = props.getProperty("load.global.props.appName");
                        if(appName != null){
                            if( mapProperties.get(appName) == null) {
                                mapProperties.put(appName, props);
                            } else {
                                mapProperties.get(appName).putAll(props);
                            }
                        }
                    }
                }
            }
        } else if (file.getName().endsWith("jar")){
            System.out.println("Jar File: " + file.getName());
            JarFile jarFile = null; 
            try{
                jarFile = new JarFile(file);
                Enumeration<JarEntry> entries = jarFile.entries();
                while ( entries.hasMoreElements() ){
                    JarEntry entry = entries.nextElement();
                    if ( entry.getName().startsWith("META-INF/props") && 
                            (entry.getName().endsWith("properties") ||
                            entry.getName().endsWith("props"))){
                        System.out.println("Prop File: " + entry.getName());
                        Properties props = new Properties();
                        props.load(jarFile.getInputStream(entry));
                        String appName = props.getProperty("load.global.props.appName");
                        if(appName != null){
                            if( mapProperties.get(appName) == null) {
                                mapProperties.put(appName, props);
                            } else {
                                mapProperties.get(appName).putAll(props);
                            }

                        }
                    }
                }
            } finally {
                if ( jarFile != null ) jarFile.close();
            }
        }
    }

} catch(Exception e){
    e.printStackTrace();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM