2012-01-09 12 views
1

非アプレットのJavaコードでうまく機能するメソッドを使用してファイルのリストを取得しようとしています。JavaアプレットのJAR内のファイルのリストを取得する

私はそれが乱雑であることを完全に承知しています。私はこれを学校の仕事のために働かせようとしています。 (私はJavaのファンではありません)

 CodeSource src = MemoryButtonHelper.class.getProtectionDomain().getCodeSource(); 
     if (src == null) { 
      throw new Exception(); 
     } 

     URL jar = src.getLocation(); 
     System.out.println("Loading from " + jar); 

     JarFile zf=new JarFile(jar.toString()); //jar.openStream()); 

     final Enumeration<JarEntry> entries = zf.entries(); 

     while (entries.hasMoreElements()) { 
      final JarEntry ze = entries.nextElement(); 

      if(ze.getName().endsWith(".jpg") || ze.getName().endsWith(".png")) 
      { 
       System.out.println("Adding " + ze.getName()); 
       slikeList.add(ze.getName()); 
      } 
     } 
     zf.close(); 

残念ながら、セキュリティの例外が発生しています。

java.security.AccessControlException: access denied (java.lang.RuntimePermission getProtectionDomain) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374) 
    at java.security.AccessController.checkPermission(AccessController.java:546) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
    at java.lang.Class.getProtectionDomain(Class.java:2106) 
    at hr.tvz.programiranje.java.deseti.helpers.MemoryButtonHelper.getSlike(MemoryButtonHelper.java:75) 
     … ad nauseam … 

Java Consoleによると、println("Loading from " + jar)の前に例外が発生しているようです。

これは、JARファイルからイメージのリストを取得する必要があると具体的に言われるボーナスポイントの割り当てです。これがアプレットとの最初の出会いであるので、私は画像のリストを取得するために私が何ができるのかよくわかりません。

+0

'getProtectionDomain()。getCodeSource()' 1.5または1.6より前の時代のセキュリティアップデートは、アプレットとJWSアプリケーションの両方でJarの場所としてJarの元のソースを提供します。 (信頼できるものでさえ)。または、より短いバージョン。それは動作しません。 –

答えて

2

..私たちはJARファイルからイメージのリストを取得する必要があります。

誰が最初にそれらを入れましたか?答えが「行った」場合、解決策は簡単です。

  • ジャーに(例えばimages/imagelist.txt)既知の場所に画像パス/名のリストを含みます。
  • getResource(String)を使用してリストへの参照を取得します。
  • (おそらくラインリーダーを使用して)リストを読んでください。

は、どうやら彼らは、あるとして私は、余分なメタデータなしに、jarファイルの内容を一覧表示します。

OK。 ZipファイルへのURLを(したがってInputStreamから)作成することができれば、それからZipInputStreamを確立することが可能です。これは、URLがローカルファイルシステムまたはにまだキャッシュされているZip/Jarに対応するかどうかに関係なく動作します。

  1. JarへのURLを取得します。
  2. URLからZipInputStreamを確立します。
  3. は、潜在的な試合のために各1を調べnull
  4. までgetNextEntry()を使用してエントリを反復処理し、それがない場合は、ArrayListに追加します。

もちろん、保護ドメインを呼び出すにはまだ&という信頼できるコードが署名されている必要があります。


イメージ(未テスト)これを試して、瓶にURLを取得するには、同じJARに間違い

です。アプレットがcom.our.BookingAppletであると仮定しましょう。二つの部分を提供する URL urlToApplet = this.getClass().getResource("/com/our/BookingApplet.class")

  • String[] parts = urlToApplet.toString().split("!")
    を用い
    1. クラスが存在するjarファイルへのURLを取得

      は、最初は、JAR URLのString表現であろう。前回の更新で説明したように、その後URLを使用し、URLを確立するString
    2. 使用。
  • +0

    私はそれを考えました。残念ながら、私は割り当てが私にそれを望んでいるとは思わない。どうやら彼らは、余分なメタデータなしで、そのままの状態でjarの内容をリストしてほしいと思っています。 –

    +0

    画像は確かに同じJARにあります。私があなたを正しく理解している場合、 'getProtectionDomain()。getCodeSource()'を使ってJARへのパスを取得しないようにすれば、 'ZipInputStream'、' JarInputStream'などを使うことは全く問題ありません。 –

    +0

    *「絶対に問題はありません」*セキュリティ上の制限はありません。私が話していないその他の問題。 –

    0

    「署名済み」アプレットのみがファイルシステムにアクセスできます。読み込んでいるjarファイルがローカルファイルシステム上にある場合は、最初にアプレットに署名する必要があります。

    アプレットに署名する方法の詳細については、thisリンクを参照してください。

    +0

    HTTPサーバーに格納されたアプレットの内容を読み取る場合も同じことが適用されますか? –

    +0

    情報ありがとう!しかし、未署名のアプレットは、HTTPサーバーに格納されているJARの内容に自由にアクセスできます。また、「信頼できない」自己生成証明書で署名しても、アプレットはローカルファイルシステムからブラウザ内で開かれたときにアクセスすることができませんでした。さらにわかりやすいチュートリアルとして、http://www-personal.umich.edu/~lsiden/tutorials/signed-applet/signed-applet.htmlを提案します。 –

    1

    彼のexcellent answerさんのおかげでアンドリュートンプソンさんに感謝します!彼の助けがなければ、私はこれを理解することができないだろうから、代わりに(またはそれに加えて)彼の答えを明確にupvote。

    ここでは、.jpg.pngのファイルをJARファイル内にフェッチするために使用したコードの部分を示します。おそらく、MemoryGameクラスが格納されているパッケージの名前を変更するだけでなく、クラス自体の名前を変更する必要があることに注意してください。あなたが疑問に思う場合

     List<String> slikeList = new ArrayList<String>(); 
    
         URL urlToApplet = MemoryGame.class.getResource("/com/whoever/whatever/gui/MemoryGame.class"); 
         String[] parts = urlToApplet.toString().split("!"); 
         String jarURLString = parts[0].replace("jar:", ""); 
         System.out.println("Loading from " + jarURLString); 
    
         URL jar = new URL(jarURLString); 
    
         URLConnection jarConnection = jar.openConnection(); 
         JarInputStream jis = new JarInputStream(jarConnection.getInputStream()); 
    
         JarEntry je = jis.getNextJarEntry(); 
         while(je != null) 
         { 
          System.out.println("Inspecting " + je); 
          if(je.getName().endsWith(".jpg") || je.getName().endsWith(".png")) 
          { 
           System.out.println("Adding " + je.getName()); 
           slikeList.add(je.getName()); 
          } 
          je = jis.getNextJarEntry(); 
         } 
    

    、運動の仕様で指定された変数の多くはクロアチアにあるのでslikeクロアチア語でimagesを意味します。

    関連する問題