最近项目中遇到需要动态构建Jar包的任务,需要构建的Jar的内容其实都差不多,只是需要更改配置文件里面的一些东西,网上的那些方法不是不行就是导致Jar无法运行了,冲浪一番后,结合网上的资料后解决了
我这里拿的是SrpingBoot resources下的jar,生成的位置也是resources下
@SneakyThrows
public void demo() {
String personId = "8888888";
//修改SpringBoot的application.yml文件内容
String data = "12j3h1i7tsa7sgdajk123y8asd: " + personId;
//jar位置
File jarFile = new ClassPathResource("app/TimerScrap.jar").getFile();
//新jar包位置
String resultPath = URLDecoder.decode(this.getClass().getClassLoader().getResource("app/").getFile(), "UTF-8");
upJarFile(jarFile, resultPath, "BOOT-INF/classes/application.yml", personId, data);
}
@SneakyThrows
private void upJarFile(File originalJarFile, String resultPath, String upFilePath, String newJarName, String content) {
//获取jar文件
JarFile jarFile = new JarFile(originalJarFile);
//获取当前jar中的所有文件
Enumeration entries = jarFile.entries();
//创建同名jar
JarOutputStream jarOutputStream = new JarOutputStream(new FileOutputStream(resultPath + newJarName + ".jar"));
while (entries.hasMoreElements()) {
//获取原jar包下的文件
JarEntry jarEntry = entries.nextElement();
//匹配是否是需要更改的文件
if (upFilePath.equals(jarEntry.getName())) {
//添加到新jar包中(这里一定要自己重新 new JarEntry,否则用原jar中的文件就是字节数、编码对不上
JarEntry upJarEntry = new JarEntry(upFilePath);
jarOutputStream.putNextEntry(upJarEntry);
jarOutputStream.write(content.getBytes(StandardCharsets.UTF_8));
} else {
//添加到新jar包中
jarOutputStream.putNextEntry(jarEntry);
jarOutputStream.write(streamToByte(jarFile.getInputStream(jarEntry)));
}
}
jarOutputStream.close();
}
private byte[] streamToByte(InputStream inputStream) {
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
try {
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return outSteam.toByteArray();
} 


