Getting a directory inside a .jar

后端 未结 8 1510
悲哀的现实
悲哀的现实 2020-12-11 04:48

I am trying to access a directory inside my jar file. I want to go through every of the files inside the directory itself. I tried, for example, using the following:

<
8条回答
  •  情深已故
    2020-12-11 04:54

    What you are looking for here might be the JarEntry list of the Jar... I had done some similar work during grad school... You can get the modified class here (http://code.google.com/p/marcellodesales-cs-research/source/browse/trunk/grad-ste-ufpe-brazil/ptf-add-on-dev/src/br/ufpe/cin/stp/global/filemanager/JarFileContentsLoader.java) Note that the URL contains an older Java class not using Generics...

    This class returns a set of URLs with the protocol "jar:file:/" for a given token...

    package com.collabnet.svnedge.discovery.client.browser.util;
    
    import java.io.IOException;
    import java.net.URL;
    import java.util.Enumeration;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
    
    public class JarFileContentsLoader {
    
        private JarFile jarFile;
    
        public JarFileContentsLoader(String jarFilePath) throws IOException {
            this.jarFile = new JarFile(jarFilePath);
        }
    
        /**
         * @param existingPath an existing path string inside the jar.
         * @return the set of URL's from inside the Jar (whose protocol is "jar:file:/"
         */
        public Set getDirEntries(String existingPath) {
            Set set = new HashSet();
            Enumeration entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                String element = entries.nextElement().getName();
                URL url = getClass().getClassLoader().getResource(element);
                if (url.toString().contains("jar:file")
                        && !element.contains(".class")
                        && element.contains(existingPath)) {
                    set.add(url);
                }
            }
            return set;
        }
    
        public static void main(String[] args) throws IOException {
            JarFileContentsLoader jarFileContents = new JarFileContentsLoader(
                    "/u1/svnedge-discovery/client-browser/lib/jmdns.jar");
            Set entries = jarFileContents.getDirEntries("impl");
            Iterator a = entries.iterator();
            while (a.hasNext()) {
                URL element = a.next();
                System.out.println(element);
            }
        }
    
    }
    

    The output would be:

    jar:file:/u1/svnedge-discovery/client-browser/lib/jmdns.jar!/javax/jmdns/impl/constants/
    jar:file:/u1/svnedge-discovery/client-browser/lib/jmdns.jar!/javax/jmdns/impl/tasks/state/
    jar:file:/u1/svnedge-discovery/client-browser/lib/jmdns.jar!/javax/jmdns/impl/tasks/resolver/
    jar:file:/u1/svnedge-discovery/client-browser/lib/jmdns.jar!/javax/jmdns/impl/
    jar:file:/u1/svnedge-discovery/client-browser/lib/jmdns.jar!/javax/jmdns/impl/tasks/
    

提交回复
热议问题