2016-04-17 16 views
0

私は、外部JARプラグインをメインアプリケーションに読み込むシンプルなプラグインシステムを持っています。私はMountainblade Modularを使用しています。どのように彼らは "フードの下で"それを行うか分からないが、おそらくそれは何かの標準です。外部JARから画像を読み取る

これはうまくいきます。私は外部のjarからクラスをインスタンス化し、すべて動作します。一部のプラグインにはアイコン/イメージが付いています。私は、外部JARのイメージを読み込み/参照する方法について少し不明です(メインJARのコンテキストで実行されるように、その外部JAR内のコードを使用します)

これにはどのようにアプローチすればよいですか?

+0

ここで、JARファイルはクラスパスに関連していますか? –

+0

私はこの解決策についてはあまりよく分かりませんが、ABCがあなたのクラスならば、 そしてABC.class.getClassLoader.getResource()が助けになるかもしれません。 –

+0

@TimBiegeleisenは、メインのメインアプリjarがビルドされたときに基本的に、他の外部ジャーはプラグインフォルダにあります。 –

答えて

1

この問題はそれほど単純ではありません。

外部のjarからクラスをロードすると、JVMに「ロード」されます。 JVMに「ロードする」とは、JVMがメモリ内のストレージを担当することを意味します。通常、それは次のように行われます。

ClassLoader myClassLoader = new MyClassLoader(jarFileContent); 
Class myExtClass = myClassLoader.loadClass(myClassName); 

リソースをクラスパスのjarファイルからは、これらのjarファイルがクラスパスにあるので、私は彼らの場所が知られている意味、

InputStream resourceStream = myClass.getResourceAsStream("/myFile.txt"); 

あなたはそれを行うことができますで簡単にアクセスすることができます。これらのファイルはメモリに保存されません。リソースにアクセスすると、JVMはクラスパスjar(ファイルシステムなど)でリソースを検索できます。

しかし、外部の瓶の場合、それは全く異なります。瓶はどこからも来ず、一旦処理されて忘れられます。 JVMはメモリからリソースをロードしません。これらのファイルにアクセスするには、手動でストレージを整理する必要があります。これを一度やったので、コードを共有することができます。基本的な考え方を理解するのに役立ちます(ただし、おそらくあなたの特定の図書館では役に立ちません)。

// Method from custom UrlClassLoader class. 
// jarContent here is byte array of loaded jar file. 
// important notes: 
// resources can be accesed only with this custom class loader 
// resource content is provided with the help of custom URLStreamHandler 
@Override 
protected URL findResource(String name) {  
    JarInputStream jarInputStream; 
    try { 
     jarInputStream = new JarInputStream(new ByteArrayInputStream(jarContent)); 
     JarEntry jarEntry; 
     while (true) { 
      jarEntry = jarInputStream.getNextJarEntry(); 
      if (jarEntry == null) { 
       break; 
      } 
      if (name.equals(jarEntry.getName())) { 
       final byte[] bytes = IOUtils.toByteArray(jarInputStream); 
       return new URL(null, "in-memory-bytes", new URLStreamHandler() { 
        @Override 
        protected URLConnection openConnection(URL u) throws IOException { 
         return new URLConnection(u) { 
          @Override 
          public void connect() throws IOException { 
           // nothing to do here 
          } 
          @Override 
          public InputStream getInputStream() throws IOException { 
           return new ByteArrayInputStream(bytes); 
          } 
         }; 
        } 
       }); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
関連する問題