-
1. 移植环境类别版本OS银河麒麟V10 B06 for ARMJDK1.8.0_191Maven3.5.4netty4.1.32neo4j3.5.4 2. 软件准备2.1OpenJDK安装2.1.1下载并安装到指定目录#wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u191-b12/OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gz#tar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gz#mv jdk8u191-b12 /opt/tools/installed/2.1.2配置Java环境变量: #vim /etc/profile 添加以下内容:(以实际安装路径为准) JAVA_HOME=/opt/tools/installed/jdk8u191-b12PATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME PATH使修改的环境变量生效:#source /etc/profile2.1.3查看JDK版本#java -version2.2Maven安装2.2.1下载并安装到指定目录#Wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz#tar -zxf apache-maven-3.5.4-bin.tar.gz#mv apache-maven-3.5.4 /opt/tools/installed/2.2.2添加环境变量 #vim /etc/profile 添加以下内容(以实际路径为准):MAVEN_HOME=/opt/tools/installed/apache-maven-3.5.4PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATHexport MAVEN_HOME JAVA_HOME PATH使环境变量生效:#source /etc/profile2.2.3修改maven配置文件中的,本地仓、远程仓等:配置文件路径:/opt/tools/installed/apache-maven-3.5.4/conf/settings.xml本地仓库配置:(可选,可保持默认)<!--默认在“~/.m2/”目录下,可以按下行格式修改成你自己想保存的目录--><localRepository>/path/to/local/repo</localRepository>远程仓库配置:(可选,默认用maven2官方远程仓但访问慢,建议用国内maven仓)<!--修改成自己搭建的maven仓库,如果没有,可以使用下面的华为开源maven仓 --><mirror><id> huaweimaven</id><name> huaweicloud maven</name><url> https://mirrors.huaweicloud.com/repository/maven/</url><mirrorOf>central</mirrorOf></mirror>配置代理:(可选,外网环境下不用配置maven的代理) <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. 依赖包安装netty-all-4.1.32.Final.jar移植此组件在鲲鹏上已经编译,可以直接下载上传到本地Maven仓。将此jar包拷贝到以下路径#cp netty-all-4.1.32.Final.jar /root/.m2/repository/io/netty/netty-all/4.1.32.Final/4. Neo4j-3.5.4编译安装4.1设置相关约束条件#ulimit -HSn 400000#export MAVEN_OPTS="-Xmx512m"4.2下载Neo4j源码下载路径:https://github.com/neo4j/neo4j/tree/3.5.44.3编译将下载的源码上传到服务器并解压。#unzip neo4j-3.5.4.zip#cd neo4j-3.5.4/#mvn clean install –DskipTests编译完成的压缩包在packaging/standalone/target目录下5. 运行验证5.1将编译完成的压缩包拷贝包”/opt/tools”并解压。#cp neo4j-community-3.5.4-SNAPSHOT-unix.tar.gz /opt/tools/#cd /opt/tools#tar –zxvf neo4j-community-3.5.4-SNAPSHOT-unix.tar.gz5.2修改neo4j.conf配置文件。#vim conf/neo4j.conf# 修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库dbms.connectors.default_listen_address=0.0.0.0# 默认 bolt端口是7687,http端口是7474,https关口是7473,不修改下面3项也可以# 修改71行,去掉#,设置http端口为7687,端口可以自定义,只要不和其他端口冲突就行#dbms.connector.bolt.listen_address=:7687# 修改75行,去掉#,设置http端口为7474,端口可以自定义,只要不和其他端口冲突就行dbms.connector.http.listen_address=:7474# 修改79行,去掉#,设置http端口为7473,端口可以自定义,只要不和其他端口冲突就行dbms.connector.https.listen_address=:74735.2关闭防火墙#systemctl stop firewalld#systemctl disable firewalld5.3启动neo4j进入bin目录执行./neo4j start#cd bin/#./neo4j start5.4使用PC可以访问neo4j的web页面http://ipaddress:7474第一次登录的用户名密码都为neo4j5.5停止neo4j#./neo4j stop5.6查看状态#./neo4j status
-
【功能模块】 hive样例工程【操作步骤&问题现象】1、配置settings文件后,更新maven依赖,一直更新不成功,报下面的错误2、【截图信息】Could not transfer artifact org.apache.hadoop:hadoop-auth:pom:3.1.1-hw-ei-310003 from/to nexus-aliyun (https://maven.aliyun.com/repository/public): transfer failed for https://maven.aliyun.com/repository/public/org/apache/hadoop/hadoop-auth/3.1.1-hw-ei-310003/hadoop-auth-3.1.1-hw-ei-310003.pom【日志信息】(可选,上传日志内容或者附件)
-
【问题描述】编译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 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行)等遇到类似报错可参考相同解决方法;
-
@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
-
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
-
一、项目简述功能:用户的邮箱注册、验证码验证以及用户登录。 不需要注册账号,也可以上传满足条件的临时文件,但是 只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
-
【功能模块】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 介绍简要介绍大数据组件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的代码构建【操作步骤&问题现象】1、使用其模板,没有经过任何修改结果不通过。2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
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>
-
比如这个地址: 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,但实际并未镜像成功,能否帮忙排查一下呢?谢谢了
-
[问题求助-二次开发]已配置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【截图信息】【日志信息】(可选,上传日志内容或者附件)
上滑加载中
推荐直播
-
算子工具性能优化新特性演示——MatMulLeakyRelu性能调优实操
2025/01/10 周五 15:30-17:30
MindStudio布道师
算子工具性能优化新特性演示——MatMulLeakyRelu性能调优实操
回顾中 -
用代码全方位驱动 OBS 存储
2025/01/14 周二 16:30-18:00
阿肯 华为云生态技术讲师
如何用代码驱动OBS?常用的数据管理,对象清理,多版本对象访问等应该如何编码?本期课程一一演示解答。
即将直播 -
GaussDB数据库开发
2025/01/15 周三 16:00-17:30
Steven 华为云学堂技术讲师
本期直播将带你了解GaussDB数据库开发相关知识,并通过实验指导大家利用java基于JDBC的方式来完成GaussD数据库基础操作。
去报名
热门标签