当前位置:   article > 正文

java如何修改jar文件内容_Java实现动态修改Jar包内文件内容

java字段变化 jar包

【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

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 lists = new LinkedList<>();

Enumeration 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 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=\"%%\"");

}

}

版权声明

【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/590669
推荐阅读
相关标签
  

闽ICP备14008679号