Java实现动态修改Jar包内文件内容
import java.io.*;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
/**
* jarPath: jar包所在路径
* jarFilePath: jar中想要修改文件所在的路径
* regex:正则表达式
* replacement:替换的字符串
* 注意:Jar包内的jar包内的文件不适用!
*/
public class JarTool {
public void change(String jarPath, String jarFilePath, String regex, String replacement) throws IOException {
File file = new File(jarPath);
JarFile jarFile = new JarFile(file);// 通过jar包的路径 创建Jar包实例
change(jarFile, jarFilePath, regex, replacement);
}
public void change(JarFile jarFile, String jarFilePath, String regex, String replacement) throws IOException {
JarEntry entry = jarFile.getJarEntry(jarFilePath);//通过某个文件在jar包中的位置来获取这个文件
//创建该文件输入流
InputStream input = jarFile.getInputStream(entry);
//获取entries集合lists
List<JarEntry> lists = new LinkedList<>();
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
lists.add(jarEntry);
}
String s = readFile(input, regex, replacement);// 读取并修改文件内容
writeFile(lists, jarFilePath, jarFile, s);// 将修改后的内容写入jar包中的指定文件
jarFile.close();
}
private static String readFile(InputStream input, String regex, String replacement)
throws IOException {
InputStreamReader isr = new InputStreamReader(input);
BufferedReader br = new BufferedReader(isr);
StringBuilder buf = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
// 此处根据实际需要修改某些行的内容
buf.append(line);
buf.append(System.getProperty("line.separator"));
}
br.close();
return buf.toString().replaceAll(regex, replacement);
}
private static void writeFile(List<JarEntry> lists, String jarFilePath,
JarFile jarFile, String content) throws IOException {
FileOutputStream fos = new FileOutputStream(jarFile.getName(), true);
JarOutputStream jos = new JarOutputStream(fos);
try {
for (JarEntry je : lists) {
if (je.getName().equals(jarFilePath)) {
// 将内容写入文件中
jos.putNextEntry(new JarEntry(jarFilePath));
jos.write(content.getBytes());
} else {
//表示将该JarEntry写入jar文件中 也就是创建该文件夹和文件
jos.putNextEntry(new JarEntry(je));
jos.write(streamToByte(jarFile.getInputStream(je)));
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭流
jos.close();
}
}
private static 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();
}
public static void main(String[] args) throws IOException {
JarTool jarTool = new JarTool();
jarTool.change("D:\\IDEA\\workSpace\\demo.jar"
, "spring/spring-aop.xml", "expression=\".*\"", "expression=\"%%\"");
}
}
Java实现动态修改Jar包内文件内容的更多相关文章
- Java如何快速修改Jar包里的文件内容
需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...
- java查找重复类/jar包/普通文件
开发web应用时,有时更新了类却没有生效,其实是因为jboss/tomcat中其他发布包下有同名类(包括全路径都相同). 于是萌发了做个程序来检查指定目录是否存在重复类(通过asm从类文件中取类的全路 ...
- java查找反复类/jar包/普通文件
开发web应用时,有时更新了类却没有生效,事实上是由于jboss/tomcat中其它公布包下有同名类(包含全路径都同样). 于是萌发了做个程序来检查指定文件夹是否存在反复类(通过asm从类文件里取类的 ...
- Java 操作jar包工具类以及如何快速修改Jar包里的文件内容
需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...
- 【原创】Java基础之简单修改jar包中的class
有时需要修改很多jar(假设这些jar都位于lib目录)中其中一个jar中的某一个类,而且又没有原始代码或ide,这时最简单的方式是: 1 进入lib目录 # cd lib # ls test.jar ...
- IDEA修改jar包中class文件后重新生成jar包
一.背景 最新想要修改rebeyond大佬的冰蝎项目,特地去网上搜索如何修改jar包中的源码再替换回去的方法,但由于现在的一些文章写的太烂,导致走了很多弯路,因此写下这篇快速使用IDEA修改源码并替换 ...
- Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)
最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...
- 修改jar包配置文件的正确操作,jar包解压出来的文件夹重新打成jar,不依靠开发工具!!!!
修改jar包配置文件的正确操作,有的时候通过一些解压工具可以对内部的文件进行修改,但是有时候会无效.这就很烦了 一.背景: 有一个springboot项目,事先我已经用编译好打成jar包以 ...
- 替换Jar包内的文件
要替换Jar包内的文件可以用以下命令实现: jar uvf myjar.jar com/test/myclass.class 这里值得注意的是 myclass.class 必须放在com/test ...
随机推荐
- 第58章 Profile Service - Identity Server 4 中文文档(v1.0.0)
IdentityServer通常在创建令牌或处理对userinfo或内省端点的请求时需要有关用户的身份信息.默认情况下,IdentityServer仅具有身份验证cookie中的声明,以便为此身份数据 ...
- EF操作数据库的步骤和一些简单操作语句
这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面 ...
- C# 在PDF中绘制动态图章
我们知道,动态图章,因图章中的时间.日期可以动态的生成,因而具有较强的时效性.在本篇文章中将介绍通过C#编程在PDF中绘制动态图章的方法,该方法可自动获取当前系统登录用户名.日期及时间信息并生成图章. ...
- Android破解学习之路(十一)—— 关于去更新
根据对话框的文字找到对应的对话框,设置visability 为gone 修改版本号,aptool 搜索http://,找到更新的地址,修改为127.0.0.0 搜索update,upgrade,ver ...
- react 阻止事件冒泡
前言 在学习react阻止事件冒泡,需要先了解 合成事件 和 原生事件 合成事件:在jsx中直接绑定的事件,就是合成事件: 原生事件: 通过js原生代码绑定的事件,就是原生事件: react事件:re ...
- Ext中setVersion和getVersion
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- GeoServer安装配置
需安装文件 1.安装jdk 2.安装GeoServer: (1).在安装GeoServer前,需要安装java运行环境,点击文件夹内的jdk安装文件,选择jdk安装路径进行安装:直到安装完成. (2) ...
- 常用matlab函数(不定时更新)
直方图类: histc 直方图分组 示例 histc(a,0:1:10) 意义:将a(矩阵或向量)分组,分组设置为 0-1 1-2 2-3 -.. 9-10,(10-11) 百分位 prctil ...
- linux下磁盘存储空间不足
把自己平时遇到的问题分享给大家 Question:linux系统Ubuntu下面有一个Trash,当我们删除文件后,清空Trash,过一段时间发现磁盘空间不足 Answer:其实我们并没有真正的删除文 ...
- linux中Samba服务器的配置
Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件 ...