перечисление всех файлов в банке веб-приложения - PullRequest
1 голос
/ 06 января 2011

Учитывая, что приложение веб-запуска состоит из нескольких jar-файлов, как я могу перечислить файлы, содержащиеся в этих jar-файлах?(во время выполнения)

Заранее спасибо,

Арно

РЕДАКТИРОВАТЬ:

Проблема, с методом, упомянутым ниже (что очень похоже на то, что я использовал до сих пор), это то, что каким-то образом путь к классу изменяется при вызове webstart.На самом деле, он больше не ссылается на ваши банки, а вместо deploy.jar.

Как следствие, если вы запустите java -cp myjars test.ListMyEntries, он будет правильно печатать содержимое ваших банок.С другой стороны, через веб-запуск вы получите содержимое deploy.jar, потому что именно так определяется путь к классу при запуске через Интернет.Я не нашел никаких следов оригинальных имен jar ни в одном из свойств системы / развертывания.

Пример вывода:

Entries of jar file /usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/deploy.jar
META-INF/
META-INF/MANIFEST.MF
com/sun/deploy/
com/sun/deploy/ClientContainer.class
com/sun/deploy/util/
com/sun/deploy/util/Trace$TraceMsgQueueChecker.class

Ответы [ 4 ]

2 голосов
/ 06 января 2011

Да, вы можете .. Но вы должны подписать банку, в которой находится класс, и дать все разрешения ..

static void displayJarFilesEntries(){
    String cp = System.getProperty("java.class.path");
    String pathSep = File.pathSeperator;  
    String[] jarOrDirectories = cp.split(pathSep);
    for(String fileName : jarOrDirectories){
        File file = new File(fileName);
        if(file.isFile()){
            JarFile jarFile;
            try{
                jarFile = new JarFile(fileName);
            } catch(final IOException e){
                throw new RuntimeException(e);
            }
            System.out.println(" Entries of jar file " + jarFile.getName());
            for(final Enumeration<JarEntry> enumJar = jarFile.entries(); enumJar
                .hasMoreElements();){
                JarEntry entry = enumJar.nextElement();
                System.out.println(entry.getName());
            }
        }
    }
}
0 голосов
/ 31 июля 2017

Вот как я это сделал:

public static List<String> listResourceFiles(ProtectionDomain protectionDomain, String endsWith) throws IOException
{
    List<String> resources = new ArrayList<>();

    URL jar = protectionDomain.getCodeSource().getLocation();
    ZipInputStream zip = new ZipInputStream(jar.openStream());

    while(true)
    {
        ZipEntry e = zip.getNextEntry();
        if(e == null) break;
        String name = e.getName();

        if(name.endsWith(endsWith)) resources.add(name);
    }

    return resources;
}
List<String> workflowFilePaths = AppUtils.listResourceFiles(getClass().getProtectionDomain(), ".bpmn20.xml");
0 голосов
/ 06 января 2011

Вы пытались использовать

System.getProperty("java.class.path");

В качестве альтернативы, вы можете использовать JMX:

RuntimeMXBean bean = /* This one is provided as default in Java 6 */;
bean.getClassPath();
0 голосов
/ 06 января 2011

Если у нас есть доступ к диску для этих jar-файлов (что, я думаю, у нас было бы), то класс jdk JarFile можно использовать для открытия и перебора содержимого файла jar.Каждая запись, содержащаяся в перечислении, возвращаемом методом entry, является именем класса в jar.

...