我有一个使用jaroutput流创建的java程序。输出jar使用外部库。
起初我以为我可以在清单中使用classpath来获取jar中的外部库。 然后我发现那不起作用。
然后我想到了自定义类加载器,例如one-jar。 但是我试图让它在一个生成的jar中工作而陷入困境。
如果你想知道,外部库是jsonsimple 1.1.1。
以下是生成的自定义jar的代码。
public void run(String output) throws IOException {
Manifest manifest = new Manifest();
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "Install");
manifest.getMainAttributes().put(Attributes.Name.CLASS_PATH, "json-simple-1.1.1.jar");
JarOutputStream target = new JarOutputStream(new FileOutputStream(output), manifest);
add(tempclass, target,"Install.class");
add(tempjar, target,"lib/json-simple-1.1.1.jar");
if (resourcepackzip != null) {
add(resourcepackzip, target,resourcepackzip.getName().toString());
}
if (optionstxt != null){
add(optionstxt, target,optionstxt.getName().toString());
}
add(worldzip, target,worldzip.getName().toString());
add(temptxt, target,temptxt.getName().toString());
target.close();
}
@SuppressWarnings("resource")
private void add(File source, JarOutputStream target,String source2) throws IOException
{
BufferedInputStream in = null;
try
{
if (source.isDirectory())
{
String name = source.getPath().replace("\\", "/");
if (!name.isEmpty())
{
if (!name.endsWith("/"))
name += "/";
JarEntry entry = new JarEntry(name);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
target.closeEntry();
}
for (File nestedFile: source.listFiles())
add(nestedFile, target, nestedFile.getName().toString());
return;
}
JarEntry entry = new JarEntry(source2);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
in = new BufferedInputStream(new FileInputStream(source));
byte[] buffer = new byte[1024];
while (true)
{
int count = in.read(buffer);
if (count == -1)
break;
target.write(buffer, 0, count);
}
}finally {
}
}
那么无论如何我可以在用jaroutputstream制作的jar中包含json吗?