当前位置: 首页 > news >正文

Repackager.java:核心重新打包工具,支持解压、修改合并和重新打包JAR文件

import java.io.*;
import java.util.jar.*;
import java.util.zip.*;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;public class Repackager {public static void main(String[] args) {if (args.length < 2) {System.out.println("用法: java Repackager <原JAR路径> <新JAR路径> [修改文件夹]");return;}String originalJar = args[0];String newJar = args[1];String modificationDir = args.length > 2 ? args[2] : null;try {repackJar(originalJar, newJar, modificationDir);System.out.println("JAR包重新打包完成: " + newJar);} catch (Exception e) {System.err.println("重新打包失败: " + e.getMessage());e.printStackTrace();}}public static void repackJar(String originalJar, String newJar, String modificationDir) throws IOException {// 创建临时目录用于解压Path tempDir = Files.createTempDirectory("jar_repack_");try {// 解压原JAR包
            extractJar(originalJar, tempDir);// 如果提供了修改目录,则合并修改内容if (modificationDir != null) {mergeModifications(tempDir, modificationDir);}// 重新打包
            createJar(newJar, tempDir);} finally {// 清理临时目录
            deleteRecursively(tempDir);}}private static void extractJar(String jarPath, Path destDir) throws IOException {try (JarInputStream jarIn = new JarInputStream(new FileInputStream(jarPath))) {JarEntry entry;while ((entry = jarIn.getNextJarEntry()) != null) {Path entryPath = destDir.resolve(entry.getName());if (entry.isDirectory()) {Files.createDirectories(entryPath);} else {Files.createDirectories(entryPath.getParent());Files.copy(jarIn, entryPath, StandardCopyOption.REPLACE_EXISTING);}}}}private static void mergeModifications(Path baseDir, String modDir) throws IOException {Path modPath = Paths.get(modDir);if (!Files.exists(modPath)) {System.out.println("修改目录不存在: " + modDir);return;}Files.walkFileTree(modPath, new SimpleFileVisitor<Path>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {Path relativePath = modPath.relativize(file);Path targetPath = baseDir.resolve(relativePath);Files.createDirectories(targetPath.getParent());Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING);return FileVisitResult.CONTINUE;}});}private static void createJar(String jarPath, Path sourceDir) throws IOException {try (JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(jarPath))) {Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {String entryName = sourceDir.relativize(file).toString().replace('\\', '/');jarOut.putNextEntry(new JarEntry(entryName));Files.copy(file, jarOut);jarOut.closeEntry();return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {String entryName = sourceDir.relativize(dir).toString().replace('\\', '/') + "/";jarOut.putNextEntry(new JarEntry(entryName));jarOut.closeEntry();return FileVisitResult.CONTINUE;}});}}private static void deleteRecursively(Path path) throws IOException {if (Files.exists(path)) {Files.walkFileTree(path, new SimpleFileVisitor<Path>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {Files.delete(file);return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {Files.delete(dir);return FileVisitResult.CONTINUE;}});}}
}

 

http://www.jsqmd.com/news/278820/

相关文章:

  • fft npainting lama start_app.sh脚本解析:启动流程拆解
  • 你还在用if(obj != null)?2024主流团队已切换的6种编译期/运行期null防护范式
  • Qwen3-1.7B模型切换指南:从Qwen2升级注意事项详解
  • AI语音分析2026年必看趋势:开源+情感识别成主流
  • LangChain 工具API:从抽象到实战的深度解构与创新实践
  • 2026年口碑好的真空镀膜厂商推荐,广东森美纳米科技专业之选
  • Z-Image-Turbo开源模型实战:output_image目录管理与删除操作指南
  • 2026年GEO推广外贸老牌版、GEO外贸优化推广版好用品牌
  • Qwen3-Embedding-0.6B API返回空?输入格式校验实战排查
  • 【Java高级特性揭秘】:泛型擦除背后的真相与性能优化策略
  • Qwen-Audio与SenseVoiceSmall对比:事件检测谁更强?部署案例
  • 2026年广东真空镀膜推荐供应商,哪家技术强、口碑棒?
  • Z-Image-Turbo与HuggingFace集成:直接加载远程模型权重实战
  • 你真的会写冒泡排序吗?深入剖析Java实现中的4大常见错误
  • FSMN-VAD表格输出乱码?Markdown格式化修复实战
  • 分析GEO外贸推荐推广版、GEO外贸定制推广版怎么收费
  • 2026年轿车托运公司推荐:多场景深度评价与排名,直击价格不透明与损伤隐忧
  • 开源大模型嵌入任务入门必看:Qwen3-Embedding-0.6B部署全解析
  • 2026年广东真空镀膜正规供应商排名,哪家性价比高值得推荐?
  • 2026年目前评价好的铝门窗批发排行,侧压平移推拉窗/六轨断桥推拉窗/窗纱一体铝门窗/安全门窗,铝门窗源头厂家推荐排行
  • unet image最大支持多大图片?10MB限制突破方法尝试案例
  • Unsloth视频字幕生成:TTS模型训练部署全流程
  • GPT-OSS与Llama3对比评测:开源推理性能谁更强?
  • 【Java高级特性必知】:接口与抽象类的7个本质区别及使用场景剖析
  • 详细介绍:Dubbo通信协议全景指南:如何为你的微服务选择最佳通信方案?
  • 2026年广东地区真空镀膜供应商推荐,哪家靠谱又性价比高?
  • cv_resnet18_ocr-detection生产部署:高并发请求处理方案
  • 2026年PVD电镀制造商排行榜,广东森美纳米科技位居前列
  • 2026年工程管理软件推荐:基于行业应用横向评价,直击数据孤岛与实施难题
  • 2026年广东PVD电镀服务商厂家排行榜,森美纳米科技靠谱之选