java - 使用 JarOutputStream 生成的 JAR 具有无效的 .class

标签 java jar

我的目标是获取一些 .class 的流并创建一个 JAR。

问题是创建的 JAR 存储了 .class,但不能用作类路径(它只是找不到类)。 JAR 没有损坏,如果我解压 JAR,我就可以使用 .classes。 那么,这段代码有什么问题呢?

@Test
public void createJARTest() throws IOException
{
    final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    final JarOutputStream jarOutputStream = new JarOutputStream( byteArrayOutputStream );

    final String path = "/com/app/MyClass.class";

    final JarEntry entry = new JarEntry( path );
    jarOutputStream.putNextEntry( entry );

    final BufferedInputStream in = new BufferedInputStream( this.getClass().getResourceAsStream(path) );

    final byte[] buffer = new byte[1024];
    int bytesRead = 0;
    while ( (bytesRead = in.read( buffer )) != -1 )
    {
        jarOutputStream.write( buffer, 0, bytesRead );
    }
    in.close();
    jarOutputStream.closeEntry();

    jarOutputStream.close();

    byteArrayOutputStream.writeTo( new FileOutputStream("/Downloads/classpath.jar") );
    byteArrayOutputStream.close();
}

最佳答案

我发现了问题:

JarOutputStream 有三个未记录的怪癖:

  1. 目录名称必须以“/”斜杠结尾。
  2. 路径必须使用“/”斜杠,而不是“\”
  3. 条目不得以“/”斜杠开头。

所以,解决方案只是改变一行:

final JarEntry entry = new JarEntry( "com/app/MyClass.class" );

关于java - 使用 JarOutputStream 生成的 JAR 具有无效的 .class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46417158/

相关文章:

java - 读取jar文件中的目录

java - 更新 Web 应用程序中的属性文件

java - 如何在eclipse中查看导入类的代码?

java - 如何实例化一个类 "annotation processed"?

java - jar 抛出 NoClassDefFoundError

netbeans - 如何将 lib 中的 jars 包含到 Netbeans 中的项目 jar 文件中?

java - 何时使用用户 Java 关键字“抛出用户定义的异常”?

maven - 我如何解释依赖路径?

java - 如何从我的程序创建可执行 jar 文件,以便通过双击或从命令行运行它?

JAVA NIO ZIP 文件系统相当于 ZipOutputStream setLevel