From 1fea3eea8bf676ac6cf35c6b98e42efdbc5b897e Mon Sep 17 00:00:00 2001 From: dengzedong <dengzedong@email> Date: 星期日, 29 九月 2024 11:50:08 +0800 Subject: [PATCH] 模型生成代码后备份dll和jar,用于测试运行模型 --- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java | 198 +++++++++++++++++++++++++++++++++--------------- 1 files changed, 135 insertions(+), 63 deletions(-) diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java index 99a1675..492056a 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java @@ -16,12 +16,16 @@ import com.iailab.module.model.mpk.common.MdkConstant; import com.iailab.module.model.mpk.common.utils.GenUtils; import com.iailab.module.model.mpk.dao.MpkFileDao; -import com.iailab.module.model.mpk.dto.*; -import com.iailab.module.model.mpk.entity.*; +import com.iailab.module.model.mpk.dto.GeneratorCodeHistoryDTO; +import com.iailab.module.model.mpk.dto.ModelMethodDTO; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryDTO; +import com.iailab.module.model.mpk.entity.GeneratorCodeHistoryEntity; +import com.iailab.module.model.mpk.entity.MpkFileEntity; +import com.iailab.module.model.mpk.entity.ProjectPackageHistoryModelEntity; import com.iailab.module.model.mpk.service.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; @@ -32,10 +36,8 @@ import org.springframework.web.multipart.MultipartFile; import java.io.*; -import java.nio.file.Files; import java.util.*; import java.util.stream.Collectors; -import java.util.zip.ZipOutputStream; /** * @author PanZhibao @@ -61,8 +63,11 @@ @Autowired private ConfigApi configApi; - @Value("${mpk.bakFilePath}") + @Value("${mpk.bak-file-path}") private String mpkBakFilePath; + + @Value("${mpk.bak-resources}") + private String mpkResources; /*@PostConstruct public void init() { @@ -167,46 +172,106 @@ @Override public byte[] generatorCode(String id, String remark, String zipFileName) { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ZipOutputStream zip = new ZipOutputStream(outputStream); - MpkFileDTO entity = baseDao.get(id); //生成代码 - GenUtils.generatorCode(entity, zip); - IOUtils.closeQuietly(zip); + //设置velocity资源加载器 + Properties prop = new Properties(); + prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); - File file = null; - OutputStream fileOutputStream = null; - //文件备份 - try { - String dirPath = mpkBakFilePath; - File dir = new File(dirPath); - if (!dir.exists()) { - dir.mkdirs(); - } - String filePath = dirPath + File.separator + zipFileName; - file = new File(filePath); - file.createNewFile(); - fileOutputStream = Files.newOutputStream(file.toPath()); - IOUtils.write(outputStream.toByteArray(), fileOutputStream); - } catch (IOException e) { - log.error("生成代码文件备份失败," + entity.getPyName(), e); - throw new RuntimeException(e); - } finally { - IOUtils.closeQuietly(fileOutputStream); - } + //封装模板数据 + Map<String, Object> map = new HashMap<>(); + map.put("pkgName",entity.getPkgName()); + map.put("modelMethods",entity.getModelMethods()); + map.put("pyName",entity.getPyName()); + map.put("pyModule",entity.getPyModule()); + + VelocityContext dataContext = new VelocityContext(map); + + //临时文件夹 + File dirPath = new File("D:/DLUT/tmp/"); + dirPath.deleteOnExit(); + dirPath.mkdirs(); + + List<String> javaFilePaths = new ArrayList<>(); + List<String> cppFilePaths = new ArrayList<>(); + + //生成java文件 + File javaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + entity.getPkgName().replace(".", File.separator) + File.separator + entity.getPyName() + ".java"); + GenUtils.drawTemplate("abstract.java.vm", dataContext, javaFile); + javaFilePaths.add(javaFile.getAbsolutePath()); + + //生成Impl.java文件 + File implJavaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + entity.getPkgName().replace(".", File.separator) + File.separator + MdkConstant.IMPL + File.separator + entity.getPyName() + "Impl.java"); + GenUtils.drawTemplate("impl.java.vm", dataContext, implJavaFile); + javaFilePaths.add(implJavaFile.getAbsolutePath()); + + //生成.cpp文件 + File cppFile = new File(dirPath.getAbsolutePath() + File.separator + MdkConstant.C + File.separator + entity.getPyName() + ".cpp"); + GenUtils.drawTemplate("cpp.vm", dataContext, cppFile); + cppFilePaths.add(cppFile.getAbsolutePath()); + + //生成Jni.cpp文件 + File jniCppFile = new File(dirPath.getAbsolutePath() + File.separator + MdkConstant.C + File.separator + entity.getPyName() + "Jni.cpp"); + GenUtils.drawTemplate("Jni.cpp.vm", dataContext, jniCppFile); + cppFilePaths.add(jniCppFile.getAbsolutePath()); + + //生成.h文件 + File hFile = new File(dirPath.getAbsolutePath() + File.separator + MdkConstant.C + File.separator + entity.getPyName() + ".h"); + GenUtils.drawTemplate("h.vm", dataContext, hFile); + + //生成Jni.h文件 + File jniHFile = new File(dirPath.getAbsolutePath() + File.separator + MdkConstant.C + File.separator + entity.getPyName() + "Jni.h"); + GenUtils.drawTemplate("Jni.h.vm", dataContext, jniHFile); + + // 资源文件 + FileUtil.copy(mpkResources + File.separator + "libs", dirPath.getAbsolutePath(), true); + + //生成dll文件 + String dllSavePath = dirPath.getAbsolutePath() + File.separator + MdkConstant.LIBS + File.separator + "IAIL.MDK.Mid.Jni.dll"; + createDllFile(dirPath.getAbsolutePath(),cppFilePaths,dllSavePath); + //备份dll文件,用于后续运行 + String dllBakPath = mpkBakFilePath + File.separator + MdkConstant.DLL + File.separator + entity.getPyName() + ".dll"; + FileUtil.mkParentDirs(dllBakPath); + FileUtil.copy(dllSavePath, dllBakPath, true); + + //utils + env java文件 + File utilsJavaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + "iail" + File.separator + "mdk" + File.separator + "model" + File.separator + "utils" + File.separator + "AlgsUtils.java"); + FileUtil.mkParentDirs(utilsJavaFile); + FileUtil.copy(mpkResources + File.separator +"IAILMDK/utils/AlgsUtils.java", utilsJavaFile.getAbsolutePath(), true); + javaFilePaths.add(utilsJavaFile.getAbsolutePath()); + File envJavaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + "iail" + File.separator + "mdk" + File.separator + "model" + File.separator + "common" + File.separator + "Environment.java"); + FileUtil.mkParentDirs(envJavaFile); + FileUtil.copy(mpkResources + File.separator +"IAILMDK/common/Environment.java", envJavaFile.getAbsolutePath(), true); + javaFilePaths.add(envJavaFile.getAbsolutePath()); + // 生成class文件 + createClassFile(javaFilePaths); + // 删除java源文件 + deleteJavaFile(javaFilePaths); + // 打jar包 + String jarSavePath = pkgJar(dirPath.getAbsolutePath()); + //备份jar文件,用于后续运行 + String jarBakPath = mpkBakFilePath + File.separator + MdkConstant.JAR + File.separator + entity.getPyName() + ".jar"; + FileUtil.mkParentDirs(dllBakPath); + FileUtil.copy(jarSavePath, jarBakPath, true); + // 打zip包 + String zipPath = mpkBakFilePath + File.separator + zipFileName; + ZipUtil.zip(dirPath.getAbsolutePath(), zipPath); + byte[] bytes = FileUtil.readBytes(zipPath); //代码生成历史记录 GeneratorCodeHistoryEntity historyEntity = new GeneratorCodeHistoryEntity(); historyEntity.setId(UUID.randomUUID().toString()); historyEntity.setMdkId(id); - historyEntity.setFileName(file.getName()); - historyEntity.setFilePath(file.getAbsolutePath()); + historyEntity.setFileName(zipFileName); + historyEntity.setFilePath(zipPath); historyEntity.setRemark(remark); historyEntity.setCreateTime(new Date()); generatorCodeHistoryService.insert(historyEntity); - return outputStream.toByteArray(); + // 删除临时文件 + FileUtils.deleteDirectory(dirPath); + return bytes; } @Override @@ -215,15 +280,14 @@ List<MpkFileDTO> entities = baseDao.selectByIds(ids); //模板数据 - Map<String, Object> map = new HashMap<>(); - map.put("entities", entities); - VelocityContext context = new VelocityContext(map); +// Map<String, Object> map = new HashMap<>(); +// map.put("entities", entities); +// VelocityContext context = new VelocityContext(map); //临时文件夹 - File dirPath = new File("C:/DLUT/tmp/"); - if (!dirPath.exists()) { - dirPath.mkdirs(); - } + File dirPath = new File("D:/DLUT/tmp/"); + dirPath.deleteOnExit(); + dirPath.mkdirs(); //设置velocity资源加载器 Properties prop = new Properties(); @@ -283,8 +347,8 @@ FileUtil.copy(entity.getFilePath(), pyFilePath, true); } - // - FileUtil.copy("bak/libs", dirPath.getAbsolutePath(), true); + // 资源文件 + FileUtil.copy(mpkResources + File.separator + "libs", dirPath.getAbsolutePath(), true); //生成dll文件 String dllSavePath = dirPath.getAbsolutePath() + File.separator + MdkConstant.LIBS + File.separator + "IAIL.MDK.Mid.Jni.dll"; @@ -293,11 +357,11 @@ //utils + env java文件 File utilsJavaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + "iail" + File.separator + "mdk" + File.separator + "model" + File.separator + "utils" + File.separator + "AlgsUtils.java"); FileUtil.mkParentDirs(utilsJavaFile); - FileUtil.copy("bak/IAILMDK/utils/AlgsUtils.java", utilsJavaFile.getAbsolutePath(), true); + FileUtil.copy(mpkResources + File.separator +"IAILMDK/utils/AlgsUtils.java", utilsJavaFile.getAbsolutePath(), true); javaFilePaths.add(utilsJavaFile.getAbsolutePath()); File envJavaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + "iail" + File.separator + "mdk" + File.separator + "model" + File.separator + "common" + File.separator + "Environment.java"); FileUtil.mkParentDirs(envJavaFile); - FileUtil.copy("bak/IAILMDK/common/Environment.java", envJavaFile.getAbsolutePath(), true); + FileUtil.copy(mpkResources + File.separator +"IAILMDK/common/Environment.java", envJavaFile.getAbsolutePath(), true); javaFilePaths.add(envJavaFile.getAbsolutePath()); // 生成class文件 createClassFile(javaFilePaths); @@ -348,22 +412,26 @@ return bytes; } - private void createDllFile(String dirPath, List<String> cppFilePaths, String dllSavePath) throws InterruptedException, IOException { - String paths = cppFilePaths.stream().collect(Collectors.joining(" ")); - String command = "cl /LD " + paths + " /EHsc /o " + dllSavePath + " /link " + "IAIL.MDK.Mid.Windows.lib"; - log.info("执行cmd命令生成dll:" + command); - ProcessBuilder builder = new ProcessBuilder("cmd", "/c", command); - builder.directory(new File(dirPath + File.separator + MdkConstant.LIBS)); - Process process = builder.start(); - // 获取命令输出结果 - InputStream inputStream = process.getInputStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 设置编码为GBK - String line; - while ((line = reader.readLine()) != null) { - log.info(line); + private void createDllFile(String dirPath, List<String> cppFilePaths, String dllSavePath) { + try { + String paths = cppFilePaths.stream().collect(Collectors.joining(" ")); + String command = "cl /LD " + paths + " /EHsc /o " + dllSavePath + " /link " + "IAIL.MDK.Mid.Windows.lib"; + log.info("执行cmd命令生成dll:" + command); + ProcessBuilder builder = new ProcessBuilder("cmd", "/c", command); + builder.directory(new File(dirPath + File.separator + MdkConstant.LIBS)); + Process process = builder.start(); + // 获取命令输出结果 + InputStream inputStream = process.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 设置编码为GBK + String line; + while ((line = reader.readLine()) != null) { + log.info(line); + } + // 等待命令执行完成 + process.waitFor(); + } catch (Exception e) { + throw new RuntimeException("执行cmd命令生成dll异常"); } - // 等待命令执行完成 - process.waitFor(); } @Override @@ -373,7 +441,9 @@ dir.mkdirs(); } String fileName = file.getOriginalFilename(); - File saveFile = new File(dir.getAbsolutePath() + File.separator + fileName); + String fileSuffix = fileName.substring(fileName.lastIndexOf(".")); + File saveFile = new File(dir.getAbsolutePath() + File.separator + UUID.randomUUID() + fileSuffix); + saveFile.createNewFile(); // 保存 file.transferTo(saveFile); @@ -406,14 +476,16 @@ GenUtils.drawTemplate("log.txt.vm", data, logFile); } - private void pkgJar(String dirPath) throws InterruptedException { + private String pkgJar(String dirPath) throws InterruptedException { + String jarSavePath = dirPath + File.separator + MdkConstant.LIBS + File.separator + "IAILMDK.jar"; StringBuilder sb = new StringBuilder(); sb.append("jar -cvf"); - sb.append(" ").append(dirPath).append(File.separator).append(MdkConstant.LIBS).append(File.separator).append("IAILMDK.jar"); + sb.append(" ").append(jarSavePath); sb.append(" -C ").append(dirPath).append(File.separator).append("IAILMDK").append(File.separator).append(" ."); log.info("执行cmd命令打jar包:" + sb); Process process = RuntimeUtil.exec(sb.toString()); process.waitFor(); + return jarSavePath; } private void deleteJavaFile(List<String> javaFilePaths) { -- Gitblit v1.9.3