替换预先存在的 jar 文件中的字符串
Replace string in pre-existing jar file
我正在寻找一种方法来替换预先存在的 .jar 文件中的 %%__USER__%%
字符串,然后让用户下载它。我没有任何代码可以分享,因为这只是理论上的,我不知道从哪里开始。
我不知道有什么方法可以做到这一点,可能是通过字节码?任何帮助将不胜感激。
更多信息:
文件已经编译并存储在网络服务器上。它们由社区成员上传,%%__USER__%%
代码将用于跟踪许可证分析。需要将此代码更改为每次下载文件时都下载用户的代码。
JAR 文件基本上就是一个 ZIP 文件。要实时更新 JAR 文件中的文件,因为它正在被用户下载,您可以使用 ZipInputStream
and ZipOutputStream
.
示例:
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"foo.jar\"");
try (
ZipInputStream in = new ZipInputStream(this.getClass().getResourceAsStream("template.jar"));
ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
) {
for (ZipEntry zipEntry; (zipEntry = in.getNextEntry()) != null; ) {
out.putNextEntry(new ZipEntry(zipEntry.getName()));
if (zipEntry.getName().equals("special.txt")) {
copySpecial(in, out);
} else {
copyStream(in, out); // doesn't close streams
}
}
}
static void copySpecial(InputStream in, OutputStream out) {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out)));
for (String line; (line = reader.readLine()) != null; ) {
line = line.replace("%%__USER__%%", "John Doe");
writer.println(line);
}
writer.flush();
// Don't close reader/writer
}
也许(假设您想要/需要更改现有 class 中的字符串):
- 提取 jar
- 使用 javassist 或 ByteBuddy 读取和修改 class 文件?我没有这样做过,但是这个 SO answer 似乎暗示这是可能的。
- zip / jar 再次(如果它被签名你可能不得不辞职)
我正在寻找一种方法来替换预先存在的 .jar 文件中的 %%__USER__%%
字符串,然后让用户下载它。我没有任何代码可以分享,因为这只是理论上的,我不知道从哪里开始。
我不知道有什么方法可以做到这一点,可能是通过字节码?任何帮助将不胜感激。
更多信息:
文件已经编译并存储在网络服务器上。它们由社区成员上传,%%__USER__%%
代码将用于跟踪许可证分析。需要将此代码更改为每次下载文件时都下载用户的代码。
JAR 文件基本上就是一个 ZIP 文件。要实时更新 JAR 文件中的文件,因为它正在被用户下载,您可以使用 ZipInputStream
and ZipOutputStream
.
示例:
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"foo.jar\"");
try (
ZipInputStream in = new ZipInputStream(this.getClass().getResourceAsStream("template.jar"));
ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
) {
for (ZipEntry zipEntry; (zipEntry = in.getNextEntry()) != null; ) {
out.putNextEntry(new ZipEntry(zipEntry.getName()));
if (zipEntry.getName().equals("special.txt")) {
copySpecial(in, out);
} else {
copyStream(in, out); // doesn't close streams
}
}
}
static void copySpecial(InputStream in, OutputStream out) {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out)));
for (String line; (line = reader.readLine()) != null; ) {
line = line.replace("%%__USER__%%", "John Doe");
writer.println(line);
}
writer.flush();
// Don't close reader/writer
}
也许(假设您想要/需要更改现有 class 中的字符串):
- 提取 jar
- 使用 javassist 或 ByteBuddy 读取和修改 class 文件?我没有这样做过,但是这个 SO answer 似乎暗示这是可能的。
- zip / jar 再次(如果它被签名你可能不得不辞职)