我的目标是获取一些 .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 有三个未记录的怪癖:
- 目录名称必须以“/”斜杠结尾。
- 路径必须使用“/”斜杠,而不是“\”
- 条目不得以“/”斜杠开头。
所以,解决方案只是改变一行:
final JarEntry entry = new JarEntry( "com/app/MyClass.class" );
关于java - 使用 JarOutputStream 生成的 JAR 具有无效的 .class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46417158/