Java 使用带有无效.class的JarOutputStream生成的JAR

Java 使用带有无效.class的JarOutputStream生成的JAR,java,jar,Java,Jar,我的目标是获取一些.class的流并创建一个JAR 问题是JAR创建的存储了.class,但不能用作类路径(它只是找不到类)。JAR没有损坏,如果我解压缩JAR,我可以使用.class。 那么,如果这个代码 @Test public void createJARTest() throws IOException { final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); fi

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

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

@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有三个未记录的怪癖:

  • 目录名必须以“/”斜杠结尾
  • 路径必须使用“/”斜杠,而不是“\”
  • 条目不能以“/”斜杠开头
  • 所以,解决方案就是换一行:

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