Java 替换预先存在的jar文件中的字符串

Java 替换预先存在的jar文件中的字符串,java,jar,Java,Jar,我正在寻找一种方法来替换预先存在的.jar文件中的%%\uuuu USER\uuuu%%字符串,然后让用户下载它。我没有任何代码可以共享,因为这只是理论上的,我不知道从哪里开始 我不知道有什么方法可以实现这一点,可能是通过字节码?任何帮助都将不胜感激 更多信息: 文件已经编译并存储在web服务器上。它们由社区成员上传,%%\uuuuuuu用户\uuuuuuu%%代码将用于跟踪许可证分析。每次下载文件时都需要将此代码更改为下载用户代码。JAR文件基本上只是一个ZIP文件。要在用户下载JAR文件时实

我正在寻找一种方法来替换预先存在的.jar文件中的
%%\uuuu USER\uuuu%%
字符串,然后让用户下载它。我没有任何代码可以共享,因为这只是理论上的,我不知道从哪里开始

我不知道有什么方法可以实现这一点,可能是通过字节码?任何帮助都将不胜感激

更多信息:
文件已经编译并存储在web服务器上。它们由社区成员上传,
%%\uuuuuuu用户\uuuuuuu%%
代码将用于跟踪许可证分析。每次下载文件时都需要将此代码更改为下载用户代码。

JAR文件基本上只是一个ZIP文件。要在用户下载JAR文件时实时更新该文件,可以使用和

例如:

response.setContentType(“应用程序/八位字节流”);
setHeader(“内容处置”、“附件;文件名=\”foo.jar\”);
试一试(
ZipInputStream in=新的ZipInputStream(this.getClass().getResourceAsStream(“template.jar”);
ZipOutputStream out=新的zipoutpstream(response.getOutputStream());
) {
for(ZipEntry-ZipEntry;(ZipEntry=in.getNextEntry())!=null;){
out.putNextEntry(新的ZipEntry(ZipEntry.getName());
if(zipEntry.getName().equals(“special.txt”)){
copySpecial(输入、输出);
}否则{
copyStream(输入,输出);//不关闭流
}
}
}
static void copysecial(输入流输入,输出流输出){
BufferedReader reader=新的BufferedReader(新的InputStreamReader(in));
PrintWriter writer=新的PrintWriter(新的BufferedWriter(新的OutputStreamWriter(out));
for(字符串行;(line=reader.readLine())!=null;){
行=行。替换(“%%\\\\\\\\\\\\\\%”,“John Doe”);
writer.println(行);
}
writer.flush();
//不要关闭读写器
}
可能(假设您希望/需要在现有类中更改该字符串):

  • 提取罐
  • 使用javassist或ByteBuddy读取并修改类文件?我没有这样做,但这似乎意味着这是可能的
  • 再次使用zip/jar(如果签名,您可能不得不辞职)

您想用什么替换它?使用环境变量不是更有意义吗?你是说你的webapp有一个用户可以下载的文件(具体来说是jar文件),jar文件中有某种文本文件(例如属性文件),你想实时修改嵌入的文本文件以插入用户名,因为该文件是由用户下载的?也就是说,用户下载的jar文件被“打上”了用户名?@Andreas是的,基本上是这样。@Lino这是一个“许可”系统,当然可能会滥用/绕过它,但目前这正是我需要的。下载时,字符串应该替换为用户名(也可以是一个字符串)这是一个很好的答案,但并不完全清楚什么是
copyream(in,out)
does@Lino我认为这个名称足以显示它将所有字节从
in
复制到
out