具体代码如下:
private String javaClassPath = "";
private byte[] readerBuffer = new byte[4096];
private void addFileToJar(File source, JarOutputStream target) throws IOException
{
BufferedInputStream in = null;
try
{
if (source.isDirectory())
{
for (File nestedFile : source.listFiles())
{
addFileToJar(nestedFile, target);
}
return;
}
String middleName = source.getPath().replace("\\", "/").substring(javaClassPath.length());
if (middleName.startsWith("/"))
{
middleName = middleName.substring(1);
}
JarEntry entry = new JarEntry(middleName);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
in = new BufferedInputStream(new FileInputStream(source));
while (true)
{
int count = in.read(readerBuffer);
if (count == -1)
{
break;
}
target.write(readerBuffer, 0, count);
}
target.closeEntry();
}
finally
{
if (in != null)
{
in.close();
}
}
}
void create(final String jarDataDir, final String destDir, final File jarSrc)
{
try
{
String jarName = jarSrc.getAbsolutePath();
jarName = jarName.substring(jarName.lastIndexOf('\\')+1);
jarName = destDir + File.separator + jarName;
javaClassPath = jarDataDir;
//Manifest manifest = new Manifest();
//manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
//JarOutputStream target = new JarOutputStream(new FileOutputStream(destJarFile), manifest);
JarOutputStream target = new JarOutputStream(new FileOutputStream(jarName));
addFileToJar(new File(javaClassPath), target);
target.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
本文假设目录下已有Manifest;也可以使用注释中的代码。能不能指定某个文件呢?还真没找到办法。