• [技术干货] 编译netty4.0.0.Final时报testsuite-common相关Compilation failure错误解决方法
    【问题描述】编译netty 4.0.0.Final等版本执行mvn package时报testsuite-common相关Compilation failure错误,详细报错如下:[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project netty-common: bada-boom:  Compilation failure: [ERROR] /home/netty/netty-netty-4.0.0.Final/common/src/main/java/io/netty/util/internel/chmv8/ConcurrentHashMapV8.java: [4409,47] error: spliterator() in KeySetView cannot implement spliterator() in Set【解决方法】进入common路径下,执行mvn package -Dskiptests编译即可【注】:其他版本如遇到类似报错可参考相同解决方法;
  • [技术干货] 编译netty时报testsuite-osgi-exam相关bada-boom错误解决方法
    【问题描述】编译netty 4.0.0.CR1等版本执行mvn package时报testsuite-osgi-exam相关bada-boom: Illegal ArgumentException错误,详细报错如下:[ERROR] Failed to execute goal com.carrotgarden.maven:corrot-maven-src-plugin:3.0.3: generate (default) on project netty-testsuite-osgi-exam: bada-boom:  Illegal ArgumentException -> [help 1]. 【解决方法】修改pom.xml,找到“corrot-maven-src-plugin”,将“<goal>generate</goal>”行注释。然后再次执行mvn package编译即可【注】:其他版本如4.0.0.CR2、4.0.0.CR3、4.0.0.CR4、4.0.0.CR5-4.0.0.CR9及4.0.0.Final(229行)等遇到类似报错可参考相同解决方法;
  • [技术干货] Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)[转载下]
        @GetMapping("/downloadFile")    public String downloadFile(@RequestParam Integer fId){        if (fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission() == 2){            logger.error("用户没有下载文件的权限!下载失败...");            return "redirect:/error401Page";        }        //获取文件信息        MyFile myFile = myFileService.getFileByFileId(fId);        String remotePath = myFile.getMyFilePath();        String fileName = myFile.getMyFileName()+myFile.getPostfix();        try {            //去FTP上拉取            OutputStream os = new BufferedOutputStream(response.getOutputStream());            response.setCharacterEncoding("utf-8");            // 设置返回类型            response.setContentType("multipart/form-data");            // 文件名转码一下,不然会出现中文乱码            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));            boolean flag = FtpUtil.downloadFile("/" + remotePath, fileName, os);            if (flag) {                myFileService.updateFile(                        MyFile.builder().myFileId(myFile.getMyFileId()).downloadTime(myFile.getDownloadTime() + 1).build());                os.flush();                os.close();                logger.info("文件下载成功!" + myFile);            }        } catch (Exception e) {            e.printStackTrace();        }        return "success";    }     /**     * @Description 删除文件     * @Author xw     * @Date 23:14 2020/2/10     * @Param [fId, folder]     * @return java.lang.String     **/    @GetMapping("/deleteFile")    public String deleteFile(@RequestParam Integer fId,Integer folder){        //获得文件信息        MyFile myFile = myFileService.getFileByFileId(fId);        String remotePath = myFile.getMyFilePath();        String fileName = myFile.getMyFileName()+myFile.getPostfix();        //从FTP文件服务器上删除文件        boolean b = FtpUtil.deleteFile("/"+remotePath, fileName);        if (b){            //删除成功,返回空间            fileStoreService.subSize(myFile.getFileStoreId(),Integer.valueOf(myFile.getSize()));            //删除文件表对应的数据            myFileService.deleteByFileId(fId);        }        logger.info("删除文件成功!"+myFile);        return "redirect:/files?fId="+folder;    }        /**     * @Description 删除文件夹并清空文件     * @Author xw     * @Date 15:22 2020/2/12     * @Param [fId]     * @return java.lang.String     **/    @GetMapping("/deleteFolder")    public String deleteFolder(@RequestParam Integer fId){        FileFolder folder = fileFolderService.getFileFolderByFileFolderId(fId);        //强制删除        deleteFolderF(folder);        return folder.getParentFolderId() == 0?"redirect:/files":"redirect:/files?fId="+folder.getParentFolderId();    }      /**     * @Description 迭代删除文件夹里面的所有文件和子文件夹     * @Author xw     * @Date 9:17 2020/2/29     * @Param [folder]     * @return void     **/    public void deleteFolderF(FileFolder folder){        //获得当前文件夹下的所有子文件夹        List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());        //删除当前文件夹的所有的文件        List<MyFile> files = myFileService.getFilesByParentFolderId(folder.getFileFolderId());        if (files.size()!=0){            for (int i = 0; i < files.size(); i++) {                Integer fileId = files.get(i).getMyFileId();                boolean b = FtpUtil.deleteFile("/"+files.get(i).getMyFilePath(), files.get(i).getMyFileName() + files.get(i).getPostfix());                if (b){                    myFileService.deleteByFileId(fileId);                    fileStoreService.subSize(folder.getFileStoreId(),Integer.valueOf(files.get(i).getSize()));                }            }        }        if (folders.size()!=0){            for (int i = 0; i < folders.size(); i++) {                deleteFolderF(folders.get(i));            }        }        fileFolderService.deleteFileFolderById(folder.getFileFolderId());    }     /**     * @Description 添加文件夹     * @Author xw     * @Date 23:16 2020/2/10     * @Param [folder, map]     * @return java.lang.String     **/    @PostMapping("/addFolder")    public String addFolder(FileFolder folder,Map<String, Object> map) {        //设置文件夹信息        folder.setFileStoreId(loginUser.getFileStoreId());        folder.setTime(new Date());        //获得当前目录下的所有文件夹,检查当前文件夹是否已经存在        List<FileFolder> fileFolders = null;        if (folder.getParentFolderId() == 0){            //向用户根目录添加文件夹            fileFolders = fileFolderService.getRootFoldersByFileStoreId(loginUser.getFileStoreId());        }else{            //向用户的其他目录添加文件夹            fileFolders = fileFolderService.getFileFolderByParentFolderId(folder.getParentFolderId());        }        for (int i = 0; i < fileFolders.size(); i++) {            FileFolder fileFolder = fileFolders.get(i);            if (fileFolder.getFileFolderName().equals(folder.getFileFolderName())){                logger.info("添加文件夹失败!文件夹已存在...");                return "redirect:/files?error=1&fId="+folder.getParentFolderId();            }        }        //向数据库写入数据        Integer integer = fileFolderService.addFileFolder(folder);        logger.info("添加文件夹成功!"+folder);        return "redirect:/files?fId="+folder.getParentFolderId();    }        /**     * @Description 重命名文件夹     * @Author xw     * @Date 23:18 2020/2/10     * @Param [folder, map]     * @return java.lang.String     **/    @PostMapping("/updateFolder")    public String updateFolder(FileFolder folder,Map<String, Object> map) {        //获得文件夹的数据库信息        FileFolder fileFolder = fileFolderService.getFileFolderByFileFolderId(folder.getFileFolderId());        fileFolder.setFileFolderName(folder.getFileFolderName());        //获得当前目录下的所有文件夹,用于检查文件夹是否已经存在        List<FileFolder> fileFolders = fileFolderService.getFileFolderByParentFolderId(fileFolder.getParentFolderId());        for (int i = 0; i < fileFolders.size(); i++) {            FileFolder folder1 = fileFolders.get(i);            if (folder1.getFileFolderName().equals(folder.getFileFolderName()) && folder1.getFileFolderId() != folder.getFileFolderId()){                logger.info("重命名文件夹失败!文件夹已存在...");                return "redirect:/files?error=2&fId="+fileFolder.getParentFolderId();            }        }        //向数据库写入数据        Integer integer = fileFolderService.updateFileFolderById(fileFolder);        logger.info("重命名文件夹成功!"+folder);        return "redirect:/files?fId="+fileFolder.getParentFolderId();    }     /**     * @Description 重命名文件     * @Author xw     * @Date 12:47 2020/2/12     * @Param [file, map]     * @return java.lang.String     **/    @PostMapping("/updateFileName")    public String updateFileName(MyFile file,Map<String, Object> map) {        MyFile myFile = myFileService.getFileByFileId(file.getMyFileId());        if (myFile != null){            String oldName = myFile.getMyFileName();            String newName = file.getMyFileName();            if (!oldName.equals(newName)){                boolean b = FtpUtil.reNameFile(myFile.getMyFilePath() + "/" + oldName+myFile.getPostfix(), myFile.getMyFilePath() + "/" + newName+myFile.getPostfix());                if (b){                    Integer integer = myFileService.updateFile(                            MyFile.builder().myFileId(myFile.getMyFileId()).myFileName(newName).build());                    if (integer == 1){                        logger.info("修改文件名成功!原文件名:"+oldName+"  新文件名:"+newName);                    }else{                        logger.error("修改文件名失败!原文件名:"+oldName+"  新文件名:"+newName);                    }                }            }        }        return "redirect:/files?fId="+myFile.getParentFolderId();    }     /**     * @Description 获得二维码      * @Author xw     * @Date 15:20 2020/2/12     * @Param [id, url]     * @return java.util.Map<java.lang.String,java.lang.Object>     **/    @GetMapping("getQrCode")    @ResponseBody    public Map<String,Object> getQrCode(@RequestParam Integer id,@RequestParam String url){        Map<String,Object> map = new HashMap<>();        map.put("imgPath","https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2654852821,3851565636&fm=26&gp=0.jpg");        if (id != null){            MyFile file = myFileService.getFileByFileId(id);            if (file != null){                try {                    String path = request.getSession().getServletContext().getRealPath("/user_img/");                    url = url+"/file/share?t="+ UUID.randomUUID().toString().substring(0,10) +"&f="+file.getMyFileId()+"&p="+file.getUploadTime().getTime()+""+file.getSize()+"&flag=1";                    File targetFile = new File(path, "");                    if (!targetFile.exists()) {                        targetFile.mkdirs();                    }                    File f = new File(path, id + ".jpg");                    if (!f.exists()){                        //文件不存在,开始生成二维码并保存文件                        OutputStream os = new FileOutputStream(f);                        QRCodeUtil.encode(url, "/static/img/logo.png", os, true);                        os.close();                    }                    map.put("imgPath","user_img/"+id+".jpg");                    map.put("url",url);                } catch (Exception e) {                    e.printStackTrace();                }            }        }        return map;    }        /**     * @Description 分享文件     * @Author xw     * @Date 14:23 2020/2/12     * @Param [fId]     * @return void     **/    @GetMapping("/file/share")    public String shareFile(Integer f,String p,String t,Integer flag){        String fileNameTemp = "";        String remotePath = "";        String fileName = "";        Integer times = 0;        if (flag == null || f == null || p == null || t == null){            logger.info("下载分享文件失败,参数错误");            return "redirect:/error400Page";        }        if(flag == 1){            //获取文件信息            MyFile myFile = myFileService.getFileByFileId(f);            if (myFile == null){                return "redirect:/error404Page";            }            String pwd = myFile.getUploadTime().getTime()+""+myFile.getSize();            if (!pwd.equals(p)){                return "redirect:/error400Page";            }            remotePath = myFile.getMyFilePath();            fileName = myFile.getMyFileName()+myFile.getPostfix();        }else if(flag == 2){            TempFile tempFile = tempFileService.queryById(f);            if (tempFile == null){                return "redirect:/error404Page";            }            Long test = tempFile.getUploadTime().getTime();             String pwd = tempFile.getSize();            if (!pwd.equals(p)){                return "redirect:/error400Page";            }            remotePath = tempFile.getFilePath();            fileName = tempFile.getFileName();        }else {            return "redirect:/error400Page";        }        fileNameTemp = fileName;        try {            //解决下载文件时 中文文件名乱码问题            boolean isMSIE = isMSBrowser(request);            if (isMSIE) {                //IE浏览器的乱码问题解决                fileNameTemp = URLEncoder.encode(fileNameTemp, "UTF-8");            } else {                //万能乱码问题解决                fileNameTemp = new String(fileNameTemp.getBytes("UTF-8"), "ISO-8859-1");            }            //去FTP上拉取            OutputStream os = new BufferedOutputStream(response.getOutputStream());            response.setCharacterEncoding("utf-8");            // 设置返回类型            response.setContentType("multipart/form-data");            // 文件名转码一下,不然会出现中文乱码            response.setHeader("Content-Disposition", "attachment;fileName=" + fileNameTemp);            if (FtpUtil.downloadFile("/" + remotePath, fileName, os)) {                myFileService.updateFile(                        MyFile.builder().myFileId(f).downloadTime(times + 1).build());                os.flush();                os.close();                logger.info("文件下载成功!");            }        } catch (Exception e) {            e.printStackTrace();        }        return "success";    }     /**     * @Description 根据文件的后缀名获得对应的类型     * @Author xw     * @Date 23:20 2020/2/10     * @Param [type]     * @return int 1:文本类型   2:图像类型  3:视频类型  4:音乐类型  5:其他类型     **/    public int getType(String type){        if (".chm".equals(type)||".txt".equals(type)||".xmind".equals(type)||".xlsx".equals(type)||".md".equals(type)                ||".doc".equals(type)||".docx".equals(type)||".pptx".equals(type)                ||".wps".equals(type)||".word".equals(type)||".html".equals(type)||".pdf".equals(type)){            return  1;        }else if (".bmp".equals(type)||".gif".equals(type)||".jpg".equals(type)||".ico".equals(type)||".vsd".equals(type)                ||".pic".equals(type)||".png".equals(type)||".jepg".equals(type)||".jpeg".equals(type)||".webp".equals(type)                ||".svg".equals(type)){            return 2;        } else if (".avi".equals(type)||".mov".equals(type)||".qt".equals(type)                ||".asf".equals(type)||".rm".equals(type)||".navi".equals(type)||".wav".equals(type)                ||".mp4".equals(type)||".mkv".equals(type)||".webm".equals(type)){            return 3;        } else if (".mp3".equals(type)||".wma".equals(type)){            return 4;        } else {            return 5;        }    }        /**     * @Description 正则验证文件名是否合法 [汉字,字符,数字,下划线,英文句号,横线]     * @Author xw     * @Date 23:22 2020/2/10     * @Param [target]     * @return boolean     **/    public boolean checkTarget(String target) {        final String format = "[^\\u4E00-\\u9FA5\\uF900-\\uFA2D\\w-_.]";        Pattern pattern = Pattern.compile(format);        Matcher matcher = pattern.matcher(target);        return !matcher.find();    }     /**     * @Description 判断当前浏览器是否为ie     * @Author xw     * @Date 22:39 2020/3/5     * @Param [request]     * @return boolean     **/    public static boolean isMSBrowser(HttpServletRequest request) {        String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};        String userAgent = request.getHeader("User-Agent");        for (String signal : IEBrowserSignals) {            if (userAgent.contains(signal)){                return true;            }        }        return false;    }原文链接:https://blog.csdn.net/m0_66863468/article/details/122853352
  • [技术干货] Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)[转载中]
     public String uploadTempFile(@RequestParam("file") MultipartFile file,String url) {        session.setAttribute("imgPath","https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2654852821,3851565636&fm=26&gp=0.jpg");        String name = file.getOriginalFilename().replaceAll(" ","");        if (!checkTarget(name)){            logger.error("临时文件上传失败!文件名不符合规范...");            session.setAttribute("msg", "上传失败!文件名不符合规范");            return "redirect:/temp-file";        }        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");        String dateStr = format.format(new Date());        String path = "temp/"+dateStr +"/"+UUID.randomUUID();        try {            if (FtpUtil.uploadFile("/"+path, name, file.getInputStream())){                //上传成功                logger.info("临时文件上传成功!"+name);                String size = String.valueOf(file.getSize());                TempFile tempFile = TempFile.builder().fileName(name).filePath(path).size(size).uploadTime(new Date()).build();                if (tempFileService.insert(tempFile)) {                    try {                        String id = UUID.randomUUID().toString();                        String p = request.getSession().getServletContext().getRealPath("/user_img/");                        Long t = tempFile.getUploadTime().getTime();                        url = url+"/file/share?t="+ UUID.randomUUID().toString().substring(0,10) +"&f="+tempFile.getFileId()+"&p="+size+"&flag=2";                        File targetFile = new File(p, "");                        if (!targetFile.exists()) {                            targetFile.mkdirs();                        }                        File f = new File(p, id + ".jpg");                        if (!f.exists()){                            //文件不存在,开始生成二维码并保存文件                            OutputStream os = new FileOutputStream(f);                            QRCodeUtil.encode(url, "/static/img/logo.png", os, true);                            os.close();                        }                        //异步删除临时文件                        tempFileService.deleteById(tempFile.getFileId());                        session.setAttribute("imgPath","user_img/"+id+".jpg");                        session.setAttribute("url",url);                        session.setAttribute("msg","上传成功,扫码/访问链接 即可下载!");                        return "redirect:/temp-file";                    } catch (Exception e) {                        e.printStackTrace();                    }                }else {                    logger.info("临时文件数据库写入失败!"+name);                    session.setAttribute("url","error");                    session.setAttribute("msg", "服务器出错了,临时文件上传失败!");                }            }else{                //上传失败                logger.info("临时文件上传失败!"+name);                session.setAttribute("url","error");                session.setAttribute("msg", "服务器出错了,上传失败!");            }        } catch (IOException e) {            e.printStackTrace();        }        return "redirect:/temp-file";    }     /**     * @Description 网盘的文件上传     * @Author xw     * @Date 23:10 2020/2/10     * @Param [files]     * @return java.util.Map<java.lang.String,java.lang.Object>     **/    @PostMapping("/uploadFile")    @ResponseBody    public Map<String, Object> uploadFile(@RequestParam("file") MultipartFile files) {        Map<String, Object> map = new HashMap<>();        if (fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission() != 0){            logger.error("用户没有上传文件的权限!上传失败...");            map.put("code", 499);            return map;        }        FileStore store = fileStoreService.getFileStoreByUserId(loginUser.getUserId());        Integer folderId = Integer.valueOf(request.getHeader("id"));        String name = files.getOriginalFilename().replaceAll(" ","");        //获取当前目录下的所有文件,用来判断是否已经存在        List<MyFile> myFiles = null;        if (folderId == 0){            //当前目录为根目录            myFiles = myFileService.getRootFilesByFileStoreId(loginUser.getFileStoreId());        }else {            //当前目录为其他目录            myFiles = myFileService.getFilesByParentFolderId(folderId);        }        for (int i = 0; i < myFiles.size(); i++) {            if ((myFiles.get(i).getMyFileName()+myFiles.get(i).getPostfix()).equals(name)){                logger.error("当前文件已存在!上传失败...");                map.put("code", 501);                return map;            }        }        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");        String dateStr = format.format(new Date());        String path = loginUser.getUserId()+"/"+dateStr +"/"+folderId;        if (!checkTarget(name)){            logger.error("上传失败!文件名不符合规范...");            map.put("code", 502);            return map;        }        Integer sizeInt = Math.toIntExact(files.getSize() / 1024);        //是否仓库放不下该文件        if(store.getCurrentSize()+sizeInt > store.getMaxSize()){            logger.error("上传失败!仓库已满。");            map.put("code", 503);            return map;        }        //处理文件大小        String size = String.valueOf(files.getSize()/1024.0);        int indexDot = size.lastIndexOf(".");        size = size.substring(0,indexDot);        int index = name.lastIndexOf(".");        String tempName = name;        String postfix = "";        int type = 4;        if (index!=-1){            tempName = name.substring(index);            name = name.substring(0,index);            //获得文件类型            type = getType(tempName.toLowerCase());            postfix = tempName.toLowerCase();        }        try {            //提交到FTP服务器            boolean b = FtpUtil.uploadFile("/"+path, name + postfix, files.getInputStream());            if (b){                //上传成功                logger.info("文件上传成功!"+files.getOriginalFilename());                //向数据库文件表写入数据                myFileService.addFileByFileStoreId(                        MyFile.builder()                              .myFileName(name).fileStoreId(loginUser.getFileStoreId()).myFilePath(path)                              .downloadTime(0).uploadTime(new Date()).parentFolderId(folderId).                              size(Integer.valueOf(size)).type(type).postfix(postfix).build());                //更新仓库表的当前大小                fileStoreService.addSize(store.getFileStoreId(),Integer.valueOf(size));                try {                    Thread.sleep(5000);                    map.put("code", 200);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }else{                logger.error("文件上传失败!"+files.getOriginalFilename());                map.put("code", 504);            }        } catch (IOException e) {            e.printStackTrace();        }        return map;    }     /**     * @Description 网盘的文件下载      * @Author xw     * @Date 23:13 2020/2/10     * @Param [fId]     * @return void     **/原文链接:https://blog.csdn.net/m0_66863468/article/details/122853352
  • [技术干货] Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)[转载 上]
    一、项目简述功能:用户的邮箱注册、验证码验证以及用户登录。 不需要注册账号,也可以上传满足条件的临时文件,但是 只4小时内有效。 文件的管理,上传、下载、重命名、删除、查看统计数 据、分类管理等。 文件夹的管理,创建、删除、重命名。 文件的分享,支持通过链博口二维码的分享方式等等。二、项目运行环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持)项目技术: JSP +Springboot+ SpringMVC + MyBatis + ThymeLeaf + FTP+ JavaScript + JQuery + Ajax + maven等等管理员控制器:/** * @ClassName: AdminController * @Description: 管理员控制器 **/@Controllerpublic class AdminController extends BaseController {    private Logger logger = LogUtils.getInstance(AdminController.class);        /**     * @Description 前往用户管理页面     * @Author xw     * @Date 15:11 2020/3/10     * @Param [map]     * @return java.lang.String     **/    @GetMapping("/manages-users")    public String manageUsers(Map<String,Object> map,Integer cur){        if (loginUser.getRole() == 1){            //用于无访问权限            logger.error("当前登录用户:"+loginUser.getUserName()+"无管理员权限!");            return "redirect:/error401Page";        }        //获取全部的用户        Integer usersCount = userService.getUsersCount();        //获取当前查询的页数,如果为空,默认为0        cur = (cur == null || cur<0)?0:cur;        //获得统计信息        FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());        //分页获得20个用户信息        Page<Object> page = PageHelper.startPage(cur, 20);        List<UserToShow> users = userService.getUsers();        map.put("statistics", statistics);        map.put("users", users);        map.put("page", page);        map.put("usersCount", usersCount);        logger.info("用户管理域的内容:"+map);        return "admin/manage-users";    }     /**     * @Description 修改用户的权限和最大容量     * @Author xw     * @Date 18:20 2020/3/10     * @Param [uId, pre, size]     * @return java.lang.String     **/    @GetMapping("/updateStoreInfo")    @ResponseBody    public String updateStoreInfo(Integer uId,Integer pre,Integer size){        Integer integer = fileStoreService.updatePermission(uId, pre, size*1024);        if (integer == 1) {            //更新成功,返回200状态码            logger.info("修改用户"+userService.queryById(uId).getUserName()+":的权限和仓库大小成功!");            return "200";        }else {            //更新失败,返回500状态码            logger.error("修改用户"+userService.queryById(uId).getUserName()+":的权限和仓库大小失败!");            return "500";        }    }     /**     * @Description 删除用户     * @Author xw     * @Date 18:44 2020/3/10     * @Param [uId, cur]     * @return java.lang.String     **/    @GetMapping("/deleteUser")    public String deleteUser(Integer uId,Integer cur){        cur = (cur == null || cur < 0)?1:cur;        User user = userService.queryById(uId);        FileStore fileStore = fileStoreService.getFileStoreByUserId(uId);        List<FileFolder> folders = fileFolderService.getRootFoldersByFileStoreId(fileStore.getFileStoreId());        //迭代删除文件夹        for (FileFolder f:folders) {            deleteFolderF(f);        }        List<MyFile> files = myFileService.getRootFilesByFileStoreId(fileStore.getFileStoreId());        //删除该用户仓库根目录下的所有文件        for (MyFile f:files) {            String remotePath = f.getMyFilePath();            String fileName = f.getMyFileName()+f.getPostfix();            //从FTP文件服务器上删除文件            boolean b = FtpUtil.deleteFile("/"+remotePath, fileName);            if (b){                //删除成功,返回空间                fileStoreService.subSize(f.getFileStoreId(),Integer.valueOf(f.getSize()));                //删除文件表对应的数据                myFileService.deleteByFileId(f.getMyFileId());            }            logger.info("删除文件成功!"+f);        }        if (FtpUtil.deleteFolder("/" + uId)){            logger.info("清空FTP上该用户的文件成功");        }else {            logger.error("清空FTP上该用户的文件失败");        }        userService.deleteById(uId);        fileStoreService.deleteById(fileStore.getFileStoreId());        return "redirect:/manages-users?cur="+cur;    }     /**     * @Description 迭代删除文件夹里面的所有文件和子文件夹     * @Author xw     * @Date 9:17 2020/2/29     * @Param [folder]     * @return void     **/    public void deleteFolderF(FileFolder folder){        //获得当前文件夹下的所有子文件夹        List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());        //删除当前文件夹的所有的文件        List<MyFile> files = myFileService.getFilesByParentFolderId(folder.getFileFolderId());        if (files.size()!=0){            for (int i = 0; i < files.size(); i++) {                Integer fileId = files.get(i).getMyFileId();                boolean b = FtpUtil.deleteFile("/"+files.get(i).getMyFilePath(), files.get(i).getMyFileName() + files.get(i).getPostfix());                if (b){                    myFileService.deleteByFileId(fileId);                    fileStoreService.subSize(folder.getFileStoreId(),Integer.valueOf(files.get(i).getSize()));                }            }        }        if (folders.size()!=0){            for (int i = 0; i < folders.size(); i++) {                deleteFolderF(folders.get(i));            }        }        fileFolderService.deleteFileFolderById(folder.getFileFolderId());    }}登录控制器:/** * @Description 登录控制器 * @return **/@Controllerpublic class LoginController extends BaseController {     private Logger logger = LogUtils.getInstance(LoginController.class);     /**     * @Description 免登陆用户入口,用于本地开发测试,上线运营为了安全请删除此方法     * @Author xw     * @Date 15:17 2020/2/26     * @Param []     * @return java.lang.String     **/    @GetMapping("/admin")    public String adminLogin(){        User user = userService.getUserByOpenId("123456");        logger.info("使用免登陆方式登录成功!"+user);        session.setAttribute("loginUser", user);        return "redirect:/index";    }     /**     * 用于注册流程,用户名,密码,邮箱等校验工作由前端来完成     *     * @param map 用于存储提示信息     * @author GGBOY     * @date 2020/1/28     */    @PostMapping("/register")    public String register(User user, String code, Map<String, Object> map) {        String uCode = (String) session.getAttribute(user.getEmail() + "_code");        if (!code.equals(uCode)) {            map.put("errorMsg", "验证码错误");            return "index";        }        // 用户名去空格        user.setUserName(user.getUserName().trim());        user.setImagePath("https://p.qpic.cn/qqconnect/0/app_101851241_1582451550/100?max-age=2592000&t=0");        user.setRegisterTime(new Date());        user.setRole(1);        if (userService.insert(user)) {            FileStore store = FileStore.builder().userId(user.getUserId()).currentSize(0).build();            fileStoreService.addFileStore(store);            user.setFileStoreId(store.getFileStoreId());            userService.update(user);            logger.info("注册用户成功!当前注册用户" + user);            logger.info("注册仓库成功!当前注册仓库" + store);        } else {            map.put("errorMsg", "服务器发生错误,注册失败");            return "index";        }        session.removeAttribute(user.getEmail() + "_code");        session.setAttribute("loginUser", user);        return "redirect:/index";    }     /**     * 用户登录     * @param map 存储提示信息     * @return java.lang.String     * @author 莫提     * @date 2020/1/28     */    @PostMapping("/login")    public String login(User user, Map<String, Object> map) {        User userByEmail = userService.getUserByEmail(user.getEmail());        if (userByEmail != null && userByEmail.getPassword().equals(user.getPassword())) {            session.setAttribute("loginUser", userByEmail);            logger.info("登录成功!"+userByEmail);            return "redirect:/index";        }else{            User user1 = userService.getUserByEmail(user.getEmail());            String errorMsg = user1 == null ? "该邮箱尚未注册" : "密码错误";            logger.info("登录失败!请确认邮箱和密码是否正确!");            //登录失败,将失败信息返回前端渲染            map.put("errorMsg", errorMsg);            return "index";        }    }     /**     * @return void     * @Description 向注册邮箱发送验证码, 并验证邮箱是否已使用     * @Author xw     * @Date 19:32 2020/1/29     * @Param [userName, email, password]     **/    @ResponseBody    @RequestMapping("/sendCode")    public String sendCode(String userName, String email, String password) {        User userByEmail = userService.getUserByEmail(email);        if (userByEmail != null) {            logger.error("发送验证码失败!邮箱已被注册!");            return "exitEmail";        }        logger.info("开始发送邮件.../n" + "获取的到邮件发送对象为:" + mailSender);        mailUtils = new MailUtils(mailSender);        String code = "123456";        session.setAttribute(email + "_code", code);        return "success";    }     /**     * @Description 请求QQ登录     * @Author xw     * @Date 18:27 2020/2/25     * @Param []     * @return void     **/    @GetMapping("/loginByQQ")    public void login() {        response.setContentType("text/html;charset=utf-8");        try {            response.sendRedirect(new Oauth().getAuthorizeURL(request));            logger.info("请求QQ登录,开始跳转...");        } catch (QQConnectException | IOException e) {            e.printStackTrace();        }    }     /**     * @Description QQ登录回调地址     * @Author xw     * @Date 18:27 2020/2/25     * @Param []     * @return java.lang.String     **/    @GetMapping("/connection")    public String connection() {        try {            AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);            String accessToken = null, openID = null;            long tokenExpireIn = 0L;            if ("".equals(accessTokenObj.getAccessToken())) {                logger.error("登录失败:没有获取到响应参数");                return "accessTokenObj=>" + accessTokenObj + "; accessToken" + accessTokenObj.getAccessToken();            } else {                accessToken = accessTokenObj.getAccessToken();                tokenExpireIn = accessTokenObj.getExpireIn();                logger.error("accessToken" + accessToken);                request.getSession().setAttribute("demo_access_token", accessToken);                request.getSession().setAttribute("demo_token_expirein", String.valueOf(tokenExpireIn));                // 利用获取到的accessToken 去获取当前用的openid -------- start                OpenID openIDObj = new OpenID(accessToken);                openID = openIDObj.getUserOpenID();                UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);                UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();                if (userInfoBean.getRet() == 0) {                    logger.info("用户的OPEN_ID: " + openID);                    logger.info("用户的昵称: " + removeNonBmpUnicode(userInfoBean.getNickname()));                    logger.info("用户的头像URI: " + userInfoBean.getAvatar().getAvatarURL100());                    //设置用户信息                    User user = userService.getUserByOpenId(openID);                    if (user == null){                        user = User.builder()                                .openId(openID).userName(removeNonBmpUnicode(userInfoBean.getNickname()))                                .imagePath(userInfoBean.getAvatar().getAvatarURL100()).                                registerTime(new Date()).build();                        if (userService.insert(user)){                            logger.info("注册用户成功!当前注册用户" + user);                            FileStore store = FileStore.builder().userId(user.getUserId()).build();                            if (fileStoreService.addFileStore(store) == 1){                                user.setFileStoreId(store.getFileStoreId());                                userService.update(user);                                logger.info("注册仓库成功!当前注册仓库" + store);                            }                        } else {                            logger.error("注册用户失败!");                        }                    }else {                        user.setUserName(removeNonBmpUnicode(userInfoBean.getNickname()));                        user.setImagePath(userInfoBean.getAvatar().getAvatarURL100());                        userService.update(user);                    }                    logger.info("QQ用户登录成功!"+user);                    session.setAttribute("loginUser", user);                    return "redirect:/index";                } else {                    logger.error("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());                }            }        } catch (QQConnectException e) {        } finally {            logger.error("登录成功!");        }        return "登录失败!请查看日志信息...";    }     /**     * @Description 处理掉QQ网名中的特殊表情     * @Author xw     * @Date 18:26 2020/2/25     * @Param [str]     * @return java.lang.String 返回处理之后的网名     **/    public String removeNonBmpUnicode(String str) {        if (str == null) {            return null;        }        str = str.replaceAll("[^\\u0000-\\uFFFF]", "");        if ("".equals(str)) {            str = "($ _ $)";        }        return str;    }     /**     * @Description 退出登录,清空session     * @Author xw     * @Date 18:26 2020/2/25     * @Param []     * @return java.lang.String     **/    @GetMapping("/logout")    public String logout() {        logger.info("用户退出登录!");        session.invalidate();        return "redirect:/";    } }文件仓库控制器:/** * @ClassName: FileStoreController * @Description: 文件仓库控制器 **/@Controllerpublic class FileStoreController extends BaseController {    private Logger logger = LogUtils.getInstance(FileStoreController.class);     /**     * @Description 上传临时文件     * @Author xw     * @Date 23:14 2020/3/9     * @Param [files]     * @return void     **/    @PostMapping("/uploadTempFile")   原文链接:https://blog.csdn.net/m0_66863468/article/details/122853352
  • [页面编排] ADC或DGE平台提供通用读取Excel的微服务API吗? 有的话,需要在pom文件中引用平台那个依赖?最好能提供下使用案例,多
    【功能模块】ADC或DGE平台提供通用读取Excel的微服务API吗? 有的话,需要在pom文件中引用平台那个依赖?最好能提供下使用案例,多谢。【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【弹性ECS】【maven功能】maven构建工程骨架查找不到archetype
    【功能模块】maven安装及配置【操作步骤&问题现象】1、使用命令下载Maven并解压软件包wget https://repo.huaweicloud.com/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gztar -zxvf apache-maven-3.5.4-bin.tar.gz2、配置Maven环境MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4export PATH=${MAVEN_HOME}/bin:$PATH3、 修改xml文件<server>    <id>huaweicloud</id>    <username>anonymous</username>    <password>devcloud</password></server><mirror>    <id>huaweicloud</id>    <mirrorOf>*</mirrorOf>    <url>https://mirrors.huaweicloud.com/repository/maven/</url></mirror>4、验证maven安装是否成功mvn --version5、构建maven工程cd /rootmvn archetype:generate【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 主流镜像源和官方源关系
    各位大佬好,请教几个关于镜像源的问题。1、我们华为云maven镜像源数据和maven官方仓库的数据是一致的吗?2、我们华为云maven镜像源是否会有不在maven官方仓库的包?3、我们华为云maven镜像源和maven官方仓库是如何同步的? 感谢回答!
  • [技术干货] jython-standalone-2.5.1移植指南(Taishan服务器)
    1 介绍简要介绍大数据组件flink-shaded-netty module。2 环境要求硬件要求硬件要求如表2-1所示。表2-1 硬件要求项目说明服务器Taishan服务器CPU鲲鹏920处理器 或 鲲鹏916处理器磁盘分区对磁盘分区无要求网络可访问外网 软件要求表2-2 软件要求项目说明CentOS7.6OS Kernel4.14.0GCC4.8.5Openjdk1.8.0_252Maven3.5.4Protobuf2.5.0jna1.0.1 3 配置编译环境3.1 安装基础库                                步骤 1      安装gcc等相关软件。确保有外网环境后,执行yum -y install gcc.aarch64 gcc-c++.aarch64 gcc-gfortran.aarch64 libgcc.aarch64XXXX                                 步骤 2      解决-fsigned-char问题(修改gcc)a、寻找gcc所在路径(一般位于“/usr/bin/gcc”)。command -v gcc b、更改gcc的名字(例如改成gcc-impl)。mv /usr/bin/gcc /usr/bin/gcc-impl c、新建gcc文件。vi /usr/bin/gcc d、填入如下内容保存。#! /bin/sh/usr/bin/gcc-impl -fsigned-char "$@" e、给脚本添加执行权限。chmod +x /usr/bin/gcc f、确认命令是否可用。gcc --version                                  步骤 3      解决-fsigned-char问题(修改g++)a、寻找gcc所在路径(一般位于“/usr/bin/g++”)。command -v g++ b、更改g++的名字(例如改成g++-impl)。mv /usr/bin/gcc /usr/bin/g++-impl c、新建g++文件。vi /usr/bin/g++ d、填入如下内容保存。#! /bin/sh/usr/bin/g++-impl -fsigned-char "$@" e、给脚本添加执行权限。chmod +x /usr/bin/g++ f、确认命令是否可用。g++ --version                                  步骤 4      安装依赖 yum安装依赖的相关软件。yum install -y wget vim openssl-devel zlib-devel automake libtool make  libstdc++-static glibc-static git snappy snappy-devel fuse fuse-devel ----结束  3.2 安装OpenJDK                                 步骤 1      下载并解压安装到指定目录(此处以指定“/opt/tools/installed”目录为例)wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u252-b09/OpenJDK8U-jdk_aarch64_linux_hotspot_8u252b09.tar.gztar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u252b09.tar.gzmkdir -p /opt/tools/installed/mv jdk8u252-b09 /opt/tools/installed/                                 步骤 2      配置Java环境变量vim /etc/profile在文件末尾添加如下代码。export JAVA_HOME=/opt/tools/installed/jdk8u252-b09export PATH=$JAVA_HOME/bin:$PATH                                 步骤 3      使修改的环境变量生效source /etc/profile                                 步骤 4      查看配置是否生效  3.3 安装Maven                                步骤 1      下载并安装到指定目录(此处以指定“/opt/tools/installed”目录为例)wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gztar -zxf apache-maven-3.5.4-bin.tar.gzmv apache-maven-3.5.4 /opt/tools/installed/                                步骤 2      修改Maven环境变量vim /etc/profile在“/etc/profile”文件末尾增加下面代码。export MAVEN_HOME=/opt/tools/installed/apache-maven-3.5.4export PATH=$MAVEN_HOME/bin:$PATH                                步骤 3      使修改的环境变量生效source /etc/profile                                步骤 4      查看配置是否生效。mvn -v                                  步骤 5      查看配置是否生效。修改Maven配置文件中的:本地仓路径、远程仓等。配置文件路径:“/opt/tools/installed/apache-maven-3.5.4/conf/settings.xml”远程仓库配置(修改成自己搭建的Maven仓库,如果没有,可以按照下面示例配置),在<mirrors>标签内添加以下内容: <mirror>  <id>huaweimaven</id>  <name>huawei maven</name>  <url>https://mirrors.huaweicloud.com/repository/maven/</url>  <mirrorOf>central</mirrorOf></mirror> 若编译环境需要代理才能访问外网,需要在settings.xml配置文件中添加代理配置,具体内容如下:<proxies>  <proxy>    <id>optional</id>    <active>true</active>    <protocol>http</protocol>    <username>用户名</username>    <password>密码</password>    <host>代理服务器网址</host>    <port>代理服务器端口</port>    <nonProxyHosts>local.net|some.host.com</nonProxyHosts>  </proxy></proxies> 3.4 安装Protobuf                                步骤 1      查看配置是否生效。yum install -y protobuf protobuf-devel                                步骤 2      通过执行以下命令,指定安装的Protoc可执行文件mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=2.5.0 -Dclassifier=linux-aarch_64 -Dpackaging=exe -Dfile=/usr/bin/protoc3.5 安装ant                                步骤 1      下载ant并安装到指定目录。wget https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.8-bin.tar.gztar -zxf apache-ant-1.10.8-bin.tar.gzmv apache-ant-1.10.8-bin /opt/tools/installed/                                步骤 2      配置ant环境变量。vim /etc/profile在“/etc/profile”文件末尾增加下面代码。export ANT_HOME=/opt/tools/installed/ pache-ant-1.10.8export PATH=$ANT_HOME/bin:$PATH                                步骤 3      使修改的环境变量生效source /etc/profile                                步骤 4      查看配置是否生效。ant -version4 编译4.1 编译jna根据《jna-3.0.9移植指南》编译jna-3.0.9,编译完成后将会在“jna-3.0.9/jnalib/build-d64”目录下生成jna.jar。4.2 编译jython-standalone步骤 1 下载frozen-mirror-2.5.2安装包和frozen-mirror-2.5.3安装包。wget https://github.com/jython/frozen-mirror/archive/v2.5.1.tar.gzwget https://github.com/jython/frozen-mirror/archive/v2.5.3.tar.gz 步骤 2 解压安装包。tar -zxf v2.5.1.tar.gztar -zxf v2.5.3.tar.gz步骤 3 进入解压后目录cd frozen-mirror-2.5.1步骤 4 替换jar将在4.1获取的jna.jar复制到frozen-mirror-2.5.1/extlibs并覆盖原来的jna.jar下mv xxx/jna.jar extlibs其中xxx为jna.jar所在的目录步骤 5 将frozen-mirror-2.5.3/lib-python/2.5/文件夹复制到frozen-mirror-2.5.1下cp -r frozen-mirror-2.5.3/lib-python/2.5/ frozen-mirror-2.5.1/CPythonLib步骤 6 修改xml文件在目标<target name=”init”>内最后一行加上<property name="jython.standalone.jar" value="jython-standalone.jar" />在目标<target name="jar-complete" depends="jar">的下方,目标<target name="jar" depends="compile,expose">的上方,加上如下内容<target name="jar-standalone" depends="jar-complete, copy-lib">        <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask" classpath="extlibs/jarjar-0.7.jar"/>        <jarjar destfile="${dist.dir}/${jython.standalone.jar}">            <zipfileset src="${dist.dir}/${jython.deploy.jar}"/>            <fileset dir="${dist.dir}" includes="Lib/**" excludes="Lib/test/**,Lib/email/test/**"/>             <manifest>                <attribute name="Main-Class" value="org.python.util.jython" />                <attribute name="Built-By" value="${user.name}" />                <!-- info section. ATTN: no blanks, no '.' in the names -->                <section name="Build-Info">                    <attribute name="version" value="${jython.version}" />                    <attribute name="svn-build" value="${do.checkout}" />                    <attribute name="oracle" value="${oracle.present}" />                    <attribute name="informix" value="${informix.present}" />                    <attribute name="build-compiler" value="${build.compiler}" />                    <attribute name="jdk-target-version" value="${jdk.target.version}" />                    <attribute name="debug" value="${debug}" />                </section>            </manifest>        </jarjar></target> 步骤 7 执行编译ant jar-standalone生成的jar包在dist下步骤 8 使用鲲鹏分析扫描工具扫描编译生成的jar包,确保没有包含有x86的so和jar包。步骤 9 安装到本地仓由于ant命令不会将jar包放到本地maven仓,我们可以将jar-standalone安装到本地maven仓或私仓,方便后面调用,如下示例为安装到本地maven仓:mvn install:install-file -DgroupId=org.python -DartifactId=jython-standalone -Dversion=2.5.2 -Dpackaging=jar -Dfile=dist/jython-standalone.jar执行成功后,查看本地maven仓是否有jython-standalone-2.5.2.jar----结束 5 故障排除5.1 首次编译失败 现象描述:首次编译时失败。 处理步骤:执行一次失败后,再执行ant jar-standalone,编译成功。 5.2 CPythonLib does not exist现象描述:提示没有CPythonLib 处理步骤:按4.2的步骤5将frozen-mirror-2.5.3/lib-python/2.5/文件夹复制到frozen-mirror-2.5.1/CPythonLib下 5.3 Target “jar-standalone” does not exist in the project “jython”现象描述:提示没有目标“jar-standalone” 处理步骤:按4.2的步骤6将jython-standalone目标加到build.xml
  • [问题求助] 【DevCloud】【项目构建功能】使用基于springboot的web项目模板构建maven失败
    【功能模块】DevCloud的代码构建【操作步骤&问题现象】1、使用其模板,没有经过任何修改结果不通过。2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] Setting.xml文件详解
    1. 总体结构<!--声明语句--> <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!-- 本地仓库的路径。默认值为${user.home}/.m2/repository。 --> <localRepository>usr/local/maven</localRepository>    <!--Maven是否需要和用户交互以获得输入。需要设置成true,否则false。默认true。--> <interactiveMode>true</interactiveMode> <!--Maven是否需要使用plugin-registry.xml文件来管理插件版本。如果需要让Maven使用文件${user.home}/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为 false。--> <usePluginRegistry>false</usePluginRegistry> <!--表示Maven是否需要在离线模式下运行。需要则为true,默认为false。一般应用于网络不通或者出于其它安全考虑 --> <offline>false</offline> <!--当插件的组织Id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。当我 们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins和org.codehaus.mojo --> <pluginGroups> <!--plugin的组织Id(groupId) -->   <pluginGroup>org.codehaus.mojo</pluginGroup> </pluginGroups> <!--配置不同的代理,多代理profiles 可以应对笔记本或移动设备的工作环境:通过简单的设置profile id就可以很容易的更换整个代理配置。 很少用到--> <proxies> <proxy> <!--唯一标识--> <id>myproxy</id> <!--true则激活此代理 --> <active>true</active> <!--代理的协议--> <protocol>http</protocol> <!--代理的主机名--> <host>proxy.somewhere.com</host> <!--代理的端口--> <port>8080</port> <!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。 --> <username>proxyuser</username> <!--代理的密码--> <password>somepassword</password> <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。--> <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> </proxy> </proxies> <!--配置服务端的一些设置。一些设置如安全证书不应该和pom.xml一起分发。这种类型的信息应该存在于构建服务器上的settings.xml文件中。--> <servers> <server> <!--该id与distributionManagement中repository元素的id相匹配。--> <id>server001</id> <!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 --> <username>my_login</username> <!--鉴权密码 密码加密功能已被添加到2.1.0 +。详情请访问密码加密页面--> <password>my_password</password> <!--鉴权时使用的私钥位置。和前两个元素类似,私钥位置和私钥密码指定了一个私钥的路径(默认是${user.home}/.ssh/id_dsa)以及如果需要的话,一个密语。将来passphrase和password元素可能会被提取到外部,但目前它们必须在settings.xml文件以纯文本的形式声明。 --> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <!--鉴权时使用的私钥密码。--> <passphrase>some_passphrase</passphrase> <!--文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 --> <filePermissions>664</filePermissions> <!--目录被创建时的权限。 --> <directoryPermissions>775</directoryPermissions> </server> </servers> <!--为仓库列表配置的下载镜像列表。高级设置请参阅镜像设置页面 --> <mirrors> <mirror> <!--唯一标识符,区分不同的mirror元素 --> <id>planetmirror.com</id> <!--镜像名称 --> <name>PlanetMirror Australia</name> <!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL,就是下载jar包的路径 --> <url>http://downloads.planetmirror.com/pub/maven2</url> <!--被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。这必须和中央仓 库的id central完全一致。--> <mirrorOf>central</mirrorOf> </mirror> </mirrors> <!--根据环境参数来调整构建配置的列表。settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。这里的profile元素只关心构建系统这个整体,而非单独的项目对象模型设置。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。 --> <profiles> <profile> <!--唯一标识--> <id>test</id> <!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。如POM中的profile一样,profile的力量来自于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以。profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。--> <activation> <!--默认是否激活该profile--> <activeByDefault>false</activeByDefault> <!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。--> <jdk>1.5</jdk> <!--当存在匹配的操作系统属性,profile被激活。一般不使用--> <os> <!--激活profile的操作系统的名字 --> <name>Windows 7</name> <!--激活profile的操作系统所属家族(如 'windows') --> <family>Windows</family> <!--激活profile的操作系统体系结构 --> <arch>x64</arch> <!--激活profile的操作系统版本--> <version>5.1.2600</version> </os> <!--如果Maven检测到某一个xml节点等于下面name的值,并且该节点的值等于下面value的值。那么激活这个profile。如果值字段是空的,那么存在属性名称字段就会激活--> <![CDATA[比如根据下面的配置,当存在<mavenVersion>2.0.3</mavenVersion>节点时将激活此profile]]> <property> <!--激活profile的属性的名称--> <name>mavenVersion</name> <!--激活profile的属性的值 --> <value>2.0.3</value> </property> <!--提供一个文件名,通过检测该文件的存在与否来激活profile--> <file> <!--如果指定的文件存在,则激活profile。 --> <exists>${basedir}/file2.properties</exists> <!--如果指定的文件不存在,则激活profile。--> <missing>${basedir}/file1.properties</missing> </file> </activation> <!--对应profile的自定义属性列表。Maven属性和Ant中的属性一样,可以用来存放一些值。这些值可以在POM中的任何地方使用标记${X}来使用,这里X是指属性的名称。属性有五种不同的形式,并且都能在settings.xml文件中访问。 1. env.X: 在一个变量前加上"env."的前缀,会返回一个shell环境变量。例如,"env.PATH"指代了$path环境变量(在Windows上是%PATH%)。 2. project.x:指代了POM中对应的元素值。例如: <project><version>1.0</version></project>通过${project.version}获得version的值。 3. settings.x: 指代了settings.xml中对应元素的值。例如:<settings><offline>false</offline></settings>通过 ${settings.offline}获得offline的值。 4. Java System Properties: 所有可通过java.lang.System.getProperties()访问的属性都能在POM中使用该形式访问,例如 ${java.home}。 5. x: 在<properties/>元素中,或者外部文件中设置,以${someVar}的形式使用。 --> <!--当该profile被激活,则可以再POM中使用${user.install}。--> <properties> <user.install>${user.home}/our-project</user.install> </properties> <!--远程仓库列表,它是Maven用来填充构建系统本地仓库所使用的一组远程项目。 --> <repositories> <!--包含需要连接到远程仓库的信息 --> <repository> <!--远程仓库唯一标识--> <id>codehausSnapshots</id> <!--远程仓库名称 --> <name>Codehaus Snapshots</name> <!--如何处理远程仓库里发布版本的下载--> <releases> <!--true或者false表示该仓库是否开启下载--> <enabled>false</enabled> <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),never(从不)。 --> <updatePolicy>always</updatePolicy> <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。--> <checksumPolicy>warn</checksumPolicy> </releases> <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。--> <snapshots> <enabled/><updatePolicy/><checksumPolicy/> </snapshots> <!--远程仓库URL,按protocol://hostname/path形式 --> <url>http://snapshots.maven.codehaus.org/maven2</url> <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven2为其仓库提供了一个默认的布局;Maven1.x有一种遗留布局。我们可以使用该元素指定布局是default还是legacy--> <layout>default</layout> </repository> </repositories> <!--发现插件的远程仓库列表。仓库是两种主要构件的家。第一种构件被用作其它构件的依赖。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件。Maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories元素的结构和repositories元素的结构类似。每个pluginRepository元素指定一个Maven可以用来寻找新插件的远程地址。--> <pluginRepositories> <!--参见profiles/profile/repositories/repository元素的说明--> <pluginRepository> <releases> <enabled/><updatePolicy/><checksumPolicy/> </releases> <snapshots> <enabled/><updatePolicy/><checksumPolicy/> </snapshots> <id/><name/><url/><layout/> </pluginRepository> </pluginRepositories> </profile> </profiles> <!--手动激活profiles的列表,按照activeProfile的定义顺序激活并应用profiles。如果没有匹配的profile,则什么都不会发生,Maven则会像往常一样运行--> <activeProfiles> <activeProfile>env-test</activeProfile> </activeProfiles> </settings>2. 具体结构2.1 proxies代理<!--配置不同的代理,多代理profiles 可以应对笔记本或移动设备的工作环境:通过简单的设置profile id就可以很容易的更换整个代理配置。 很少用到--> <proxies> <proxy> <!--唯一标识--> <id>myproxy</id> <!--true则激活此代理 --> <active>true</active> <!--代理的协议--> <protocol>http</protocol> <!--代理的主机名--> <host>proxy.somewhere.com</host> <!--代理的端口--> <port>8080</port> <!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。 --> <username>proxyuser</username> <!--代理的密码--> <password>somepassword</password> <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。--> <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> </proxy> </proxies>2.2 servers服务端的配置<!--配置服务端的一些设置。一些设置如安全证书不应该和pom.xml一起分发。这种类型的信息应该存在于构建服务器上的settings.xml文件中。--> <servers> <server> <!--该id与distributionManagement中repository元素的id相匹配。--> <id>server001</id> <!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 --> <username>my_login</username> <!--鉴权密码 密码加密功能已被添加到2.1.0 +。详情请访问密码加密页面--> <password>my_password</password> <!--鉴权时使用的私钥位置。和前两个元素类似,私钥位置和私钥密码指定了一个私钥的路径(默认是${user.home}/.ssh/id_dsa)以及如果需要的话,一个密语。将来passphrase和password元素可能会被提取到外部,但目前它们必须在settings.xml文件以纯文本的形式声明。 --> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <!--鉴权时使用的私钥密码。--> <passphrase>some_passphrase</passphrase> <!--文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 --> <filePermissions>664</filePermissions> <!--目录被创建时的权限。 --> <directoryPermissions>775</directoryPermissions> </server> </servers>2.3 mirrors镜像库<!--为仓库列表配置的下载镜像列表。高级设置请参阅镜像设置页面 --> <mirrors> <mirror> <!--唯一标识符,区分不同的mirror元素 --> <id>planetmirror.com</id> <!--镜像名称 --> <name>PlanetMirror Australia</name> <!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL,就是下载jar包的路径 --> <url>http://downloads.planetmirror.com/pub/maven2</url> <!--被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。这必须和中央仓 库的id central完全一致。--> <mirrorOf>central</mirrorOf> </mirror> </mirrors>2.4 profile 构建配置<!--根据环境参数来调整构建配置的列表。settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。这里的profile元素只关心构建系统这个整体,而非单独的项目对象模型设置。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。 --> <profiles> <profile> <!--唯一标识--> <id>test</id> <!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。如POM中的profile一样,profile的力量来自于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以。profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。--> <activation> <!--默认是否激活该profile--> <activeByDefault>false</activeByDefault> <!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。--> <jdk>1.5</jdk> <!--当存在匹配的操作系统属性,profile被激活。一般不使用--> <os> <!--激活profile的操作系统的名字 --> <name>Windows 7</name> <!--激活profile的操作系统所属家族(如 'windows') --> <family>Windows</family> <!--激活profile的操作系统体系结构 --> <arch>x64</arch> <!--激活profile的操作系统版本--> <version>5.1.2600</version> </os> <!--如果Maven检测到某一个xml节点等于下面name的值,并且该节点的值等于下面value的值。那么激活这个profile。如果值字段是空的,那么存在属性名称字段就会激活--> <![CDATA[比如根据下面的配置,当存在<mavenVersion>2.0.3</mavenVersion>节点时将激活此profile]]> <property> <!--激活profile的属性的名称--> <name>mavenVersion</name> <!--激活profile的属性的值 --> <value>2.0.3</value> </property> <!--提供一个文件名,通过检测该文件的存在与否来激活profile--> <file> <!--如果指定的文件存在,则激活profile。 --> <exists>${basedir}/file2.properties</exists> <!--如果指定的文件不存在,则激活profile。--> <missing>${basedir}/file1.properties</missing> </file> </activation> <!--对应profile的自定义属性列表。Maven属性和Ant中的属性一样,可以用来存放一些值。这些值可以在POM中的任何地方使用标记${X}来使用,这里X是指属性的名称。属性有五种不同的形式,并且都能在settings.xml文件中访问。 1. env.X: 在一个变量前加上"env."的前缀,会返回一个shell环境变量。例如,"env.PATH"指代了$path环境变量(在Windows上是%PATH%)。 2. project.x:指代了POM中对应的元素值。例如: <project><version>1.0</version></project>通过${project.version}获得version的值。 3. settings.x: 指代了settings.xml中对应元素的值。例如:<settings><offline>false</offline></settings>通过 ${settings.offline}获得offline的值。 4. Java System Properties: 所有可通过java.lang.System.getProperties()访问的属性都能在POM中使用该形式访问,例如 ${java.home}。 5. x: 在<properties/>元素中,或者外部文件中设置,以${someVar}的形式使用。 --> <!--当该profile被激活,则可以再POM中使用${user.install}。--> <properties> <user.install>${user.home}/our-project</user.install> </properties> <!--远程仓库列表,它是Maven用来填充构建系统本地仓库所使用的一组远程项目。 --> <repositories> <!--包含需要连接到远程仓库的信息 --> <repository> <!--远程仓库唯一标识--> <id>codehausSnapshots</id> <!--远程仓库名称 --> <name>Codehaus Snapshots</name> <!--如何处理远程仓库里发布版本的下载--> <releases> <!--true或者false表示该仓库是否开启下载--> <enabled>false</enabled> <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),never(从不)。 --> <updatePolicy>always</updatePolicy> <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。--> <checksumPolicy>warn</checksumPolicy> </releases> <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。--> <snapshots> <enabled/><updatePolicy/><checksumPolicy/> </snapshots> <!--远程仓库URL,按protocol://hostname/path形式 --> <url>http://snapshots.maven.codehaus.org/maven2</url> <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven2为其仓库提供了一个默认的布局;Maven1.x有一种遗留布局。我们可以使用该元素指定布局是default还是legacy--> <layout>default</layout> </repository> </repositories> <!--发现插件的远程仓库列表。仓库是两种主要构件的家。第一种构件被用作其它构件的依赖。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件。Maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories元素的结构和repositories元素的结构类似。每个pluginRepository元素指定一个Maven可以用来寻找新插件的远程地址。--> <pluginRepositories> <!--参见profiles/profile/repositories/repository元素的说明--> <pluginRepository> <releases> <enabled/><updatePolicy/><checksumPolicy/> </releases> <snapshots> <enabled/><updatePolicy/><checksumPolicy/> </snapshots> <id/><name/><url/><layout/> </pluginRepository> </pluginRepositories> </profile> </profiles>2.5 activeProfiles指定激活的配置<!--手动激活profiles的列表,按照activeProfile的定义顺序激活并应用profiles。如果没有匹配的profile,则什么都不会发生,Maven则会像往常一样运行--> <activeProfiles> <activeProfile>env-test</activeProfile> </activeProfiles>
  • [问题求助] maven仓库并没有成功镜像grails-core仓库
    比如这个地址: https://repo.huaweicloud.com/repository/maven/org/grails/profiles/web-plugin/ 最高只有 3.2.0M2版本,而高版本的jar包存在于grails-core仓库中: https://repo.grails.org/core/org/grails/profiles/web-plugin/ 可以看到包含了4.0以上的版本,虽然帮助文档中写了镜像源中有grails-core,但实际并未镜像成功,能否帮忙排查一下呢?谢谢了
  • [二次开发] 【MRS产品】【HDFS二次开发】已配置Maven加载包运行HdfsExample.java类
    [问题求助-二次开发]已配置Maven怎么样加载包运行HdfsExample.java类【功能模块】二次开发【操作步骤&问题现象】1.已安装java2.已安装mven3.已从github下载相应的样例代码 https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-3.1.15.maven目录conf文件4.idea已经配置mevn路径6.加载包5.已经加载完之后运行HdfsExample.java【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【鲲鹏云主机产品】【leveldbjnr功能】mvn时出现问题,leveldbjni-linux64 FAILURE
    【功能模块】leveldbjnr【操作步骤&问题现象】1、mvn clean package -P download -P linux64-aarch64 –DskipTests2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [数据编排] ide: 流水线打包失败报错maven excution failed
    【功能模块】【操作步骤&问题现象】流水线打包失败
总条数:123 到第
上滑加载中