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 7cdddd84ced7d1f24b95810426cd79cf278c69e6..b32b1012b0a3a85f174f6bce48b6f5ab89d53d9d 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 ccb764fceb4d347b3cc33e5a1fe8097425cf5f22..a75ab4f49a1728550622f51b1c45ce8db1b14fde 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();