2011-01-06 14 views
1

複数のjarファイルで構成されるWebstartアプリケーションがある場合、これらのjarファイルに含まれるファイルをどのようにリストできますか?事前にWebstartedアプリケーションのjarファイル内のすべてのファイルを一覧表示

おかげで、

アルノー

EDIT(実行時に):

問題、下にmentionned方法で(私が今まで使用したものと非常に似ています)、 webstartを呼び出すときに何とかクラスパスが変更されるということです。確かに、それはあなたの瓶をもう参照しませんが、代わりにdeploy.jarです。

java -cp myjars test.ListMyEntriesを実行すると、JARの内容が正しく印刷されます。一方、webstart経由では、deploy.jarの内容を取得します。これは、webstarted時にクラスパスが定義される方法であるためです。システム/デプロイメントのいずれのプロパティでも、元の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 
+0

一覧それら? – jzd

答えて

0

私たちは、その後、JDKのJarFileクラスが開き、jarファイルの内容を反復処理するために使用することができます(私は、我々が持っていると思う)これらのjarファイルへのディスクアクセスを持っている場合。 entriesメソッドによって返されるEnumerationに含まれる各エントリは、jar内のクラス名です。

+1

主な問題は、Java Web Startでは、Jarファイルがどこにどのように格納されているのかを決定しないことです。 – Gnoupi

2

はい

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

PS: 'String pathSep = System.getProperty(" path.separator ");を使用する必要があります。 String [] jarOrDirectories = cp.split(pathSep); 'セパレータはプラットフォームによって異なる可能性があります。 – dagnelies

+0

あなたは正しいです:) –

+1

'File.pathSeparator'は' System.getProperty(...) 'よりも優れています。 – sjr

0

は、あなたが代わりに

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

を使用してみましたが、あなたはJMXを使用することができます..あなたのことが可能..しかし、あなたはクラスが存在するjarファイルに署名し、すべての権限を与える必要があります。

RuntimeMXBean bean = /* This one is provided as default in Java 6 */; 
bean.getClassPath(); 
0

これが私のやり方です:

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"); 
関連する問題