From 4898a769f8625e9af61d2fe5c2d43aba85d17fb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BC=AA=E6=99=A8?= Date: Thu, 13 Aug 2026 13:05:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9Arepackage=20?= =?UTF-8?q?=E5=A3=B0=E6=98=8E=20threadSafe=20=E4=BD=86=20CopyLoader=20?= =?UTF-8?q?=E4=B8=8E=20PLUGIN=5FTYPE=20=E4=BD=BF=E7=94=A8=E9=9D=99?= =?UTF-8?q?=E6=80=81=E5=8F=AF=E5=8F=98=E5=AD=97=E6=AE=B5=EF=BC=8CMaven=20?= =?UTF-8?q?=E5=B9=B6=E8=A1=8C=E6=9E=84=E5=BB=BA=E4=B8=8B=E5=A4=9A=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E4=B8=B2=E6=89=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 模块:solon-maven-plugin CopyLoader 的 path/name/tempName 改为方法局部变量传参;RepackageMojo.PLUGIN_TYPE 改为实例字段。行为变化:并行构建下各模块状态相互隔离。 --- .../noear/solon/maven/plugin/CopyLoader.java | 70 +++++++++---------- .../solon/maven/plugin/RepackageMojo.java | 3 +- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/solon-projects/solon-tool/solon-maven-plugin/src/main/java/org/noear/solon/maven/plugin/CopyLoader.java b/solon-projects/solon-tool/solon-maven-plugin/src/main/java/org/noear/solon/maven/plugin/CopyLoader.java index 7cdddd84ce..b32b1012b0 100644 --- a/solon-projects/solon-tool/solon-maven-plugin/src/main/java/org/noear/solon/maven/plugin/CopyLoader.java +++ b/solon-projects/solon-tool/solon-maven-plugin/src/main/java/org/noear/solon/maven/plugin/CopyLoader.java @@ -32,63 +32,61 @@ import org.noear.solon.loader.JarLauncher; * @author hxm */ public class CopyLoader { - static String path; - static String name; - static String tempName; public static void start(File file) throws Exception { - CopyLoader.name = file.getName(); - CopyLoader.tempName = UUID.randomUUID() + ".jar"; - CopyLoader.path = (file.getAbsolutePath().replace(name, "")); + // 修复:状态改为方法局部变量传参,避免静态字段在并行构建下被多模块互相覆盖 + String name = file.getName(); + String tempName = UUID.randomUUID() + ".jar"; + String path = (file.getAbsolutePath().replace(name, "")); //提取jar里面的class - if (setLoader()) { - organizeFiles(); + if (setLoader(path, name, tempName)) { + organizeFiles(path, name, tempName); } } - private static void organizeFiles() throws IOException{ + private static void organizeFiles(String path, String name, String tempName) throws IOException{ FileUtils.delete(new File(path + name)); FileUtils.moveFile(new File(path + tempName), new File(path + name)); } - private static boolean setLoader() throws IOException { + private static boolean setLoader(String path, String name, String tempName) throws IOException { + // 修复:流改用 try-with-resources,异常向上传播,避免静默产出缺失引导类的损坏 jar try { //获取 JarLauncher 类所在路径 ProtectionDomain protectionDomain = JarLauncher.class.getProtectionDomain(); CodeSource codeSource = protectionDomain.getCodeSource(); URI location = (codeSource == null ? null : codeSource.getLocation().toURI()); String mavenPluginJarPath = (location == null ? null : location.getSchemeSpecificPart()); - JarFile jarfile = new JarFile(mavenPluginJarPath); - JarFile targetJarfile = new JarFile(path + name); - JarOutputStream jarOutputStream = new JarOutputStream(new FileOutputStream(path + tempName)); - //写loader 文件 - Enumeration entries = jarfile.entries(); - while (entries.hasMoreElements()) { - JarEntry jarEntry = entries.nextElement(); - if (!jarEntry.isDirectory() && jarEntry.getName().contains(Constant.HEAD_PACKAGE_PATH) && jarEntry.getName().endsWith(".class")) { - jarOutputStream.putNextEntry(jarEntry); - byte[] bytes = IOUtils.toByteArray(jarfile.getInputStream(jarEntry)); - jarOutputStream.write(bytes); + try (JarFile jarfile = new JarFile(mavenPluginJarPath); + JarFile targetJarfile = new JarFile(path + name); + JarOutputStream jarOutputStream = new JarOutputStream(new FileOutputStream(path + tempName))) { + //写loader 文件 + Enumeration entries = jarfile.entries(); + while (entries.hasMoreElements()) { + JarEntry jarEntry = entries.nextElement(); + if (!jarEntry.isDirectory() && jarEntry.getName().contains(Constant.HEAD_PACKAGE_PATH) && jarEntry.getName().endsWith(".class")) { + jarOutputStream.putNextEntry(jarEntry); + byte[] bytes = IOUtils.toByteArray(jarfile.getInputStream(jarEntry)); + jarOutputStream.write(bytes); + } } + //写原文件 + Enumeration targetEntries = targetJarfile.entries(); + while (targetEntries.hasMoreElements()) { + JarEntry entry = targetEntries.nextElement(); + InputStream entryInputStream = targetJarfile + .getInputStream(entry); + jarOutputStream.putNextEntry(entry); + jarOutputStream.write(IOUtils.toByteArray(entryInputStream)); + } + jarOutputStream.flush(); } - //写原文件 - Enumeration targetEntries = targetJarfile.entries(); - while (targetEntries.hasMoreElements()) { - JarEntry entry = targetEntries.nextElement(); - InputStream entryInputStream = targetJarfile - .getInputStream(entry); - jarOutputStream.putNextEntry(entry); - jarOutputStream.write(IOUtils.toByteArray(entryInputStream)); - } - jarOutputStream.flush(); - jarOutputStream.close(); - targetJarfile.close(); - jarfile.close(); return true; } catch (Exception e) { - e.printStackTrace(); + // 修复:失败时删除残留临时文件,并将异常向上传播而非吞掉 + FileUtils.deleteQuietly(new File(path + tempName)); + throw new IOException(e); } - return false; } } diff --git a/solon-projects/solon-tool/solon-maven-plugin/src/main/java/org/noear/solon/maven/plugin/RepackageMojo.java b/solon-projects/solon-tool/solon-maven-plugin/src/main/java/org/noear/solon/maven/plugin/RepackageMojo.java index ccb764fceb..a75ab4f49a 100644 --- a/solon-projects/solon-tool/solon-maven-plugin/src/main/java/org/noear/solon/maven/plugin/RepackageMojo.java +++ b/solon-projects/solon-tool/solon-maven-plugin/src/main/java/org/noear/solon/maven/plugin/RepackageMojo.java @@ -102,7 +102,8 @@ public class RepackageMojo extends AbstractMojo { @Parameter(property = "solon.excludeGroupIds", defaultValue = "") private String excludeGroupIds; - public static PluginType PLUGIN_TYPE; + // 修复:改为实例字段,避免并行构建下多模块互相覆盖静态状态 + public PluginType PLUGIN_TYPE; private final Log logger = getLog(); -- Gitee