2017-02-22 18 views
0

jarファイルに格納されたクラスを読み込もうとしています。jarのロードクラスを切り捨てるとクラスファイルが切り詰められる

私はこの

private void registerClasses(Path jar, List<String> classNames) throws IOException { 
    JarFile jarFile = new JarFile(jar.toFile()); 
    Enumeration<JarEntry> e = jarFile.entries(); 
    while (e.hasMoreElements()) { 
     JarEntry je = e.nextElement(); 
     if (je.isDirectory() || !je.getName().endsWith(".class")) { 
      continue; 
     } 

     String className = je.getName().substring(0, je.getName().length() - 6).replace('/', '.'); 
     if (classNames.contains(className)) { 
      LOGGER.info("Found class in jar [{}].", className); 
      InputStream stream = new JarInputStream(jarFile.getInputStream(je)); 
      byte[] classBytes = IOUtils.toByteArray(stream); // empty array 
      Class<?> clz = this.defineClass(className, classBytes, 0, classBytes.length); 
      LOGGER.info("Defined class: [{}].", clz.getClass()); 
     } 
    } 
} 

のように行うと私はjava.lang.ClassFormatError: Truncated class filebyteArrayが空のように見えるもらいます。

何が問題ですか?

+0

.classファイルが空ではありませんか? – EJP

+0

はい。私はIDEで構築されたアーティファクトを提供します – lapots

答えて

0

私は過去にこの問題に遭遇したことを覚えており、解決策を思い出しました。私はこのような入力ストリームを作成します。

InputStream stream = new JarInputStream(jarFile.getInputStream(je)); 

しかし、すでにInputStreamを返す新しいJarInputStreamgetInputStreamとして作成する必要はありません。だから私はこれに変更しました

InputStream stream = jarFile.getInputStream(je); 

それが働き始めました。

関連する問題