[{"data":1,"prerenderedAt":8268},["ShallowReactive",2],{"posts:all":3},[4,417,820,1047,1104,1824,3143,4031,4451,5198,6144,6559,8125],{"id":5,"title":6,"body":7,"date":403,"description":404,"extension":405,"meta":406,"navigation":407,"path":408,"seo":409,"stem":410,"tags":411,"__hash__":416},"posts\u002Fposts\u002Feasyauth-2fa-webdav-s3-backup-client.md","换完手机，GitHub 把我挡在了门外",{"type":8,"value":9,"toc":386},"minimark",[10,14,17,20,23,28,31,34,63,66,69,72,105,108,111,115,118,121,128,136,144,147,150,153,158,161,175,181,187,190,193,196,199,206,212,215,222,228,231,246,253,259,266,269,275,281,287,290,293,329,332,335,338,341,380,383],[11,12,13],"p",{},"换完手机那天，GitHub 把我挡在了门外。",[11,15,16],{},"那天我坐在电脑前，屏幕上弹出来的还是那行熟悉的提示——请输入两步验证代码。我掏出手机打开验证器，列表是空的，一条都没有。换机之前我以为它会跟着微软账号一起同步回来，结果并没有。中间到底卡在哪一步断的，我到现在也说不清。",[11,18,19],{},"先翻恢复码，没存；翻邮箱，没有；翻笔记，还是没有。最后只能走申诉：填表、等回复、再补材料，一个账号折腾了好几天才算有个说法。",[11,21,22],{},"那几天我一直在想一件事：我的密码一个都没丢，锁是我自己加的，可钥匙不知道被我放哪儿去了。",[24,25,27],"h2",{"id":26},"那些验证器本来也没打算让你把数据拿走","那些验证器，本来也没打算让你把数据拿走",[11,29,30],{},"先说清楚，把验证码放在手机上没有任何问题。Microsoft Authenticator 我用了很多年，平时很顺手，它也确实尽职。",[11,32,33],{},"问题是，一直到出事那天我才发现，我从来没搞清楚过几件事：我的数据存在哪里、上一次同步是什么时候成功的、以及万一要用的时候，我能不能把它拿出来。",[35,36,37,45,51,57],"ul",{},[38,39,40,44],"li",{},[41,42,43],"strong",{},"Google Authenticator","：同步要连 Google 的服务。在国内能不能连上、什么时候能连上，基本看运气。它可以把账号扫码迁到另一个 App，但不会给你一份能自己保管的备份文件。",[38,46,47,50],{},[41,48,49],{},"Microsoft Authenticator","：备份锁在微软账号里，跨系统恢复限制不少——在安卓上备份的，往 iPhone 上恢复往往就不行。我这次就是栽在这儿：换完机打开，一条都没有。",[38,52,53,56],{},[41,54,55],{},"Authy","：注册要手机号，数据在它自己的云上。想手动导出一份，它不给这个选项。",[38,58,59,62],{},[41,60,61],{},"把 2FA 顺手塞进密码管理器","（1Password、Bitwarden 之类）：确实方便，但等于把密码和验证码放进同一个篮子。篮子漏了一次，二次验证也就白开了——它的全部意义本来就在于\"再多一道锁\"。",[11,64,65],{},"绕一圈你会发现，这些方案都在回答同一个问题：\"我的验证码存在谁那儿？\" 而答案基本都是\"存我这儿就行，你不用管\"。",[24,67,68],{"id":68},"我想要的东西其实很朴素",[11,70,71],{},"列出来就五条：",[73,74,75,81,87,93,99],"ol",{},[38,76,77,80],{},[41,78,79],{},"数据存在本地","，最好能用上系统的加密存储；",[38,82,83,86],{},[41,84,85],{},"能备份到我本来就有的地方","——坚果云、自己的 NAS、对象存储，这些我早就在用了，不想再为它单独开个账号；",[38,88,89,92],{},[41,90,91],{},"备份必须是加密的","，网盘服务商拿到也看不懂；",[38,94,95,98],{},[41,96,97],{},"兼容标准","，能从别家导进来，也能导出去，别再添一个孤岛；",[38,100,101,104],{},[41,102,103],{},"换手机的时候，别再让我把几十个账号一个个重新扫一遍","。",[11,106,107],{},"按这几条筛，能同时满足的其实不多：有些方案得自己搭服务、平时开着浏览器用，而我想要的只是在手机上点一下。",[11,109,110],{},"后来我用的是 EasyAuth。",[24,112,114],{"id":113},"easyauth-是什么","EasyAuth 是什么",[11,116,117],{},"一句话：一个开源的 2FA 验证器 App，本地存储、离线可用，并且支持把数据加密备份到你自己的 WebDAV 或 S3 存储。",[11,119,120],{},"它是 Flutter 写的，Apache 2.0 协议完全开源，代码公开可审计，没有账号体系、没有遥测、没有广告，也不需要 Google 服务框架。",[11,122,123,124,127],{},"目前能直接下载安装的是 ",[41,125,126],{},"Android 版 APK","（GitHub \u002F Gitee 上都有）。iOS、Windows、Linux 还没有预编译版本，源码是公开的，可以自己编译。",[11,129,130,131,135],{},"算法上是 TOTP（RFC 6238）和 HOTP（RFC 4226）两种标准，兼容 Google Authenticator 那套 ",[132,133,134],"code",{},"otpauth:\u002F\u002F"," 协议和迁移二维码——意味着它能跟别家互相搬家，不是又一个只能进不能出的孤岛。",[11,137,138],{},[139,140],"img",{"alt":141,"src":142,"width":143},"EasyAuth 主界面：口令按发行方分卡片，右侧是倒计时环","\u002Fimages\u002Feasyauth-2fa-webdav-s3-backup-client\u002Fhome-list.jpg",360,[11,145,146],{},"界面很朴素：顶上一行搜索框，下面是口令卡片，每张卡片三行——口令名、发行方、当前六位数字，右边一圈倒计时。没有花活，也没有让我盯着看的动画。",[24,148,149],{"id":149},"它把备份这件事做对了",[11,151,152],{},"如果只让我说一个推荐理由，就是备份。",[154,155,157],"h3",{"id":156},"备份存哪儿你说了算","备份存哪儿，你说了算",[11,159,160],{},"支持两类：",[35,162,163,169],{},[38,164,165,168],{},[41,166,167],{},"WebDAV","：坚果云、Nextcloud，以及群晖、威联通这些自建 NAS 基本都自带；",[38,170,171,174],{},[41,172,173],{},"S3 兼容","：AWS S3、阿里云 OSS、腾讯云 COS、七牛云、MinIO、Cloudflare R2 这类对象存储。",[11,176,177],{},[139,178],{"alt":179,"src":180,"width":143},"WebDAV 备份参数配置","\u002Fimages\u002Feasyauth-2fa-webdav-s3-backup-client\u002Fbackup-webdav.jpg",[11,182,183],{},[139,184],{"alt":185,"src":186,"width":143},"S3（对象存储）备份参数配置","\u002Fimages\u002Feasyauth-2fa-webdav-s3-backup-client\u002Fbackup-s3.jpg",[11,188,189],{},"关键在于\"你自己的\"这四个字：填的是你自己服务器的地址、你自己的密钥，备份文件进的是你自己的空间。哪天不想用了，文件也还在你自己的空间里，不会因为某个服务关停就跟着消失。",[154,191,192],{"id":192},"备份本身是加密的",[11,194,195],{},"备份文件用 AES-256-GCM 加密，密钥由你设置的备份密码经 PBKDF2-HMAC-SHA256 迭代 60 万次派生。换句话说，你的网盘账号就算被别人拿到了，他下载走那个 zip 也只是一堆乱码。",[154,197,198],{"id":198},"多版本可回退",[11,200,201,202,205],{},"备份文件名带时间戳，形如 ",[132,203,204],{},"backup_20260527_120413.zip","，默认在远端保留最近 10 份，超出的自动清理。也可以在 App 里直接看到远端有哪些备份、手动删掉不要的，不用专门登录服务器去收拾。",[11,207,208],{},[139,209],{"alt":210,"src":211,"width":143},"管理远端备份：直接在 App 里查看和删除","\u002Fimages\u002Feasyauth-2fa-webdav-s3-backup-client\u002Fmanage-remote-backup.jpg",[154,213,214],{"id":214},"恢复不会手滑",[11,216,217,218,221],{},"恢复是覆盖式的，所以它一定会先弹一次确认。密码错了、或者备份文件损坏，它会直接报错，",[41,219,220],{},"不会","动你已经存在的数据。这个细节挺重要——恢复本来就是出事的时候才会做的事，那个时刻最不该再出岔子。",[11,223,224],{},[139,225],{"alt":226,"src":227,"width":143},"设置页：上半是备份设置，下半是安全设置","\u002Fimages\u002Feasyauth-2fa-webdav-s3-backup-client\u002Fsettings.jpg",[24,229,230],{"id":230},"上手就三步",[73,232,233,236,243],{},[38,234,235],{},"进「设置」→「备份参数配置」，选 WebDAV 或 S3，把地址和各把密钥填进去；",[38,237,238,239,242],{},"第一次点备份时，它会让你设一个",[41,240,241],{},"备份密码","——用来加密备份文件；",[38,244,245],{},"点「备份到远端」。主页搜索栏右边那个云图标就是入口，成功会变绿，失败会变红。",[11,247,248,249,252],{},"第 2 步要多说一句：",[41,250,251],{},"这个密码一定要另外记好","。它只存在你设备的本地加密区，忘掉就没有找回途径，备份文件也就永远打不开了。",[11,254,255],{},[139,256],{"alt":257,"src":258,"width":143},"主页：搜索栏右侧的云图标是备份入口，右下角加号用来添加口令","\u002Fimages\u002Feasyauth-2fa-webdav-s3-backup-client\u002Fhome.jpg",[11,260,261,262,265],{},"还有一点需要提前知道：",[41,263,264],{},"云盘配置和备份密码都不会写进备份文件","（这是刻意的，否则备份文件本身就成了万能钥匙）。所以换新手机的时候，得重新填一次配置和密码，再点「从远端恢复」。比\"一键同步\"多一步，换来的是备份文件泄露也打不开。",[11,267,268],{},"如果原来用的是 Google Authenticator，用「导入」扫一下它导出的迁移二维码，可以一次性搬过来，不用逐个重扫。从 Microsoft Authenticator 那边过来的就没这条路——它不提供迁移到其它 App 的途径，只能照着原来的服务一个个重新加：",[11,270,271],{},[139,272],{"alt":273,"src":274,"width":143},"导出迁移二维码，新设备扫一下即可","\u002Fimages\u002Feasyauth-2fa-webdav-s3-backup-client\u002Fexport-qrcode.jpg",[11,276,277],{},[139,278],{"alt":279,"src":280,"width":143},"扫码添加口令","\u002Fimages\u002Feasyauth-2fa-webdav-s3-backup-client\u002Fscan-qr.jpg",[11,282,283],{},[139,284],{"alt":285,"src":286,"width":143},"不提供二维码的网站，可以手动输入密钥","\u002Fimages\u002Feasyauth-2fa-webdav-s3-backup-client\u002Fmanual-input.jpg",[24,288,289],{"id":289},"最后说清楚风险",[11,291,292],{},"得把丑话说在前面：",[35,294,295,301,311,317,323],{},[38,296,297,300],{},[41,298,299],{},"备份密码没有找回途径。"," 这既是它的安全性，也是它最大的坑。请把它当成恢复码一样对待——写下来，存到别的地方。",[38,302,303,306,307,310],{},[41,304,305],{},"它不该是你唯一的一把钥匙。"," 我现在的做法是：除了云备份，关键账号的恢复码另外单独存一份，并且隔一段时间",[41,308,309],{},"真的做一次恢复测试","。备份这件事，没验证过就等于没备份——这是我这次教训里最值钱的一条。",[38,312,313,316],{},[41,314,315],{},"口令生成本身不联网","，断网照样出码；只有备份和恢复需要网络。",[38,318,319,322],{},[41,320,321],{},"它不是自托管服务","，没有网页端、也不需要服务器。数据在手机本地，备份在你自己的网盘，你不需要为它单独准备一台机器。",[38,324,325,328],{},[41,326,327],{},"别再往同一个篮子里加东西。"," 如果你正打算把 2FA 塞进密码管理器，建议别——那是另一种形式的单点故障。",[24,330,331],{"id":331},"说在后面",[11,333,334],{},"现在我再换手机，流程是：新机器上装好、重新填一次备份配置和密码、点「从远端恢复」。几分钟。",[11,336,337],{},"2FA 的意义本来就是把钥匙多放一把在自己手里。既然如此，这把钥匙最好真的在自己手里。",[11,339,340],{},"对了，还得交代一句：EasyAuth 是我自己写的，起因就是开头那件事。它完全开源，用得上的话自取：",[35,342,343,352,359,366,373],{},[38,344,345,346],{},"官网：",[347,348,349],"a",{"href":349,"rel":350},"https:\u002F\u002Feasyauth.easydebug.net\u002F",[351],"nofollow",[38,353,354,355],{},"GitHub 仓库：",[347,356,357],{"href":357,"rel":358},"https:\u002F\u002Fgithub.com\u002FEasyDebug-NET\u002FEasyAuth",[351],[38,360,361,362],{},"GitHub 下载：",[347,363,364],{"href":364,"rel":365},"https:\u002F\u002Fgithub.com\u002FEasyDebug-NET\u002FEasyAuth\u002Freleases\u002Flatest",[351],[38,367,368,369],{},"Gitee 仓库：",[347,370,371],{"href":371,"rel":372},"https:\u002F\u002Fgitee.com\u002FEasyDebug-NET\u002FEasyAuth",[351],[38,374,375,376],{},"Gitee 下载：",[347,377,378],{"href":378,"rel":379},"https:\u002F\u002Fgitee.com\u002FEasyDebug-NET\u002FEasyAuth\u002Freleases\u002Flatest",[351],[11,381,382],{},"有问题欢迎在仓库里提 Issue。",[11,384,385],{},"你现在的验证码存在哪儿？有没有真的确认过它恢复得回来？这两个问题，建议你今晚花五分钟去看一眼。",{"title":387,"searchDepth":388,"depth":388,"links":389},"",2,[390,391,392,393,400,401,402],{"id":26,"depth":388,"text":27},{"id":68,"depth":388,"text":68},{"id":113,"depth":388,"text":114},{"id":149,"depth":388,"text":149,"children":394},[395,397,398,399],{"id":156,"depth":396,"text":157},3,{"id":192,"depth":396,"text":192},{"id":198,"depth":396,"text":198},{"id":214,"depth":396,"text":214},{"id":230,"depth":388,"text":230},{"id":289,"depth":388,"text":289},{"id":331,"depth":388,"text":331},"2026-09-16","换完手机，验证器的备份没把数据带回来，验证码一条没剩，我被自己的 GitHub 挡在门外好几天。这篇讲清 2FA 的备份困境，以及我最后换上的开源方案 EasyAuth。","md",{},true,"\u002Fposts\u002Feasyauth-2fa-webdav-s3-backup-client",{"title":6,"description":404},"posts\u002Feasyauth-2fa-webdav-s3-backup-client",[412,413,414,415],"2FA","安全","开源","工具","XMtV4eezE89wmTqwWXReoS1BKW5O-iKjVX7r0NPmkgM",{"id":418,"title":419,"body":420,"date":809,"description":810,"extension":405,"meta":811,"navigation":407,"path":812,"seo":813,"stem":814,"tags":815,"__hash__":819},"posts\u002Fposts\u002Fcentos7-firewalld-common-commands.md","CentOS7 Firewalld 防火墙常用命令",{"type":8,"value":421,"toc":796},[422,425,449,452,466,469,483,486,500,503,517,521,554,557,593,596,734,738,760,763,777,780,792],[24,423,424],{"id":424},"开启防火墙",[426,427,431],"pre",{"className":428,"code":429,"language":430,"meta":387,"style":387},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","systemctl start firewalld.service\n","bash",[132,432,433],{"__ignoreMap":387},[434,435,438,442,446],"span",{"class":436,"line":437},"line",1,[434,439,441],{"class":440},"sBMFI","systemctl",[434,443,445],{"class":444},"sfazB"," start",[434,447,448],{"class":444}," firewalld.service\n",[24,450,451],{"id":451},"关闭防火墙",[426,453,455],{"className":428,"code":454,"language":430,"meta":387,"style":387},"systemctl stop firewalld.service\n",[132,456,457],{"__ignoreMap":387},[434,458,459,461,464],{"class":436,"line":437},[434,460,441],{"class":440},[434,462,463],{"class":444}," stop",[434,465,448],{"class":444},[24,467,468],{"id":468},"查看防火墙状态",[426,470,472],{"className":428,"code":471,"language":430,"meta":387,"style":387},"systemctl status firewalld.service\n",[132,473,474],{"__ignoreMap":387},[434,475,476,478,481],{"class":436,"line":437},[434,477,441],{"class":440},[434,479,480],{"class":444}," status",[434,482,448],{"class":444},[24,484,485],{"id":485},"开启开机启动防火墙",[426,487,489],{"className":428,"code":488,"language":430,"meta":387,"style":387},"systemctl enable firewalld.service\n",[132,490,491],{"__ignoreMap":387},[434,492,493,495,498],{"class":436,"line":437},[434,494,441],{"class":440},[434,496,497],{"class":444}," enable",[434,499,448],{"class":444},[24,501,502],{"id":502},"关闭开机启动防火墙",[426,504,506],{"className":428,"code":505,"language":430,"meta":387,"style":387},"systemctl disable firewalld.service\n",[132,507,508],{"__ignoreMap":387},[434,509,510,512,515],{"class":436,"line":437},[434,511,441],{"class":440},[434,513,514],{"class":444}," disable",[434,516,448],{"class":444},[24,518,520],{"id":519},"开启某个端口80","开启某个端口（80）",[426,522,524],{"className":428,"code":523,"language":430,"meta":387,"style":387},"firewall-cmd --zone=public --add-port=80\u002Ftcp --permanent   \u002F\u002F永久\nfirewall-cmd --zone=public --add-port=80\u002Ftcp               \u002F\u002F临时\n",[132,525,526,543],{"__ignoreMap":387},[434,527,528,531,534,537,540],{"class":436,"line":437},[434,529,530],{"class":440},"firewall-cmd",[434,532,533],{"class":444}," --zone=public",[434,535,536],{"class":444}," --add-port=80\u002Ftcp",[434,538,539],{"class":444}," --permanent",[434,541,542],{"class":444},"   \u002F\u002F永久\n",[434,544,545,547,549,551],{"class":436,"line":388},[434,546,530],{"class":440},[434,548,533],{"class":444},[434,550,536],{"class":444},[434,552,553],{"class":444},"               \u002F\u002F临时\n",[24,555,556],{"id":556},"端口转发",[426,558,560],{"className":428,"code":559,"language":430,"meta":387,"style":387},"firewall-cmd --zone=public --add-masquerade --permanent    \u002F\u002F打开IP地址伪装\n\u002F\u002F将8080转发到80\nfirewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent\n",[132,561,562,576,581],{"__ignoreMap":387},[434,563,564,566,568,571,573],{"class":436,"line":437},[434,565,530],{"class":440},[434,567,533],{"class":444},[434,569,570],{"class":444}," --add-masquerade",[434,572,539],{"class":444},[434,574,575],{"class":444},"    \u002F\u002F打开IP地址伪装\n",[434,577,578],{"class":436,"line":388},[434,579,580],{"class":440},"\u002F\u002F将8080转发到80\n",[434,582,583,585,587,590],{"class":436,"line":396},[434,584,530],{"class":440},[434,586,533],{"class":444},[434,588,589],{"class":444}," --add-forward-port=port=80:proto=tcp:toport=8080",[434,591,592],{"class":444}," --permanent\n",[24,594,595],{"id":595},"创建黑名单",[426,597,599],{"className":428,"code":598,"language":430,"meta":387,"style":387},"\u002F\u002F创建blacklist ipset\nfirewall-cmd --permanent --zone=public --new-ipset=blacklist --type=hash:ip\n\u002F\u002F封禁 blacklist\nfirewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist drop'\n\u002F\u002F查看 blacklist\nfirewall-cmd --ipset=blacklist --get-entries\n\u002F\u002F添加IP到黑名单\nfirewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=212.237.51.36\nfirewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=188.226.191.66\nfirewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=80.211.137.182\nfirewall-cmd --permanent --zone=public --ipset=blacklist --add-entry=60.191.66.226\n",[132,600,601,609,623,631,653,661,672,678,692,706,720],{"__ignoreMap":387},[434,602,603,606],{"class":436,"line":437},[434,604,605],{"class":440},"\u002F\u002F创建blacklist",[434,607,608],{"class":444}," ipset\n",[434,610,611,613,615,617,620],{"class":436,"line":388},[434,612,530],{"class":440},[434,614,539],{"class":444},[434,616,533],{"class":444},[434,618,619],{"class":444}," --new-ipset=blacklist",[434,621,622],{"class":444}," --type=hash:ip\n",[434,624,625,628],{"class":436,"line":396},[434,626,627],{"class":440},"\u002F\u002F封禁",[434,629,630],{"class":444}," blacklist\n",[434,632,634,636,638,640,643,647,650],{"class":436,"line":633},4,[434,635,530],{"class":440},[434,637,539],{"class":444},[434,639,533],{"class":444},[434,641,642],{"class":444}," --add-rich-rule=",[434,644,646],{"class":645},"sMK4o","'",[434,648,649],{"class":444},"rule source ipset=blacklist drop",[434,651,652],{"class":645},"'\n",[434,654,656,659],{"class":436,"line":655},5,[434,657,658],{"class":440},"\u002F\u002F查看",[434,660,630],{"class":444},[434,662,664,666,669],{"class":436,"line":663},6,[434,665,530],{"class":440},[434,667,668],{"class":444}," --ipset=blacklist",[434,670,671],{"class":444}," --get-entries\n",[434,673,675],{"class":436,"line":674},7,[434,676,677],{"class":440},"\u002F\u002F添加IP到黑名单\n",[434,679,681,683,685,687,689],{"class":436,"line":680},8,[434,682,530],{"class":440},[434,684,539],{"class":444},[434,686,533],{"class":444},[434,688,668],{"class":444},[434,690,691],{"class":444}," --add-entry=212.237.51.36\n",[434,693,695,697,699,701,703],{"class":436,"line":694},9,[434,696,530],{"class":440},[434,698,539],{"class":444},[434,700,533],{"class":444},[434,702,668],{"class":444},[434,704,705],{"class":444}," --add-entry=188.226.191.66\n",[434,707,709,711,713,715,717],{"class":436,"line":708},10,[434,710,530],{"class":440},[434,712,539],{"class":444},[434,714,533],{"class":444},[434,716,668],{"class":444},[434,718,719],{"class":444}," --add-entry=80.211.137.182\n",[434,721,723,725,727,729,731],{"class":436,"line":722},11,[434,724,530],{"class":440},[434,726,539],{"class":444},[434,728,533],{"class":444},[434,730,668],{"class":444},[434,732,733],{"class":444}," --add-entry=60.191.66.226\n",[24,735,737],{"id":736},"禁止被-ping丢弃-icmp-包","禁止被 PING（丢弃 ICMP 包）",[426,739,741],{"className":428,"code":740,"language":430,"meta":387,"style":387},"firewall-cmd --permanent --zone=public --add-rich-rule='rule protocol value=icmp drop'  \n",[132,742,743],{"__ignoreMap":387},[434,744,745,747,749,751,753,755,758],{"class":436,"line":437},[434,746,530],{"class":440},[434,748,539],{"class":444},[434,750,533],{"class":444},[434,752,642],{"class":444},[434,754,646],{"class":645},[434,756,757],{"class":444},"rule protocol value=icmp drop",[434,759,652],{"class":645},[24,761,762],{"id":762},"查看所有规则",[426,764,766],{"className":428,"code":765,"language":430,"meta":387,"style":387},"firewall-cmd --zone=public --list-all\n",[132,767,768],{"__ignoreMap":387},[434,769,770,772,774],{"class":436,"line":437},[434,771,530],{"class":440},[434,773,533],{"class":444},[434,775,776],{"class":444}," --list-all\n",[24,778,779],{"id":779},"重载防火墙配置",[426,781,783],{"className":428,"code":782,"language":430,"meta":387,"style":387},"firewall-cmd --reload\n",[132,784,785],{"__ignoreMap":387},[434,786,787,789],{"class":436,"line":437},[434,788,530],{"class":440},[434,790,791],{"class":444}," --reload\n",[793,794,795],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":387,"searchDepth":388,"depth":388,"links":797},[798,799,800,801,802,803,804,805,806,807,808],{"id":424,"depth":388,"text":424},{"id":451,"depth":388,"text":451},{"id":468,"depth":388,"text":468},{"id":485,"depth":388,"text":485},{"id":502,"depth":388,"text":502},{"id":519,"depth":388,"text":520},{"id":556,"depth":388,"text":556},{"id":595,"depth":388,"text":595},{"id":736,"depth":388,"text":737},{"id":762,"depth":388,"text":762},{"id":779,"depth":388,"text":779},"2025-01-24","firewalld 的日常操作速查：开关服务、放行端口、端口转发、ipset 黑名单、丢弃 ICMP、重载配置。",{},"\u002Fposts\u002Fcentos7-firewalld-common-commands",{"title":419,"description":810},"posts\u002Fcentos7-firewalld-common-commands",[816,817,818],"CentOS","运维","防火墙","UCJp32SdIZih_LOwZd24fMb5Be7CTSvhNDdHcTNgHRU",{"id":821,"title":822,"body":823,"date":1037,"description":1038,"extension":405,"meta":1039,"navigation":407,"path":1040,"seo":1041,"stem":1042,"tags":1043,"__hash__":1046},"posts\u002Fposts\u002Fmysql-batch-rename-table-column.md","MySQL 批量修改表名列名大小写",{"type":8,"value":824,"toc":1033},[825,832,836,904,908,1023,1030],[11,826,827,828,831],{},"接手老库时经常会碰到表名列名大小写混乱的情况。手写 rename 语句太累，不如查 ",[132,829,830],{},"information_schema"," 让数据库自己生成一批 SQL，复制出来跑就行。",[24,833,835],{"id":834},"批量表名大写改小写","批量表名：大写改小写",[426,837,841],{"className":838,"code":839,"language":840,"meta":387,"style":387},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SELECT\n concat(\n     'rename table  '\n     , TABLE_NAME\n     , ' to '\n     , LOWER(TABLE_NAME)\n     ,' ;'\n ) AS 'SQL'\nFROM\n information_schema.TABLES t \nWHERE\n TABLE_SCHEMA = 'xxxxxx';\n","sql",[132,842,843,848,853,858,863,868,873,878,883,888,893,898],{"__ignoreMap":387},[434,844,845],{"class":436,"line":437},[434,846,847],{},"SELECT\n",[434,849,850],{"class":436,"line":388},[434,851,852],{}," concat(\n",[434,854,855],{"class":436,"line":396},[434,856,857],{},"     'rename table  '\n",[434,859,860],{"class":436,"line":633},[434,861,862],{},"     , TABLE_NAME\n",[434,864,865],{"class":436,"line":655},[434,866,867],{},"     , ' to '\n",[434,869,870],{"class":436,"line":663},[434,871,872],{},"     , LOWER(TABLE_NAME)\n",[434,874,875],{"class":436,"line":674},[434,876,877],{},"     ,' ;'\n",[434,879,880],{"class":436,"line":680},[434,881,882],{}," ) AS 'SQL'\n",[434,884,885],{"class":436,"line":694},[434,886,887],{},"FROM\n",[434,889,890],{"class":436,"line":708},[434,891,892],{}," information_schema.TABLES t \n",[434,894,895],{"class":436,"line":722},[434,896,897],{},"WHERE\n",[434,899,901],{"class":436,"line":900},12,[434,902,903],{}," TABLE_SCHEMA = 'xxxxxx';\n",[24,905,907],{"id":906},"批量列名大写改小写","批量列名：大写改小写",[426,909,911],{"className":838,"code":910,"language":840,"meta":387,"style":387},"SELECT\nconcat(\n    'alter table '\n    , TABLE_NAME\n    , ' change column '\n    , COLUMN_NAME\n    , ' '\n    , LOWER(COLUMN_NAME)\n    , ' '\n    , COLUMN_TYPE\n    , ' comment \\''\n    , TRIM(REPLACE(REPLACE(REPLACE(REPLACE(COLUMN_COMMENT,',',':'),'\"',''),CHAR(10),''),CHAR(13),''))\n     , '\\''\n     , ' '\n     , IF(COLUMN_DEFAULT IS NULL, '', concat(' default \\'',TRIM(COLUMN_DEFAULT),'\\'')) \n     , ';' \n) AS 'SQL'\nFROM\n    information_schema.COLUMNS t\nWHERE\n    TABLE_SCHEMA = 'xxxxxx';\n",[132,912,913,917,922,927,932,937,942,947,952,956,961,966,971,977,983,989,995,1001,1006,1012,1017],{"__ignoreMap":387},[434,914,915],{"class":436,"line":437},[434,916,847],{},[434,918,919],{"class":436,"line":388},[434,920,921],{},"concat(\n",[434,923,924],{"class":436,"line":396},[434,925,926],{},"    'alter table '\n",[434,928,929],{"class":436,"line":633},[434,930,931],{},"    , TABLE_NAME\n",[434,933,934],{"class":436,"line":655},[434,935,936],{},"    , ' change column '\n",[434,938,939],{"class":436,"line":663},[434,940,941],{},"    , COLUMN_NAME\n",[434,943,944],{"class":436,"line":674},[434,945,946],{},"    , ' '\n",[434,948,949],{"class":436,"line":680},[434,950,951],{},"    , LOWER(COLUMN_NAME)\n",[434,953,954],{"class":436,"line":694},[434,955,946],{},[434,957,958],{"class":436,"line":708},[434,959,960],{},"    , COLUMN_TYPE\n",[434,962,963],{"class":436,"line":722},[434,964,965],{},"    , ' comment \\''\n",[434,967,968],{"class":436,"line":900},[434,969,970],{},"    , TRIM(REPLACE(REPLACE(REPLACE(REPLACE(COLUMN_COMMENT,',',':'),'\"',''),CHAR(10),''),CHAR(13),''))\n",[434,972,974],{"class":436,"line":973},13,[434,975,976],{},"     , '\\''\n",[434,978,980],{"class":436,"line":979},14,[434,981,982],{},"     , ' '\n",[434,984,986],{"class":436,"line":985},15,[434,987,988],{},"     , IF(COLUMN_DEFAULT IS NULL, '', concat(' default \\'',TRIM(COLUMN_DEFAULT),'\\'')) \n",[434,990,992],{"class":436,"line":991},16,[434,993,994],{},"     , ';' \n",[434,996,998],{"class":436,"line":997},17,[434,999,1000],{},") AS 'SQL'\n",[434,1002,1004],{"class":436,"line":1003},18,[434,1005,887],{},[434,1007,1009],{"class":436,"line":1008},19,[434,1010,1011],{},"    information_schema.COLUMNS t\n",[434,1013,1015],{"class":436,"line":1014},20,[434,1016,897],{},[434,1018,1020],{"class":436,"line":1019},21,[434,1021,1022],{},"    TABLE_SCHEMA = 'xxxxxx';\n",[11,1024,1025,1026,1029],{},"把 ",[132,1027,1028],{},"xxxxxx"," 换成你的库名，执行一遍拿到生成的 SQL，再贴到客户端里跑。",[793,1031,1032],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":387,"searchDepth":388,"depth":388,"links":1034},[1035,1036],{"id":834,"depth":388,"text":835},{"id":906,"depth":388,"text":907},"2021-10-24","用 information_schema 生成批量 rename table \u002F change column 语句，把大写的表名列名一次性改成小写。",{},"\u002Fposts\u002Fmysql-batch-rename-table-column",{"title":822,"description":1038},"posts\u002Fmysql-batch-rename-table-column",[1044,1045],"MySQL","数据库","kQ0Q8KVGIqox_MqjbX0RkuflyO9Psmo12rnvlY0jrzA",{"id":1048,"title":1049,"body":1050,"date":1095,"description":1096,"extension":405,"meta":1097,"navigation":407,"path":1098,"seo":1099,"stem":1100,"tags":1101,"__hash__":1103},"posts\u002Fposts\u002Fwin7-windows-update-error-80072ee2.md","新装 Win7 后 Windows Update 报 80072EE2 \u002F 80072EFE",{"type":8,"value":1051,"toc":1091},[1052,1055,1058,1064,1067,1070,1086],[24,1053,1054],{"id":1054},"故障场景",[11,1056,1057],{},"最近有台老电脑重装 Win7 系统，装完以后无法安装补丁，要么就报错 80072EE2，要么就报 80072EFE。",[11,1059,1060],{},[139,1061],{"alt":1062,"src":1063},"Windows Update 报错 80072EE2","\u002Fimages\u002Fwin7-windows-update\u002Ferror-80072ee2.png",[24,1065,1066],{"id":1066},"解决方法",[11,1068,1069],{},"安装补丁：",[73,1071,1072,1079],{},[38,1073,1074],{},[347,1075,1078],{"href":1076,"rel":1077},"https:\u002F\u002Fwww.catalog.update.microsoft.com\u002FSearch.aspx?q=KB3020369",[351],"Windows6.1-KB3020369",[38,1080,1081],{},[347,1082,1085],{"href":1083,"rel":1084},"https:\u002F\u002Fwww.catalog.update.microsoft.com\u002FSearch.aspx?q=KB3125574",[351],"Windows6.1-KB3125574",[11,1087,1088],{},[41,1089,1090],{},"一定要注意顺序：先安装 KB3020369，后安装 KB3125574。",{"title":387,"searchDepth":388,"depth":388,"links":1092},[1093,1094],{"id":1054,"depth":388,"text":1054},{"id":1066,"depth":388,"text":1066},"2021-07-31","老电脑重装 Win7 后装不上补丁，报这两个错误码。按顺序打两个补丁就能救回来。",{},"\u002Fposts\u002Fwin7-windows-update-error-80072ee2",{"title":1049,"description":1096},"posts\u002Fwin7-windows-update-error-80072ee2",[1102,817],"Windows","O1JcuhOCG-hIb4YmRAwmWs2mXMhR0gsCrjgHbP5fjRE",{"id":1105,"title":1106,"body":1107,"date":1812,"description":1813,"extension":405,"meta":1814,"navigation":407,"path":1815,"seo":1816,"stem":1817,"tags":1818,"__hash__":1823},"posts\u002Fposts\u002Fnacos-snowflake-worker-id.md","用 Nacos 分配 Snowflake 的 Worker ID",{"type":8,"value":1108,"toc":1806},[1109,1112,1115,1118,1126,1129,1135,1142,1789,1792,1804],[24,1110,1111],{"id":1111},"背景",[11,1113,1114],{},"Snowflake 唯一 ID 算法大家都很熟悉，他是 Twitter 公司提出来的算法。但是对于 workerId 和 datacenterId 的维护往往需要各项目自行设计。\n基本都是基于 zookeeper or 数据库 or Redis 的。\n本例就是用 Nacos 分配 worker id。",[24,1116,1117],{"id":1117},"源码",[11,1119,1120,1121],{},"仓库地址：",[347,1122,1125],{"href":1123,"rel":1124},"https:\u002F\u002Fgitee.com\u002FJiaXiaohei\u002Fsnowflake-nacos",[351],"gitee.com\u002FJiaXiaohei\u002Fsnowflake-nacos",[24,1127,1128],{"id":1128},"原理",[11,1130,1131,1132],{},"核心类：",[132,1133,1134],{},"SnowflakeIdGenerator.class",[11,1136,1137,1138,1141],{},"基本原理：基于 Nacos 的监听服务 ",[132,1139,1140],{},"namingService.subscribe","，监听服务下的实例列表变化。\n注册一个服务到 Nacos，如果服务列表发生变化，获取服务所有实例的 Ip 地址和端口，用本机 Ip 地址和端口判断本机在实例列表的 index。",[426,1143,1147],{"className":1144,"code":1145,"language":1146,"meta":387,"style":387},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import com.alibaba.cloud.nacos.NacosDiscoveryProperties;\nimport com.alibaba.cloud.nacos.NacosServiceManager;\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.listener.AbstractEventListener;\nimport com.alibaba.nacos.api.naming.listener.Event;\nimport com.alibaba.nacos.api.naming.listener.NamingEvent;\nimport com.alibaba.nacos.api.naming.pojo.Instance;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.PostConstruct;\nimport java.text.DecimalFormat;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n\u002F**\n * SnowflakeId + Nacos\n *\u002F\n@Component\npublic class SnowflakeIdGenerator {\n\n    protected final Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    @Autowired\n    private NacosServiceManager nacosServiceManager;\n\n    @Autowired\n    private NacosDiscoveryProperties nacosDiscoveryProperties;\n\n    private static SnowflakeIdWorker snowflakeIdWorker;\n\n    private static int nodeId;\n\n    @PostConstruct\n    public void run() throws Exception {\n        init();\n    }\n\n    \u002F**\n     * 获取雪花Id\n     *\n     * @return\n     *\u002F\n    public static long nextId() {\n        return snowflakeIdWorker.nextId();\n    }\n\n    \u002F**\n     * 获取当前节点Id\n     *\n     * @return\n     *\u002F\n    public static int nodeId() {\n        return nodeId;\n    }\n\n    \u002F**\n     * 获取当前服务所有节点 + 增加服务监听\n     *\n     * @throws NacosException\n     *\u002F\n    private void init() throws NacosException {\n        NamingService namingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());\n        namingService.subscribe(nacosDiscoveryProperties.getService(), new AbstractEventListener() {\n            @Override\n            public void onEvent(Event event) {\n                if (-1 == nacosDiscoveryProperties.getPort()) {\n                    return;\n                }\n                nodeId = calcNodeId(((NamingEvent) event).getInstances());\n                if (nodeId > 1024) {\n                    throw new IllegalArgumentException(\"Worker & Datacenter Id calc results exceed 1024\");\n                }\n                long workerId = nodeId % 31;\n                long datacenterId = (long) Math.floor((float) nodeId \u002F 31);\n                logger.info(\"nodeId:\" + nodeId + \" workerId:\" + workerId + \" datacenterId:\" + datacenterId);\n                snowflakeIdWorker = new SnowflakeIdWorker(workerId, datacenterId);\n            }\n        });\n    }\n\n    \u002F**\n     * 用ip+port计算服务列表的索引\n     *\n     * @param instanceList\n     * @return\n     *\u002F\n    private int calcNodeId(List\u003CInstance> instanceList) {\n        List\u003CLong> ipPosrList = instanceList.stream()\n                .map(x -> dealIpPort(x.getIp(), x.getPort()))\n                .sorted(Comparator.naturalOrder())\n                .collect(Collectors.toList());\n        return ipPosrList.indexOf(dealIpPort(nacosDiscoveryProperties.getIp(), nacosDiscoveryProperties.getPort()));\n    }\n\n    \u002F**\n     * ip补0 + 端口号\n     *\n     * @param ip\n     * @param port\n     * @return\n     *\u002F\n    private static Long dealIpPort(String ip, int port) {\n        String[] ips = ip.split(\"\\\\.\");\n        StringBuilder sbr = new StringBuilder();\n        for (int i = 0; i \u003C ips.length; i++) {\n            sbr.append(new DecimalFormat(\"000\").format(Integer.parseInt(ips[i])));\n        }\n        return Long.parseLong(sbr.toString() + port);\n    }\n\n}\n","java",[132,1148,1149,1154,1159,1164,1169,1174,1179,1184,1189,1194,1199,1204,1209,1214,1219,1224,1229,1234,1239,1243,1248,1253,1259,1265,1271,1276,1282,1287,1293,1299,1304,1309,1315,1320,1326,1331,1337,1342,1348,1354,1360,1366,1371,1377,1383,1389,1395,1401,1407,1413,1418,1423,1428,1434,1439,1444,1449,1455,1461,1466,1471,1476,1482,1487,1493,1498,1504,1510,1516,1522,1528,1534,1540,1546,1552,1558,1564,1569,1575,1581,1587,1593,1599,1605,1610,1615,1620,1626,1631,1637,1642,1647,1653,1659,1665,1671,1677,1683,1688,1693,1698,1704,1709,1715,1721,1726,1731,1737,1743,1749,1755,1761,1767,1773,1778,1783],{"__ignoreMap":387},[434,1150,1151],{"class":436,"line":437},[434,1152,1153],{},"import com.alibaba.cloud.nacos.NacosDiscoveryProperties;\n",[434,1155,1156],{"class":436,"line":388},[434,1157,1158],{},"import com.alibaba.cloud.nacos.NacosServiceManager;\n",[434,1160,1161],{"class":436,"line":396},[434,1162,1163],{},"import com.alibaba.nacos.api.exception.NacosException;\n",[434,1165,1166],{"class":436,"line":633},[434,1167,1168],{},"import com.alibaba.nacos.api.naming.NamingService;\n",[434,1170,1171],{"class":436,"line":655},[434,1172,1173],{},"import com.alibaba.nacos.api.naming.listener.AbstractEventListener;\n",[434,1175,1176],{"class":436,"line":663},[434,1177,1178],{},"import com.alibaba.nacos.api.naming.listener.Event;\n",[434,1180,1181],{"class":436,"line":674},[434,1182,1183],{},"import com.alibaba.nacos.api.naming.listener.NamingEvent;\n",[434,1185,1186],{"class":436,"line":680},[434,1187,1188],{},"import com.alibaba.nacos.api.naming.pojo.Instance;\n",[434,1190,1191],{"class":436,"line":694},[434,1192,1193],{},"import org.slf4j.Logger;\n",[434,1195,1196],{"class":436,"line":708},[434,1197,1198],{},"import org.slf4j.LoggerFactory;\n",[434,1200,1201],{"class":436,"line":722},[434,1202,1203],{},"import org.springframework.beans.factory.annotation.Autowired;\n",[434,1205,1206],{"class":436,"line":900},[434,1207,1208],{},"import org.springframework.stereotype.Component;\n",[434,1210,1211],{"class":436,"line":973},[434,1212,1213],{"emptyLinePlaceholder":407},"\n",[434,1215,1216],{"class":436,"line":979},[434,1217,1218],{},"import javax.annotation.PostConstruct;\n",[434,1220,1221],{"class":436,"line":985},[434,1222,1223],{},"import java.text.DecimalFormat;\n",[434,1225,1226],{"class":436,"line":991},[434,1227,1228],{},"import java.util.Comparator;\n",[434,1230,1231],{"class":436,"line":997},[434,1232,1233],{},"import java.util.List;\n",[434,1235,1236],{"class":436,"line":1003},[434,1237,1238],{},"import java.util.stream.Collectors;\n",[434,1240,1241],{"class":436,"line":1008},[434,1242,1213],{"emptyLinePlaceholder":407},[434,1244,1245],{"class":436,"line":1014},[434,1246,1247],{},"\u002F**\n",[434,1249,1250],{"class":436,"line":1019},[434,1251,1252],{}," * SnowflakeId + Nacos\n",[434,1254,1256],{"class":436,"line":1255},22,[434,1257,1258],{}," *\u002F\n",[434,1260,1262],{"class":436,"line":1261},23,[434,1263,1264],{},"@Component\n",[434,1266,1268],{"class":436,"line":1267},24,[434,1269,1270],{},"public class SnowflakeIdGenerator {\n",[434,1272,1274],{"class":436,"line":1273},25,[434,1275,1213],{"emptyLinePlaceholder":407},[434,1277,1279],{"class":436,"line":1278},26,[434,1280,1281],{},"    protected final Logger logger = LoggerFactory.getLogger(this.getClass());\n",[434,1283,1285],{"class":436,"line":1284},27,[434,1286,1213],{"emptyLinePlaceholder":407},[434,1288,1290],{"class":436,"line":1289},28,[434,1291,1292],{},"    @Autowired\n",[434,1294,1296],{"class":436,"line":1295},29,[434,1297,1298],{},"    private NacosServiceManager nacosServiceManager;\n",[434,1300,1302],{"class":436,"line":1301},30,[434,1303,1213],{"emptyLinePlaceholder":407},[434,1305,1307],{"class":436,"line":1306},31,[434,1308,1292],{},[434,1310,1312],{"class":436,"line":1311},32,[434,1313,1314],{},"    private NacosDiscoveryProperties nacosDiscoveryProperties;\n",[434,1316,1318],{"class":436,"line":1317},33,[434,1319,1213],{"emptyLinePlaceholder":407},[434,1321,1323],{"class":436,"line":1322},34,[434,1324,1325],{},"    private static SnowflakeIdWorker snowflakeIdWorker;\n",[434,1327,1329],{"class":436,"line":1328},35,[434,1330,1213],{"emptyLinePlaceholder":407},[434,1332,1334],{"class":436,"line":1333},36,[434,1335,1336],{},"    private static int nodeId;\n",[434,1338,1340],{"class":436,"line":1339},37,[434,1341,1213],{"emptyLinePlaceholder":407},[434,1343,1345],{"class":436,"line":1344},38,[434,1346,1347],{},"    @PostConstruct\n",[434,1349,1351],{"class":436,"line":1350},39,[434,1352,1353],{},"    public void run() throws Exception {\n",[434,1355,1357],{"class":436,"line":1356},40,[434,1358,1359],{},"        init();\n",[434,1361,1363],{"class":436,"line":1362},41,[434,1364,1365],{},"    }\n",[434,1367,1369],{"class":436,"line":1368},42,[434,1370,1213],{"emptyLinePlaceholder":407},[434,1372,1374],{"class":436,"line":1373},43,[434,1375,1376],{},"    \u002F**\n",[434,1378,1380],{"class":436,"line":1379},44,[434,1381,1382],{},"     * 获取雪花Id\n",[434,1384,1386],{"class":436,"line":1385},45,[434,1387,1388],{},"     *\n",[434,1390,1392],{"class":436,"line":1391},46,[434,1393,1394],{},"     * @return\n",[434,1396,1398],{"class":436,"line":1397},47,[434,1399,1400],{},"     *\u002F\n",[434,1402,1404],{"class":436,"line":1403},48,[434,1405,1406],{},"    public static long nextId() {\n",[434,1408,1410],{"class":436,"line":1409},49,[434,1411,1412],{},"        return snowflakeIdWorker.nextId();\n",[434,1414,1416],{"class":436,"line":1415},50,[434,1417,1365],{},[434,1419,1421],{"class":436,"line":1420},51,[434,1422,1213],{"emptyLinePlaceholder":407},[434,1424,1426],{"class":436,"line":1425},52,[434,1427,1376],{},[434,1429,1431],{"class":436,"line":1430},53,[434,1432,1433],{},"     * 获取当前节点Id\n",[434,1435,1437],{"class":436,"line":1436},54,[434,1438,1388],{},[434,1440,1442],{"class":436,"line":1441},55,[434,1443,1394],{},[434,1445,1447],{"class":436,"line":1446},56,[434,1448,1400],{},[434,1450,1452],{"class":436,"line":1451},57,[434,1453,1454],{},"    public static int nodeId() {\n",[434,1456,1458],{"class":436,"line":1457},58,[434,1459,1460],{},"        return nodeId;\n",[434,1462,1464],{"class":436,"line":1463},59,[434,1465,1365],{},[434,1467,1469],{"class":436,"line":1468},60,[434,1470,1213],{"emptyLinePlaceholder":407},[434,1472,1474],{"class":436,"line":1473},61,[434,1475,1376],{},[434,1477,1479],{"class":436,"line":1478},62,[434,1480,1481],{},"     * 获取当前服务所有节点 + 增加服务监听\n",[434,1483,1485],{"class":436,"line":1484},63,[434,1486,1388],{},[434,1488,1490],{"class":436,"line":1489},64,[434,1491,1492],{},"     * @throws NacosException\n",[434,1494,1496],{"class":436,"line":1495},65,[434,1497,1400],{},[434,1499,1501],{"class":436,"line":1500},66,[434,1502,1503],{},"    private void init() throws NacosException {\n",[434,1505,1507],{"class":436,"line":1506},67,[434,1508,1509],{},"        NamingService namingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());\n",[434,1511,1513],{"class":436,"line":1512},68,[434,1514,1515],{},"        namingService.subscribe(nacosDiscoveryProperties.getService(), new AbstractEventListener() {\n",[434,1517,1519],{"class":436,"line":1518},69,[434,1520,1521],{},"            @Override\n",[434,1523,1525],{"class":436,"line":1524},70,[434,1526,1527],{},"            public void onEvent(Event event) {\n",[434,1529,1531],{"class":436,"line":1530},71,[434,1532,1533],{},"                if (-1 == nacosDiscoveryProperties.getPort()) {\n",[434,1535,1537],{"class":436,"line":1536},72,[434,1538,1539],{},"                    return;\n",[434,1541,1543],{"class":436,"line":1542},73,[434,1544,1545],{},"                }\n",[434,1547,1549],{"class":436,"line":1548},74,[434,1550,1551],{},"                nodeId = calcNodeId(((NamingEvent) event).getInstances());\n",[434,1553,1555],{"class":436,"line":1554},75,[434,1556,1557],{},"                if (nodeId > 1024) {\n",[434,1559,1561],{"class":436,"line":1560},76,[434,1562,1563],{},"                    throw new IllegalArgumentException(\"Worker & Datacenter Id calc results exceed 1024\");\n",[434,1565,1567],{"class":436,"line":1566},77,[434,1568,1545],{},[434,1570,1572],{"class":436,"line":1571},78,[434,1573,1574],{},"                long workerId = nodeId % 31;\n",[434,1576,1578],{"class":436,"line":1577},79,[434,1579,1580],{},"                long datacenterId = (long) Math.floor((float) nodeId \u002F 31);\n",[434,1582,1584],{"class":436,"line":1583},80,[434,1585,1586],{},"                logger.info(\"nodeId:\" + nodeId + \" workerId:\" + workerId + \" datacenterId:\" + datacenterId);\n",[434,1588,1590],{"class":436,"line":1589},81,[434,1591,1592],{},"                snowflakeIdWorker = new SnowflakeIdWorker(workerId, datacenterId);\n",[434,1594,1596],{"class":436,"line":1595},82,[434,1597,1598],{},"            }\n",[434,1600,1602],{"class":436,"line":1601},83,[434,1603,1604],{},"        });\n",[434,1606,1608],{"class":436,"line":1607},84,[434,1609,1365],{},[434,1611,1613],{"class":436,"line":1612},85,[434,1614,1213],{"emptyLinePlaceholder":407},[434,1616,1618],{"class":436,"line":1617},86,[434,1619,1376],{},[434,1621,1623],{"class":436,"line":1622},87,[434,1624,1625],{},"     * 用ip+port计算服务列表的索引\n",[434,1627,1629],{"class":436,"line":1628},88,[434,1630,1388],{},[434,1632,1634],{"class":436,"line":1633},89,[434,1635,1636],{},"     * @param instanceList\n",[434,1638,1640],{"class":436,"line":1639},90,[434,1641,1394],{},[434,1643,1645],{"class":436,"line":1644},91,[434,1646,1400],{},[434,1648,1650],{"class":436,"line":1649},92,[434,1651,1652],{},"    private int calcNodeId(List\u003CInstance> instanceList) {\n",[434,1654,1656],{"class":436,"line":1655},93,[434,1657,1658],{},"        List\u003CLong> ipPosrList = instanceList.stream()\n",[434,1660,1662],{"class":436,"line":1661},94,[434,1663,1664],{},"                .map(x -> dealIpPort(x.getIp(), x.getPort()))\n",[434,1666,1668],{"class":436,"line":1667},95,[434,1669,1670],{},"                .sorted(Comparator.naturalOrder())\n",[434,1672,1674],{"class":436,"line":1673},96,[434,1675,1676],{},"                .collect(Collectors.toList());\n",[434,1678,1680],{"class":436,"line":1679},97,[434,1681,1682],{},"        return ipPosrList.indexOf(dealIpPort(nacosDiscoveryProperties.getIp(), nacosDiscoveryProperties.getPort()));\n",[434,1684,1686],{"class":436,"line":1685},98,[434,1687,1365],{},[434,1689,1691],{"class":436,"line":1690},99,[434,1692,1213],{"emptyLinePlaceholder":407},[434,1694,1696],{"class":436,"line":1695},100,[434,1697,1376],{},[434,1699,1701],{"class":436,"line":1700},101,[434,1702,1703],{},"     * ip补0 + 端口号\n",[434,1705,1707],{"class":436,"line":1706},102,[434,1708,1388],{},[434,1710,1712],{"class":436,"line":1711},103,[434,1713,1714],{},"     * @param ip\n",[434,1716,1718],{"class":436,"line":1717},104,[434,1719,1720],{},"     * @param port\n",[434,1722,1724],{"class":436,"line":1723},105,[434,1725,1394],{},[434,1727,1729],{"class":436,"line":1728},106,[434,1730,1400],{},[434,1732,1734],{"class":436,"line":1733},107,[434,1735,1736],{},"    private static Long dealIpPort(String ip, int port) {\n",[434,1738,1740],{"class":436,"line":1739},108,[434,1741,1742],{},"        String[] ips = ip.split(\"\\\\.\");\n",[434,1744,1746],{"class":436,"line":1745},109,[434,1747,1748],{},"        StringBuilder sbr = new StringBuilder();\n",[434,1750,1752],{"class":436,"line":1751},110,[434,1753,1754],{},"        for (int i = 0; i \u003C ips.length; i++) {\n",[434,1756,1758],{"class":436,"line":1757},111,[434,1759,1760],{},"            sbr.append(new DecimalFormat(\"000\").format(Integer.parseInt(ips[i])));\n",[434,1762,1764],{"class":436,"line":1763},112,[434,1765,1766],{},"        }\n",[434,1768,1770],{"class":436,"line":1769},113,[434,1771,1772],{},"        return Long.parseLong(sbr.toString() + port);\n",[434,1774,1776],{"class":436,"line":1775},114,[434,1777,1365],{},[434,1779,1781],{"class":436,"line":1780},115,[434,1782,1213],{"emptyLinePlaceholder":407},[434,1784,1786],{"class":436,"line":1785},116,[434,1787,1788],{},"}\n",[24,1790,1791],{"id":1791},"参考",[11,1793,1794,1795,1798,1799],{},"雪花生成类 ",[132,1796,1797],{},"SnowflakeIdWorker.class"," 参考：\n",[347,1800,1803],{"href":1801,"rel":1802},"https:\u002F\u002Fblog.csdn.net\u002Flq18050010830\u002Farticle\u002Fdetails\u002F89845790",[351],"blog.csdn.net\u002Flq18050010830\u002Farticle\u002Fdetails\u002F89845790",[793,1805,1032],{},{"title":387,"searchDepth":388,"depth":388,"links":1807},[1808,1809,1810,1811],{"id":1111,"depth":388,"text":1111},{"id":1117,"depth":388,"text":1117},{"id":1128,"depth":388,"text":1128},{"id":1791,"depth":388,"text":1791},"2021-07-27","借 Nacos 的服务实例列表动态算出 workerId 和 datacenterId，不用自己维护 zookeeper 或数据库。",{},"\u002Fposts\u002Fnacos-snowflake-worker-id",{"title":1106,"description":1813},"posts\u002Fnacos-snowflake-worker-id",[1819,1820,1821,1822],"Nacos","Snowflake","分布式","Java","1n0hBraNNaP-3M4VTWnepV6xrtPntl_nyzhKqdkPPyc",{"id":1825,"title":1826,"body":1827,"date":1925,"description":3135,"extension":405,"meta":3136,"navigation":407,"path":3137,"seo":3138,"stem":3139,"tags":3140,"__hash__":3142},"posts\u002Fposts\u002Fgitlab-ce-upgrade-11-to-13.md","记一次 GitLab-CE 跨版本从 11 升级到 13 踩的坑",{"type":8,"value":1828,"toc":3129},[1829,1832,1840,1843,1847,1856,1862,1864,1868,1871,2037,2040,2132,2134,2138,2141,2488,2491,2617,2620,2909,2912,3108,3111,3126],[154,1830,1831],{"id":1831},"环境",[426,1833,1838],{"className":1834,"code":1836,"language":1837},[1835],"language-text","OS:CentOS 8\nHostname:HyperV-GitLab\n","text",[132,1839,1836],{"__ignoreMap":387},[1841,1842],"hr",{},[154,1844,1846],{"id":1845},"_1不可跨大版本升级","1.不可跨大版本升级",[11,1848,1849,1850,1855],{},"必须先升级到当前大版本的最新版 在升级到下一个大版本\n参考",[347,1851,1854],{"href":1852,"rel":1853},"https:\u002F\u002Fdocs.gitlab.com\u002Fee\u002Fpolicy\u002Fmaintenance.html#upgrade-recommendations",[351],"官方网站","对于版本升级的说明",[11,1857,1858],{},[139,1859],{"alt":1860,"src":1861},"GitLab 版本升级路径","\u002Fimages\u002Fgitlab-ce-upgrade\u002Fupgrade-path.png",[1841,1863],{},[154,1865,1867],{"id":1866},"_2pg_dump-aborting-because-of-server-version-mismatch","2.pg_dump: aborting because of server version mismatch",[11,1869,1870],{},"因为使用了外部数据源（PG），而且是 12 的高版本，GitLab 自带 pg_dump 版本只到 10 或者 11。在升级的备份部分，就备份失败，报错如下：",[426,1872,1874],{"className":428,"code":1873,"language":430,"meta":387,"style":387},"gitlab preinstall: Automatically backing up only the GitLab SQL database (excluding everything else!)\n2020-10-01 21:47:39 +0800 -- Dumping database ... \nDumping PostgreSQL database db_gitlab ... pg_dump: server version: 12.4; pg_dump version: 11.7\npg_dump: aborting because of server version mismatch\n[FAILED]\nrake aborted!\nBackup::Error: Backup failed\n",[132,1875,1876,1921,1946,1985,2007,2018,2026],{"__ignoreMap":387},[434,1877,1878,1881,1884,1887,1890,1893,1896,1899,1902,1905,1908,1912,1915,1918],{"class":436,"line":437},[434,1879,1880],{"class":440},"gitlab",[434,1882,1883],{"class":444}," preinstall:",[434,1885,1886],{"class":444}," Automatically",[434,1888,1889],{"class":444}," backing",[434,1891,1892],{"class":444}," up",[434,1894,1895],{"class":444}," only",[434,1897,1898],{"class":444}," the",[434,1900,1901],{"class":444}," GitLab",[434,1903,1904],{"class":444}," SQL",[434,1906,1907],{"class":444}," database",[434,1909,1911],{"class":1910},"sTEyZ"," (excluding ",[434,1913,1914],{"class":444},"everything",[434,1916,1917],{"class":444}," else!",[434,1919,1920],{"class":1910},")\n",[434,1922,1923,1926,1929,1932,1935,1938,1940,1943],{"class":436,"line":388},[434,1924,1925],{"class":440},"2020-10-01",[434,1927,1928],{"class":444}," 21:47:39",[434,1930,1931],{"class":444}," +0800",[434,1933,1934],{"class":444}," --",[434,1936,1937],{"class":444}," Dumping",[434,1939,1907],{"class":444},[434,1941,1942],{"class":444}," ...",[434,1944,1945],{"class":1910}," \n",[434,1947,1948,1951,1954,1956,1959,1961,1964,1967,1970,1974,1977,1980,1982],{"class":436,"line":396},[434,1949,1950],{"class":440},"Dumping",[434,1952,1953],{"class":444}," PostgreSQL",[434,1955,1907],{"class":444},[434,1957,1958],{"class":444}," db_gitlab",[434,1960,1942],{"class":444},[434,1962,1963],{"class":444}," pg_dump:",[434,1965,1966],{"class":444}," server",[434,1968,1969],{"class":444}," version:",[434,1971,1973],{"class":1972},"sbssI"," 12.4",[434,1975,1976],{"class":645},";",[434,1978,1979],{"class":440}," pg_dump",[434,1981,1969],{"class":444},[434,1983,1984],{"class":1972}," 11.7\n",[434,1986,1987,1990,1993,1996,1999,2001,2004],{"class":436,"line":633},[434,1988,1989],{"class":440},"pg_dump:",[434,1991,1992],{"class":444}," aborting",[434,1994,1995],{"class":444}," because",[434,1997,1998],{"class":444}," of",[434,2000,1966],{"class":444},[434,2002,2003],{"class":444}," version",[434,2005,2006],{"class":444}," mismatch\n",[434,2008,2009,2012,2015],{"class":436,"line":655},[434,2010,2011],{"class":645},"[",[434,2013,2014],{"class":1910},"FAILED",[434,2016,2017],{"class":645},"]\n",[434,2019,2020,2023],{"class":436,"line":663},[434,2021,2022],{"class":440},"rake",[434,2024,2025],{"class":444}," aborted!\n",[434,2027,2028,2031,2034],{"class":436,"line":674},[434,2029,2030],{"class":440},"Backup::Error:",[434,2032,2033],{"class":444}," Backup",[434,2035,2036],{"class":444}," failed\n",[11,2038,2039],{},"解决方法：",[426,2041,2043],{"className":428,"code":2042,"language":430,"meta":387,"style":387},"1.安装postgresql12的客户端\ndnf install -y https:\u002F\u002Fdownload.postgresql.org\u002Fpub\u002Frepos\u002Fyum\u002Freporpms\u002FEL-8-x86_64\u002Fpgdg-redhat-repo-latest.noarch.rpm\ndnf -qy module disable postgresql\ndnf install -y postgresql12\n\n2.重新建立pg_dump的软连接\ncd \u002Fopt\u002Fgitlab\u002Fembedded\u002Fbin\nmv pg_dump pg_dump.bak\nln -s \u002Fusr\u002Fbin\u002Fpg_dump \u002Fopt\u002Fgitlab\u002Fembedded\u002Fbin\u002Fpg_dump\n",[132,2044,2045,2050,2064,2079,2090,2094,2099,2108,2118],{"__ignoreMap":387},[434,2046,2047],{"class":436,"line":437},[434,2048,2049],{"class":440},"1.安装postgresql12的客户端\n",[434,2051,2052,2055,2058,2061],{"class":436,"line":388},[434,2053,2054],{"class":440},"dnf",[434,2056,2057],{"class":444}," install",[434,2059,2060],{"class":444}," -y",[434,2062,2063],{"class":444}," https:\u002F\u002Fdownload.postgresql.org\u002Fpub\u002Frepos\u002Fyum\u002Freporpms\u002FEL-8-x86_64\u002Fpgdg-redhat-repo-latest.noarch.rpm\n",[434,2065,2066,2068,2071,2074,2076],{"class":436,"line":396},[434,2067,2054],{"class":440},[434,2069,2070],{"class":444}," -qy",[434,2072,2073],{"class":444}," module",[434,2075,514],{"class":444},[434,2077,2078],{"class":444}," postgresql\n",[434,2080,2081,2083,2085,2087],{"class":436,"line":633},[434,2082,2054],{"class":440},[434,2084,2057],{"class":444},[434,2086,2060],{"class":444},[434,2088,2089],{"class":444}," postgresql12\n",[434,2091,2092],{"class":436,"line":655},[434,2093,1213],{"emptyLinePlaceholder":407},[434,2095,2096],{"class":436,"line":663},[434,2097,2098],{"class":440},"2.重新建立pg_dump的软连接\n",[434,2100,2101,2105],{"class":436,"line":674},[434,2102,2104],{"class":2103},"s2Zo4","cd",[434,2106,2107],{"class":444}," \u002Fopt\u002Fgitlab\u002Fembedded\u002Fbin\n",[434,2109,2110,2113,2115],{"class":436,"line":680},[434,2111,2112],{"class":440},"mv",[434,2114,1979],{"class":444},[434,2116,2117],{"class":444}," pg_dump.bak\n",[434,2119,2120,2123,2126,2129],{"class":436,"line":694},[434,2121,2122],{"class":440},"ln",[434,2124,2125],{"class":444}," -s",[434,2127,2128],{"class":444}," \u002Fusr\u002Fbin\u002Fpg_dump",[434,2130,2131],{"class":444}," \u002Fopt\u002Fgitlab\u002Fembedded\u002Fbin\u002Fpg_dump\n",[1841,2133],{},[154,2135,2137],{"id":2136},"_3error-preingitlab-ce-13111-ce0el8x86_64-scriptlet-failed-exit-status-1","3.error: %prein(gitlab-ce-13.1.11-ce.0.el8.x86_64) scriptlet failed, exit status 1",[11,2139,2140],{},"GitLab 一开始就用 Yum\u002Fdnf 安装，后面升级自然也一直用 Yum 命令升级；只到从 13.1.4 升级到 13.1.11 版本时，一直提示",[426,2142,2144],{"className":428,"code":2143,"language":430,"meta":387,"style":387},"[root@HyperV-GitLab opt]# yum update gitlab-ce-13.1.11\n上次元数据过期检查：6:53:15 前，执行于 2020年10月01日 星期四 15时40分48秒。\n依赖关系解决。\n==================================================================================================================================\n 软件包                       架构                      版本                                   仓库                          大小\n==================================================================================================================================\n升级:\n gitlab-ce                    x86_64                    13.1.11-ce.0.el8                       gitlab-ce                    716 M\n\n事务概要\n==================================================================================================================================\n升级  1 软件包\n\n总下载：716 M\n确定吗？[y\u002FN]： y\n下载软件包：\ngitlab-ce-13.1.11-ce.0.el8.x86_64.rpm                                                             3.7 MB\u002Fs | 716 MB     03:13    \n----------------------------------------------------------------------------------------------------------------------------------\n总计                                                                                              3.7 MB\u002Fs | 716 MB     03:13     \n运行事务检查\n事务检查成功。\n运行事务测试\n事务测试成功。\n运行事务\n  准备中  :                                                                                                                   1\u002F1 \n  运行脚本: gitlab-ce-13.1.11-ce.0.el8.x86_64                                                                                 1\u002F2 \n错误：%prein(gitlab-ce-13.1.11-ce.0.el8.x86_64) 脚本执行失败，退出状态码为 1\n\nError in PREIN scriptlet in rpm package gitlab-ce\n  验证    : gitlab-ce-13.1.11-ce.0.el8.x86_64                                                                                 1\u002F2 \n  验证    : gitlab-ce-13.1.4-ce.0.el8.x86_64                                                                                  2\u002F2 \n\n失败:\n  gitlab-ce-13.1.4-ce.0.el8.x86_64                                gitlab-ce-13.1.11-ce.0.el8.x86_64                               \n\n错误：事务失败\n[root@HyperV-GitLab opt]# \n",[132,2145,2146,2159,2176,2181,2186,2203,2207,2212,2232,2236,2241,2245,2256,2260,2267,2275,2280,2306,2311,2332,2337,2342,2347,2352,2357,2370,2383,2391,2395,2420,2434,2448,2452,2457,2468,2472,2477],{"__ignoreMap":387},[434,2147,2148,2150,2153,2156],{"class":436,"line":437},[434,2149,2011],{"class":645},[434,2151,2152],{"class":1910},"root@HyperV-GitLab opt",[434,2154,2155],{"class":645},"]",[434,2157,2158],{"class":1910},"# yum update gitlab-ce-13.1.11\n",[434,2160,2161,2164,2167,2170,2173],{"class":436,"line":388},[434,2162,2163],{"class":440},"上次元数据过期检查：6:53:15",[434,2165,2166],{"class":444}," 前，执行于",[434,2168,2169],{"class":444}," 2020年10月01日",[434,2171,2172],{"class":444}," 星期四",[434,2174,2175],{"class":444}," 15时40分48秒。\n",[434,2177,2178],{"class":436,"line":396},[434,2179,2180],{"class":440},"依赖关系解决。\n",[434,2182,2183],{"class":436,"line":633},[434,2184,2185],{"class":444},"==================================================================================================================================\n",[434,2187,2188,2191,2194,2197,2200],{"class":436,"line":655},[434,2189,2190],{"class":440}," 软件包",[434,2192,2193],{"class":444},"                       架构",[434,2195,2196],{"class":444},"                      版本",[434,2198,2199],{"class":444},"                                   仓库",[434,2201,2202],{"class":444},"                          大小\n",[434,2204,2205],{"class":436,"line":663},[434,2206,2185],{"class":444},[434,2208,2209],{"class":436,"line":674},[434,2210,2211],{"class":440},"升级:\n",[434,2213,2214,2217,2220,2223,2226,2229],{"class":436,"line":680},[434,2215,2216],{"class":440}," gitlab-ce",[434,2218,2219],{"class":444},"                    x86_64",[434,2221,2222],{"class":444},"                    13.1.11-ce.0.el8",[434,2224,2225],{"class":444},"                       gitlab-ce",[434,2227,2228],{"class":1972},"                    716",[434,2230,2231],{"class":444}," M\n",[434,2233,2234],{"class":436,"line":694},[434,2235,1213],{"emptyLinePlaceholder":407},[434,2237,2238],{"class":436,"line":708},[434,2239,2240],{"class":440},"事务概要\n",[434,2242,2243],{"class":436,"line":722},[434,2244,2185],{"class":444},[434,2246,2247,2250,2253],{"class":436,"line":900},[434,2248,2249],{"class":440},"升级",[434,2251,2252],{"class":1972},"  1",[434,2254,2255],{"class":444}," 软件包\n",[434,2257,2258],{"class":436,"line":973},[434,2259,1213],{"emptyLinePlaceholder":407},[434,2261,2262,2265],{"class":436,"line":979},[434,2263,2264],{"class":440},"总下载：716",[434,2266,2231],{"class":444},[434,2268,2269,2272],{"class":436,"line":985},[434,2270,2271],{"class":440},"确定吗？[y\u002FN]：",[434,2273,2274],{"class":444}," y\n",[434,2276,2277],{"class":436,"line":991},[434,2278,2279],{"class":440},"下载软件包：\n",[434,2281,2282,2285,2288,2291,2294,2297,2300,2303],{"class":436,"line":997},[434,2283,2284],{"class":440},"gitlab-ce-13.1.11-ce.0.el8.x86_64.rpm",[434,2286,2287],{"class":1972},"                                                             3.7",[434,2289,2290],{"class":444}," MB\u002Fs",[434,2292,2293],{"class":645}," |",[434,2295,2296],{"class":440}," 716",[434,2298,2299],{"class":444}," MB",[434,2301,2302],{"class":444},"     03:13",[434,2304,2305],{"class":1910},"    \n",[434,2307,2308],{"class":436,"line":1003},[434,2309,2310],{"class":440},"----------------------------------------------------------------------------------------------------------------------------------\n",[434,2312,2313,2316,2319,2321,2323,2325,2327,2329],{"class":436,"line":1008},[434,2314,2315],{"class":440},"总计",[434,2317,2318],{"class":1972},"                                                                                              3.7",[434,2320,2290],{"class":444},[434,2322,2293],{"class":645},[434,2324,2296],{"class":440},[434,2326,2299],{"class":444},[434,2328,2302],{"class":444},[434,2330,2331],{"class":1910},"     \n",[434,2333,2334],{"class":436,"line":1014},[434,2335,2336],{"class":440},"运行事务检查\n",[434,2338,2339],{"class":436,"line":1019},[434,2340,2341],{"class":440},"事务检查成功。\n",[434,2343,2344],{"class":436,"line":1255},[434,2345,2346],{"class":440},"运行事务测试\n",[434,2348,2349],{"class":436,"line":1261},[434,2350,2351],{"class":440},"事务测试成功。\n",[434,2353,2354],{"class":436,"line":1267},[434,2355,2356],{"class":440},"运行事务\n",[434,2358,2359,2362,2365,2368],{"class":436,"line":1273},[434,2360,2361],{"class":440},"  准备中",[434,2363,2364],{"class":444},"  :",[434,2366,2367],{"class":444},"                                                                                                                   1\u002F1",[434,2369,1945],{"class":1910},[434,2371,2372,2375,2378,2381],{"class":436,"line":1278},[434,2373,2374],{"class":440},"  运行脚本:",[434,2376,2377],{"class":444}," gitlab-ce-13.1.11-ce.0.el8.x86_64",[434,2379,2380],{"class":444},"                                                                                 1\u002F2",[434,2382,1945],{"class":1910},[434,2384,2385,2388],{"class":436,"line":1284},[434,2386,2387],{"class":440},"错误：%prein(gitlab-ce-13.1.11-ce.0.el8.x86_64",[434,2389,2390],{"class":1910},") 脚本执行失败，退出状态码为 1\n",[434,2392,2393],{"class":436,"line":1289},[434,2394,1213],{"emptyLinePlaceholder":407},[434,2396,2397,2400,2403,2406,2409,2411,2414,2417],{"class":436,"line":1295},[434,2398,2399],{"class":440},"Error",[434,2401,2402],{"class":444}," in",[434,2404,2405],{"class":444}," PREIN",[434,2407,2408],{"class":444}," scriptlet",[434,2410,2402],{"class":444},[434,2412,2413],{"class":444}," rpm",[434,2415,2416],{"class":444}," package",[434,2418,2419],{"class":444}," gitlab-ce\n",[434,2421,2422,2425,2428,2430,2432],{"class":436,"line":1301},[434,2423,2424],{"class":440},"  验证",[434,2426,2427],{"class":444},"    :",[434,2429,2377],{"class":444},[434,2431,2380],{"class":444},[434,2433,1945],{"class":1910},[434,2435,2436,2438,2440,2443,2446],{"class":436,"line":1306},[434,2437,2424],{"class":440},[434,2439,2427],{"class":444},[434,2441,2442],{"class":444}," gitlab-ce-13.1.4-ce.0.el8.x86_64",[434,2444,2445],{"class":444},"                                                                                  2\u002F2",[434,2447,1945],{"class":1910},[434,2449,2450],{"class":436,"line":1311},[434,2451,1213],{"emptyLinePlaceholder":407},[434,2453,2454],{"class":436,"line":1317},[434,2455,2456],{"class":440},"失败:\n",[434,2458,2459,2462,2465],{"class":436,"line":1322},[434,2460,2461],{"class":440},"  gitlab-ce-13.1.4-ce.0.el8.x86_64",[434,2463,2464],{"class":444},"                                gitlab-ce-13.1.11-ce.0.el8.x86_64",[434,2466,2467],{"class":1910},"                               \n",[434,2469,2470],{"class":436,"line":1328},[434,2471,1213],{"emptyLinePlaceholder":407},[434,2473,2474],{"class":436,"line":1333},[434,2475,2476],{"class":440},"错误：事务失败\n",[434,2478,2479,2481,2483,2485],{"class":436,"line":1339},[434,2480,2011],{"class":645},[434,2482,2152],{"class":1910},[434,2484,2155],{"class":645},[434,2486,2487],{"class":1910},"#\n",[11,2489,2490],{},"手动下载 rpm 包安装，也有相同的报错信息：",[426,2492,2494],{"className":428,"code":2493,"language":430,"meta":387,"style":387},"[root@HyperV-GitLab opt]# rpm -Uvh gitlab-ce-13.1.11-ce.0.el8.x86_64.rpm \n警告：gitlab-ce-13.1.11-ce.0.el8.x86_64.rpm: 头V4 RSA\u002FSHA256 Signature, 密钥 ID f27eab47: NOKEY\nVerifying...                          ################################# [100%]\n准备中...                          ################################# [100%]\n错误：%prein(gitlab-ce-13.1.11-ce.0.el8.x86_64) 脚本执行失败，退出状态码为 1\n错误：gitlab-ce-13.1.11-ce.0.el8.x86_64: 安裝 已失败\n错误：gitlab-ce-13.1.4-ce.0.el8.x86_64: 删除 已跳过\n\nOR\nerror: prein(gitlab-ce-13.1.11-ce.0.el8.x86_64)scriptlet failed, exit status 1\n",[132,2495,2496,2507,2533,2542,2549,2555,2566,2577,2581,2586],{"__ignoreMap":387},[434,2497,2498,2500,2502,2504],{"class":436,"line":437},[434,2499,2011],{"class":645},[434,2501,2152],{"class":1910},[434,2503,2155],{"class":645},[434,2505,2506],{"class":1910},"# rpm -Uvh gitlab-ce-13.1.11-ce.0.el8.x86_64.rpm \n",[434,2508,2509,2512,2515,2518,2521,2524,2527,2530],{"class":436,"line":388},[434,2510,2511],{"class":440},"警告：gitlab-ce-13.1.11-ce.0.el8.x86_64.rpm:",[434,2513,2514],{"class":444}," 头V4",[434,2516,2517],{"class":444}," RSA\u002FSHA256",[434,2519,2520],{"class":444}," Signature,",[434,2522,2523],{"class":444}," 密钥",[434,2525,2526],{"class":444}," ID",[434,2528,2529],{"class":444}," f27eab47:",[434,2531,2532],{"class":444}," NOKEY\n",[434,2534,2535,2538],{"class":436,"line":396},[434,2536,2537],{"class":440},"Verifying...",[434,2539,2541],{"class":2540},"sHwdD","                          ################################# [100%]\n",[434,2543,2544,2547],{"class":436,"line":633},[434,2545,2546],{"class":440},"准备中...",[434,2548,2541],{"class":2540},[434,2550,2551,2553],{"class":436,"line":655},[434,2552,2387],{"class":440},[434,2554,2390],{"class":1910},[434,2556,2557,2560,2563],{"class":436,"line":663},[434,2558,2559],{"class":440},"错误：gitlab-ce-13.1.11-ce.0.el8.x86_64:",[434,2561,2562],{"class":444}," 安裝",[434,2564,2565],{"class":444}," 已失败\n",[434,2567,2568,2571,2574],{"class":436,"line":674},[434,2569,2570],{"class":440},"错误：gitlab-ce-13.1.4-ce.0.el8.x86_64:",[434,2572,2573],{"class":444}," 删除",[434,2575,2576],{"class":444}," 已跳过\n",[434,2578,2579],{"class":436,"line":680},[434,2580,1213],{"emptyLinePlaceholder":407},[434,2582,2583],{"class":436,"line":694},[434,2584,2585],{"class":440},"OR\n",[434,2587,2588,2591,2594,2597,2600,2603,2606,2609,2612,2614],{"class":436,"line":708},[434,2589,2590],{"class":440},"error:",[434,2592,2593],{"class":444}," prein",[434,2595,2596],{"class":645},"(",[434,2598,2599],{"class":440},"gitlab-ce-13.1.11-ce.0.el8.x86_64",[434,2601,2602],{"class":645},")",[434,2604,2605],{"class":444},"scriptlet",[434,2607,2608],{"class":444}," failed,",[434,2610,2611],{"class":444}," exit",[434,2613,480],{"class":444},[434,2615,2616],{"class":1972}," 1\n",[11,2618,2619],{},"用 rpm -Uvvh 查看安装详情，发现错误如下：",[426,2621,2623],{"className":428,"code":2622,"language":430,"meta":387,"style":387},"+ upgrade_check\n++ gitlab-ctl upgrade-check 13.1.4 13.13.1\n\u002Fbin\u002Fbash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)\n+ ctl_results='[2020-10-01T21:17:45+08:00] WARN: Please install an English UTF-8 locale for Chef to use, falling back to C locale and disabling UTF-8 support.\nI don'\\''t know that command.\nomnibus-ctl: command (subcommand)\ncheck-config\n\n.........\n\nContainer Registry Commands:\n  registry-garbage-collect\n    Run Container Registry garbage collection.'\n+ found='[2020-10-01T21:17:45+08:00] WARN: Please install an English UTF-8 locale for Chef to use, falling back to C locale and disabling UTF-8 support.'\n+ '[' '[2020-10-01T21:17:45+08:00] WARN: Please install an English UTF-8 locale for Chef to use, falling back to C locale and disabling UTF-8 support.' '!=' 'I don'\\''t know that command.' ']'\n+ exit 1\nD: %prein(gitlab-ce-13.1.11-ce.0.el8.x86_64): waitpid(35960) rc 35960 status 100\nerror: %prein(gitlab-ce-13.1.11-ce.0.el8.x86_64) scriptlet failed, exit status 1\nufdio:       6 reads,  8219028 total bytes in 0.001505 secs\nerror: gitlab-ce-13.1.11-ce.0.el8.x86_64: install failed\n",[132,2624,2625,2633,2650,2676,2688,2703,2708,2713,2717,2722,2726,2731,2736,2743,2757,2802,2810,2848,2870,2898],{"__ignoreMap":387},[434,2626,2627,2630],{"class":436,"line":437},[434,2628,2629],{"class":440},"+",[434,2631,2632],{"class":444}," upgrade_check\n",[434,2634,2635,2638,2641,2644,2647],{"class":436,"line":388},[434,2636,2637],{"class":440},"++",[434,2639,2640],{"class":444}," gitlab-ctl",[434,2642,2643],{"class":444}," upgrade-check",[434,2645,2646],{"class":1972}," 13.1.4",[434,2648,2649],{"class":1972}," 13.13.1\n",[434,2651,2652,2655,2658,2661,2664,2667,2670,2673],{"class":436,"line":396},[434,2653,2654],{"class":440},"\u002Fbin\u002Fbash:",[434,2656,2657],{"class":444}," warning:",[434,2659,2660],{"class":444}," setlocale:",[434,2662,2663],{"class":444}," LC_ALL:",[434,2665,2666],{"class":444}," cannot",[434,2668,2669],{"class":444}," change",[434,2671,2672],{"class":444}," locale",[434,2674,2675],{"class":1910}," (en_US.UTF-8)\n",[434,2677,2678,2680,2683,2685],{"class":436,"line":633},[434,2679,2629],{"class":440},[434,2681,2682],{"class":444}," ctl_results=",[434,2684,646],{"class":645},[434,2686,2687],{"class":444},"[2020-10-01T21:17:45+08:00] WARN: Please install an English UTF-8 locale for Chef to use, falling back to C locale and disabling UTF-8 support.\n",[434,2689,2690,2693,2695,2698,2700],{"class":436,"line":655},[434,2691,2692],{"class":444},"I don",[434,2694,646],{"class":645},[434,2696,2697],{"class":1910},"\\'",[434,2699,646],{"class":645},[434,2701,2702],{"class":444},"t know that command.\n",[434,2704,2705],{"class":436,"line":663},[434,2706,2707],{"class":444},"omnibus-ctl: command (subcommand)\n",[434,2709,2710],{"class":436,"line":674},[434,2711,2712],{"class":444},"check-config\n",[434,2714,2715],{"class":436,"line":680},[434,2716,1213],{"emptyLinePlaceholder":407},[434,2718,2719],{"class":436,"line":694},[434,2720,2721],{"class":444},".........\n",[434,2723,2724],{"class":436,"line":708},[434,2725,1213],{"emptyLinePlaceholder":407},[434,2727,2728],{"class":436,"line":722},[434,2729,2730],{"class":444},"Container Registry Commands:\n",[434,2732,2733],{"class":436,"line":900},[434,2734,2735],{"class":444},"  registry-garbage-collect\n",[434,2737,2738,2741],{"class":436,"line":973},[434,2739,2740],{"class":444},"    Run Container Registry garbage collection.",[434,2742,652],{"class":645},[434,2744,2745,2747,2750,2752,2755],{"class":436,"line":979},[434,2746,2629],{"class":440},[434,2748,2749],{"class":444}," found=",[434,2751,646],{"class":645},[434,2753,2754],{"class":444},"[2020-10-01T21:17:45+08:00] WARN: Please install an English UTF-8 locale for Chef to use, falling back to C locale and disabling UTF-8 support.",[434,2756,652],{"class":645},[434,2758,2759,2761,2764,2766,2768,2770,2772,2774,2776,2779,2781,2783,2785,2787,2789,2791,2794,2796,2798,2800],{"class":436,"line":985},[434,2760,2629],{"class":440},[434,2762,2763],{"class":645}," '",[434,2765,2011],{"class":444},[434,2767,646],{"class":645},[434,2769,2763],{"class":645},[434,2771,2754],{"class":444},[434,2773,646],{"class":645},[434,2775,2763],{"class":645},[434,2777,2778],{"class":444},"!=",[434,2780,646],{"class":645},[434,2782,2763],{"class":645},[434,2784,2692],{"class":444},[434,2786,646],{"class":645},[434,2788,2697],{"class":1910},[434,2790,646],{"class":645},[434,2792,2793],{"class":444},"t know that command.",[434,2795,646],{"class":645},[434,2797,2763],{"class":645},[434,2799,2155],{"class":444},[434,2801,652],{"class":645},[434,2803,2804,2806,2808],{"class":436,"line":991},[434,2805,2629],{"class":440},[434,2807,2611],{"class":444},[434,2809,2616],{"class":1972},[434,2811,2812,2815,2818,2820,2822,2824,2827,2830,2832,2835,2837,2840,2843,2845],{"class":436,"line":997},[434,2813,2814],{"class":440},"D:",[434,2816,2817],{"class":444}," %prein",[434,2819,2596],{"class":645},[434,2821,2599],{"class":440},[434,2823,2602],{"class":645},[434,2825,2826],{"class":444},":",[434,2828,2829],{"class":444}," waitpid",[434,2831,2596],{"class":645},[434,2833,2834],{"class":440},"35960",[434,2836,2602],{"class":645},[434,2838,2839],{"class":444}," rc",[434,2841,2842],{"class":1972}," 35960",[434,2844,480],{"class":444},[434,2846,2847],{"class":1972}," 100\n",[434,2849,2850,2852,2854,2856,2858,2860,2862,2864,2866,2868],{"class":436,"line":1003},[434,2851,2590],{"class":440},[434,2853,2817],{"class":444},[434,2855,2596],{"class":645},[434,2857,2599],{"class":440},[434,2859,2602],{"class":645},[434,2861,2408],{"class":444},[434,2863,2608],{"class":444},[434,2865,2611],{"class":444},[434,2867,480],{"class":444},[434,2869,2616],{"class":1972},[434,2871,2872,2875,2878,2881,2884,2887,2890,2892,2895],{"class":436,"line":1008},[434,2873,2874],{"class":440},"ufdio:",[434,2876,2877],{"class":1972},"       6",[434,2879,2880],{"class":444}," reads,",[434,2882,2883],{"class":1972},"  8219028",[434,2885,2886],{"class":444}," total",[434,2888,2889],{"class":444}," bytes",[434,2891,2402],{"class":444},[434,2893,2894],{"class":1972}," 0.001505",[434,2896,2897],{"class":444}," secs\n",[434,2899,2900,2902,2905,2907],{"class":436,"line":1014},[434,2901,2590],{"class":440},[434,2903,2904],{"class":444}," gitlab-ce-13.1.11-ce.0.el8.x86_64:",[434,2906,2057],{"class":444},[434,2908,2036],{"class":444},[11,2910,2911],{},"可能是因为我安装系统的时候选择了中文，系统里竟然没有英文语言包？！\nlocale -a 如下：",[426,2913,2915],{"className":428,"code":2914,"language":430,"meta":387,"style":387},"[root@HyperV-GitLab ~]# vi \u002Fetc\u002Fenvironment\n[root@HyperV-GitLab ~]# locale -a\nlocale: Cannot set LC_CTYPE to default locale: No such file or directory\nlocale: Cannot set LC_MESSAGES to default locale: No such file or directory\nlocale: Cannot set LC_COLLATE to default locale: No such file or directory\nC\nC.utf8\nPOSIX\nzh_CN\nzh_CN.gb18030\nzh_CN.gbk\nzh_CN.utf8\nzh_HK\nzh_HK.utf8\nzh_SG\nzh_SG.gbk\nzh_SG.utf8\nzh_TW\nzh_TW.euctw\nzh_TW.utf8\n",[132,2916,2917,2930,2941,2979,3006,3033,3038,3043,3048,3053,3058,3063,3068,3073,3078,3083,3088,3093,3098,3103],{"__ignoreMap":387},[434,2918,2919,2921,2924,2927],{"class":436,"line":437},[434,2920,2011],{"class":645},[434,2922,2923],{"class":1910},"root@HyperV-GitLab ",[434,2925,2926],{"class":645},"~]",[434,2928,2929],{"class":1910},"# vi \u002Fetc\u002Fenvironment\n",[434,2931,2932,2934,2936,2938],{"class":436,"line":388},[434,2933,2011],{"class":645},[434,2935,2923],{"class":1910},[434,2937,2926],{"class":645},[434,2939,2940],{"class":1910},"# locale -a\n",[434,2942,2943,2946,2949,2952,2955,2958,2961,2964,2967,2970,2973,2976],{"class":436,"line":396},[434,2944,2945],{"class":440},"locale:",[434,2947,2948],{"class":444}," Cannot",[434,2950,2951],{"class":444}," set",[434,2953,2954],{"class":444}," LC_CTYPE",[434,2956,2957],{"class":444}," to",[434,2959,2960],{"class":444}," default",[434,2962,2963],{"class":444}," locale:",[434,2965,2966],{"class":444}," No",[434,2968,2969],{"class":444}," such",[434,2971,2972],{"class":444}," file",[434,2974,2975],{"class":444}," or",[434,2977,2978],{"class":444}," directory\n",[434,2980,2981,2983,2985,2987,2990,2992,2994,2996,2998,3000,3002,3004],{"class":436,"line":633},[434,2982,2945],{"class":440},[434,2984,2948],{"class":444},[434,2986,2951],{"class":444},[434,2988,2989],{"class":444}," LC_MESSAGES",[434,2991,2957],{"class":444},[434,2993,2960],{"class":444},[434,2995,2963],{"class":444},[434,2997,2966],{"class":444},[434,2999,2969],{"class":444},[434,3001,2972],{"class":444},[434,3003,2975],{"class":444},[434,3005,2978],{"class":444},[434,3007,3008,3010,3012,3014,3017,3019,3021,3023,3025,3027,3029,3031],{"class":436,"line":655},[434,3009,2945],{"class":440},[434,3011,2948],{"class":444},[434,3013,2951],{"class":444},[434,3015,3016],{"class":444}," LC_COLLATE",[434,3018,2957],{"class":444},[434,3020,2960],{"class":444},[434,3022,2963],{"class":444},[434,3024,2966],{"class":444},[434,3026,2969],{"class":444},[434,3028,2972],{"class":444},[434,3030,2975],{"class":444},[434,3032,2978],{"class":444},[434,3034,3035],{"class":436,"line":663},[434,3036,3037],{"class":440},"C\n",[434,3039,3040],{"class":436,"line":674},[434,3041,3042],{"class":440},"C.utf8\n",[434,3044,3045],{"class":436,"line":680},[434,3046,3047],{"class":440},"POSIX\n",[434,3049,3050],{"class":436,"line":694},[434,3051,3052],{"class":440},"zh_CN\n",[434,3054,3055],{"class":436,"line":708},[434,3056,3057],{"class":440},"zh_CN.gb18030\n",[434,3059,3060],{"class":436,"line":722},[434,3061,3062],{"class":440},"zh_CN.gbk\n",[434,3064,3065],{"class":436,"line":900},[434,3066,3067],{"class":440},"zh_CN.utf8\n",[434,3069,3070],{"class":436,"line":973},[434,3071,3072],{"class":440},"zh_HK\n",[434,3074,3075],{"class":436,"line":979},[434,3076,3077],{"class":440},"zh_HK.utf8\n",[434,3079,3080],{"class":436,"line":985},[434,3081,3082],{"class":440},"zh_SG\n",[434,3084,3085],{"class":436,"line":991},[434,3086,3087],{"class":440},"zh_SG.gbk\n",[434,3089,3090],{"class":436,"line":997},[434,3091,3092],{"class":440},"zh_SG.utf8\n",[434,3094,3095],{"class":436,"line":1003},[434,3096,3097],{"class":440},"zh_TW\n",[434,3099,3100],{"class":436,"line":1008},[434,3101,3102],{"class":440},"zh_TW.euctw\n",[434,3104,3105],{"class":436,"line":1014},[434,3106,3107],{"class":440},"zh_TW.utf8\n",[11,3109,3110],{},"解决方法：\n安装英文语言包",[426,3112,3114],{"className":428,"code":3113,"language":430,"meta":387,"style":387},"yum install langpacks-en.noarch\n",[132,3115,3116],{"__ignoreMap":387},[434,3117,3118,3121,3123],{"class":436,"line":437},[434,3119,3120],{"class":440},"yum",[434,3122,2057],{"class":444},[434,3124,3125],{"class":444}," langpacks-en.noarch\n",[793,3127,3128],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":387,"searchDepth":388,"depth":388,"links":3130},[3131,3132,3133,3134],{"id":1831,"depth":396,"text":1831},{"id":1845,"depth":396,"text":1846},{"id":1866,"depth":396,"text":1867},{"id":2136,"depth":396,"text":2137},"从 11 升到 13 的路上踩了三个坑：不能跨大版本、pg_dump 版本不匹配，以及系统没装英文语言包导致 rpm 安装脚本失败。",{},"\u002Fposts\u002Fgitlab-ce-upgrade-11-to-13",{"title":1826,"description":3135},"posts\u002Fgitlab-ce-upgrade-11-to-13",[3141,817,816],"GitLab","nnFc8mJVonUKcYjTZFb618eeRy0IZQpUDEcefyCsPhU",{"id":3144,"title":3145,"body":3146,"date":4022,"description":4023,"extension":405,"meta":4024,"navigation":407,"path":4025,"seo":4026,"stem":4027,"tags":4028,"__hash__":4030},"posts\u002Fposts\u002Fjar2pom-maven-dependency.md","基于 Maven 中心库，通过 Jar 包生成 POM 的 dependency",{"type":8,"value":3147,"toc":4017},[3148,3150,3164,3167,3986,3989,4015],[24,3149,1111],{"id":1111},[11,3151,3152,3153,3158,3159,104],{},"之前写过一篇",[347,3154,3157],{"href":3155,"rel":3156},"https:\u002F\u002Fblog.csdn.net\u002FJustinJia91\u002Farticle\u002Fdetails\u002F79605682",[351],"通过 Jar 包生成 Maven POM.xml 的 dependency","，方便将非 Maven 项目转换为 Maven 项目。\n原项目对 Jar 的搜索基于 Nexus2 的相关接口开发，随着很多仓库从 Nexus2 升级到 Nexus3 或者其他服务，原项目渐渐不可用了。\n新代码将 Nexus2 接口改为对接 ",[347,3160,3163],{"href":3161,"rel":3162},"https:\u002F\u002Fsearch.maven.org\u002F",[351],"Maven 中心库",[24,3165,3166],{"id":3166},"核心代码",[426,3168,3170],{"className":1144,"code":3169,"language":1146,"meta":387,"style":387},"    public static void main(String[] args) {\n        \u002F\u002F先通过Jar的SHA1查询 如果不存在则解析Manifest查询\n        File libs = new File(\"D:\\\\lib\");\n        for (File jar : libs.listFiles()) {\n\n            System.out.println(\"\u003C!--  \" + jar.getName() + \" -->\");\n\n            Docs doc = getPomByChecksum(jar);\n            if (null != doc) {\n                System.out.println(\"\u003C!--  Search by Checksum -->\");\n                System.out.println(assemblePomElement(doc).asXML());\n                continue;\n            }\n\n            doc = getPomByManifest(jar);\n            if (null != doc) {\n                System.out.println(\"\u003C!--  Search by Manifest -->\");\n                System.out.println(assemblePomElement(doc).asXML());\n                continue;\n            }\n\n            System.out.println(\"\u003C!--  No data was found -->\");\n\n            System.out.println();\n        }\n\n    }\n\n    \u002F**\n     * 通过Jar SHA1返回Pom dependency\n     *\n     * @param file\n     * @return\n     *\u002F\n    public static Docs getPomByChecksum(File file) {\n        Docs docs = null;\n\n        String checkSum = getCheckSum(file, \"SHA1\");\n        String jsonString = doGet(nexusUrl + \"&q=1:\" + checkSum);\n        SolrSearch solrSearch = JSONObject.parseObject(jsonString, SolrSearch.class);\n\n        if (solrSearch.getResponseHeader().getStatus() == 0 && solrSearch.getResponse().getDocs().size() > 0) {\n            docs = solrSearch.getResponse().getDocs().get(0);\n        }\n        return docs;\n    }\n\n\n    \u002F**\n     * 通过Jar Manifest返回Pom dependency\n     *\n     * @param file\n     * @return\n     *\u002F\n    public static Docs getPomByManifest(File file) {\n        Docs docs = null;\n\n        try {\n            JarFile jarfile = new JarFile(file);\n            Manifest mainmanifest = jarfile.getManifest();\n            jarfile.close();\n            if (null == mainmanifest) {\n                return null;\n            }\n            String a = null, v = null;\n            if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Extension-Name\"))) {\n                a = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Extension-Name\"));\n            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Implementation-Title\"))) {\n                a = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Implementation-Title\"));\n            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Specification-Title\"))) {\n                a = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Specification-Title\"));\n            }\n            if (a != null && a.length() != 0) {\n                a = a.replace(\"\\\"\", \"\").replace(\" \", \"-\");\n            }\n            if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Bundle-Version\"))) {\n                v = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Bundle-Version\"));\n            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Implementation-Version\"))) {\n                v = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Implementation-Version\"));\n            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Specification-Version\"))) {\n                v = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Specification-Version\"));\n            }\n            if (v != null && v.length() != 0) {\n                v = v.replace(\"\\\"\", \"\").replace(\" \", \"-\");\n            }\n            String jsonString = doGet(nexusUrl + \"&q=a:\" + a + \"%20v:\" + v);\n            SolrSearch solrSearch = JSONObject.parseObject(jsonString, SolrSearch.class);\n\n            if (solrSearch.getResponseHeader().getStatus() == 0) {\n                docs = solrSearch.getResponse().getDocs().get(0);\n            }\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        return docs;\n    }\n\n    \u002F**\n     * 组装 dependency\n     *\n     * @param docs\n     * @return\n     *\u002F\n    public static Element assemblePomElement(Docs docs) {\n        Element dependency = new DOMElement(\"dependency\");\n        if (docs != null) {\n            dependency.addAttribute(\"groupId\", docs.getG());\n            dependency.addAttribute(\"artifactId\", docs.getA());\n            dependency.addAttribute(\"version\", docs.getV());\n        }\n        return dependency;\n    }\n\n    \u002F**\n     * 发起Get请求\n     *\n     * @param url\n     * @return\n     *\u002F\n    public static String doGet(String url) {\n        String srtResult = null;\n        CloseableHttpClient httpCilent = HttpClients.createDefault();\n        HttpGet httpGet = new HttpGet(url);\n        try {\n            HttpResponse httpResponse = httpCilent.execute(httpGet);\n            srtResult = EntityUtils.toString(httpResponse.getEntity());\n        } catch (IOException e) {\n            e.printStackTrace();\n        } finally {\n            try {\n                httpCilent.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n        return srtResult;\n    }\n\n    \u002F**\n     * 计算CheckSum\n     *\n     * @param file\n     * @param algorithm SHA1 or MD5\n     * @return\n     *\u002F\n    public static String getCheckSum(File file, String algorithm) {\n        if (!file.isFile()) {\n            return null;\n        }\n        MessageDigest digest = null;\n        FileInputStream in = null;\n        byte buffer[] = new byte[1024];\n        int len;\n        try {\n            digest = MessageDigest.getInstance(algorithm);\n            in = new FileInputStream(file);\n            while ((len = in.read(buffer, 0, 1024)) != -1) {\n                digest.update(buffer, 0, len);\n            }\n            in.close();\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n        BigInteger bigInt = new BigInteger(1, digest.digest());\n        return bigInt.toString(16);\n    }\n",[132,3171,3172,3177,3182,3187,3192,3196,3201,3205,3210,3215,3220,3225,3230,3234,3238,3243,3247,3252,3256,3260,3264,3268,3273,3277,3282,3286,3290,3294,3298,3302,3307,3311,3316,3320,3324,3329,3334,3338,3343,3348,3353,3357,3362,3367,3371,3376,3380,3384,3388,3392,3397,3401,3405,3409,3413,3418,3422,3426,3431,3436,3441,3446,3451,3456,3460,3465,3470,3475,3480,3485,3490,3495,3499,3504,3509,3513,3518,3523,3528,3533,3538,3543,3547,3552,3557,3561,3566,3571,3575,3580,3585,3589,3594,3599,3603,3607,3611,3615,3619,3624,3628,3633,3637,3641,3646,3651,3656,3661,3666,3671,3675,3680,3684,3688,3692,3697,3701,3707,3712,3717,3723,3729,3735,3741,3746,3752,3758,3763,3768,3774,3780,3786,3792,3798,3803,3808,3814,3819,3824,3829,3835,3840,3845,3851,3856,3861,3867,3873,3879,3884,3890,3896,3902,3908,3913,3919,3925,3931,3937,3942,3948,3954,3959,3964,3969,3975,3981],{"__ignoreMap":387},[434,3173,3174],{"class":436,"line":437},[434,3175,3176],{},"    public static void main(String[] args) {\n",[434,3178,3179],{"class":436,"line":388},[434,3180,3181],{},"        \u002F\u002F先通过Jar的SHA1查询 如果不存在则解析Manifest查询\n",[434,3183,3184],{"class":436,"line":396},[434,3185,3186],{},"        File libs = new File(\"D:\\\\lib\");\n",[434,3188,3189],{"class":436,"line":633},[434,3190,3191],{},"        for (File jar : libs.listFiles()) {\n",[434,3193,3194],{"class":436,"line":655},[434,3195,1213],{"emptyLinePlaceholder":407},[434,3197,3198],{"class":436,"line":663},[434,3199,3200],{},"            System.out.println(\"\u003C!--  \" + jar.getName() + \" -->\");\n",[434,3202,3203],{"class":436,"line":674},[434,3204,1213],{"emptyLinePlaceholder":407},[434,3206,3207],{"class":436,"line":680},[434,3208,3209],{},"            Docs doc = getPomByChecksum(jar);\n",[434,3211,3212],{"class":436,"line":694},[434,3213,3214],{},"            if (null != doc) {\n",[434,3216,3217],{"class":436,"line":708},[434,3218,3219],{},"                System.out.println(\"\u003C!--  Search by Checksum -->\");\n",[434,3221,3222],{"class":436,"line":722},[434,3223,3224],{},"                System.out.println(assemblePomElement(doc).asXML());\n",[434,3226,3227],{"class":436,"line":900},[434,3228,3229],{},"                continue;\n",[434,3231,3232],{"class":436,"line":973},[434,3233,1598],{},[434,3235,3236],{"class":436,"line":979},[434,3237,1213],{"emptyLinePlaceholder":407},[434,3239,3240],{"class":436,"line":985},[434,3241,3242],{},"            doc = getPomByManifest(jar);\n",[434,3244,3245],{"class":436,"line":991},[434,3246,3214],{},[434,3248,3249],{"class":436,"line":997},[434,3250,3251],{},"                System.out.println(\"\u003C!--  Search by Manifest -->\");\n",[434,3253,3254],{"class":436,"line":1003},[434,3255,3224],{},[434,3257,3258],{"class":436,"line":1008},[434,3259,3229],{},[434,3261,3262],{"class":436,"line":1014},[434,3263,1598],{},[434,3265,3266],{"class":436,"line":1019},[434,3267,1213],{"emptyLinePlaceholder":407},[434,3269,3270],{"class":436,"line":1255},[434,3271,3272],{},"            System.out.println(\"\u003C!--  No data was found -->\");\n",[434,3274,3275],{"class":436,"line":1261},[434,3276,1213],{"emptyLinePlaceholder":407},[434,3278,3279],{"class":436,"line":1267},[434,3280,3281],{},"            System.out.println();\n",[434,3283,3284],{"class":436,"line":1273},[434,3285,1766],{},[434,3287,3288],{"class":436,"line":1278},[434,3289,1213],{"emptyLinePlaceholder":407},[434,3291,3292],{"class":436,"line":1284},[434,3293,1365],{},[434,3295,3296],{"class":436,"line":1289},[434,3297,1213],{"emptyLinePlaceholder":407},[434,3299,3300],{"class":436,"line":1295},[434,3301,1376],{},[434,3303,3304],{"class":436,"line":1301},[434,3305,3306],{},"     * 通过Jar SHA1返回Pom dependency\n",[434,3308,3309],{"class":436,"line":1306},[434,3310,1388],{},[434,3312,3313],{"class":436,"line":1311},[434,3314,3315],{},"     * @param file\n",[434,3317,3318],{"class":436,"line":1317},[434,3319,1394],{},[434,3321,3322],{"class":436,"line":1322},[434,3323,1400],{},[434,3325,3326],{"class":436,"line":1328},[434,3327,3328],{},"    public static Docs getPomByChecksum(File file) {\n",[434,3330,3331],{"class":436,"line":1333},[434,3332,3333],{},"        Docs docs = null;\n",[434,3335,3336],{"class":436,"line":1339},[434,3337,1213],{"emptyLinePlaceholder":407},[434,3339,3340],{"class":436,"line":1344},[434,3341,3342],{},"        String checkSum = getCheckSum(file, \"SHA1\");\n",[434,3344,3345],{"class":436,"line":1350},[434,3346,3347],{},"        String jsonString = doGet(nexusUrl + \"&q=1:\" + checkSum);\n",[434,3349,3350],{"class":436,"line":1356},[434,3351,3352],{},"        SolrSearch solrSearch = JSONObject.parseObject(jsonString, SolrSearch.class);\n",[434,3354,3355],{"class":436,"line":1362},[434,3356,1213],{"emptyLinePlaceholder":407},[434,3358,3359],{"class":436,"line":1368},[434,3360,3361],{},"        if (solrSearch.getResponseHeader().getStatus() == 0 && solrSearch.getResponse().getDocs().size() > 0) {\n",[434,3363,3364],{"class":436,"line":1373},[434,3365,3366],{},"            docs = solrSearch.getResponse().getDocs().get(0);\n",[434,3368,3369],{"class":436,"line":1379},[434,3370,1766],{},[434,3372,3373],{"class":436,"line":1385},[434,3374,3375],{},"        return docs;\n",[434,3377,3378],{"class":436,"line":1391},[434,3379,1365],{},[434,3381,3382],{"class":436,"line":1397},[434,3383,1213],{"emptyLinePlaceholder":407},[434,3385,3386],{"class":436,"line":1403},[434,3387,1213],{"emptyLinePlaceholder":407},[434,3389,3390],{"class":436,"line":1409},[434,3391,1376],{},[434,3393,3394],{"class":436,"line":1415},[434,3395,3396],{},"     * 通过Jar Manifest返回Pom dependency\n",[434,3398,3399],{"class":436,"line":1420},[434,3400,1388],{},[434,3402,3403],{"class":436,"line":1425},[434,3404,3315],{},[434,3406,3407],{"class":436,"line":1430},[434,3408,1394],{},[434,3410,3411],{"class":436,"line":1436},[434,3412,1400],{},[434,3414,3415],{"class":436,"line":1441},[434,3416,3417],{},"    public static Docs getPomByManifest(File file) {\n",[434,3419,3420],{"class":436,"line":1446},[434,3421,3333],{},[434,3423,3424],{"class":436,"line":1451},[434,3425,1213],{"emptyLinePlaceholder":407},[434,3427,3428],{"class":436,"line":1457},[434,3429,3430],{},"        try {\n",[434,3432,3433],{"class":436,"line":1463},[434,3434,3435],{},"            JarFile jarfile = new JarFile(file);\n",[434,3437,3438],{"class":436,"line":1468},[434,3439,3440],{},"            Manifest mainmanifest = jarfile.getManifest();\n",[434,3442,3443],{"class":436,"line":1473},[434,3444,3445],{},"            jarfile.close();\n",[434,3447,3448],{"class":436,"line":1478},[434,3449,3450],{},"            if (null == mainmanifest) {\n",[434,3452,3453],{"class":436,"line":1484},[434,3454,3455],{},"                return null;\n",[434,3457,3458],{"class":436,"line":1489},[434,3459,1598],{},[434,3461,3462],{"class":436,"line":1495},[434,3463,3464],{},"            String a = null, v = null;\n",[434,3466,3467],{"class":436,"line":1500},[434,3468,3469],{},"            if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Extension-Name\"))) {\n",[434,3471,3472],{"class":436,"line":1506},[434,3473,3474],{},"                a = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Extension-Name\"));\n",[434,3476,3477],{"class":436,"line":1512},[434,3478,3479],{},"            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Implementation-Title\"))) {\n",[434,3481,3482],{"class":436,"line":1518},[434,3483,3484],{},"                a = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Implementation-Title\"));\n",[434,3486,3487],{"class":436,"line":1524},[434,3488,3489],{},"            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Specification-Title\"))) {\n",[434,3491,3492],{"class":436,"line":1530},[434,3493,3494],{},"                a = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Specification-Title\"));\n",[434,3496,3497],{"class":436,"line":1536},[434,3498,1598],{},[434,3500,3501],{"class":436,"line":1542},[434,3502,3503],{},"            if (a != null && a.length() != 0) {\n",[434,3505,3506],{"class":436,"line":1548},[434,3507,3508],{},"                a = a.replace(\"\\\"\", \"\").replace(\" \", \"-\");\n",[434,3510,3511],{"class":436,"line":1554},[434,3512,1598],{},[434,3514,3515],{"class":436,"line":1560},[434,3516,3517],{},"            if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Bundle-Version\"))) {\n",[434,3519,3520],{"class":436,"line":1566},[434,3521,3522],{},"                v = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Bundle-Version\"));\n",[434,3524,3525],{"class":436,"line":1571},[434,3526,3527],{},"            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Implementation-Version\"))) {\n",[434,3529,3530],{"class":436,"line":1577},[434,3531,3532],{},"                v = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Implementation-Version\"));\n",[434,3534,3535],{"class":436,"line":1583},[434,3536,3537],{},"            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Specification-Version\"))) {\n",[434,3539,3540],{"class":436,"line":1589},[434,3541,3542],{},"                v = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Specification-Version\"));\n",[434,3544,3545],{"class":436,"line":1595},[434,3546,1598],{},[434,3548,3549],{"class":436,"line":1601},[434,3550,3551],{},"            if (v != null && v.length() != 0) {\n",[434,3553,3554],{"class":436,"line":1607},[434,3555,3556],{},"                v = v.replace(\"\\\"\", \"\").replace(\" \", \"-\");\n",[434,3558,3559],{"class":436,"line":1612},[434,3560,1598],{},[434,3562,3563],{"class":436,"line":1617},[434,3564,3565],{},"            String jsonString = doGet(nexusUrl + \"&q=a:\" + a + \"%20v:\" + v);\n",[434,3567,3568],{"class":436,"line":1622},[434,3569,3570],{},"            SolrSearch solrSearch = JSONObject.parseObject(jsonString, SolrSearch.class);\n",[434,3572,3573],{"class":436,"line":1628},[434,3574,1213],{"emptyLinePlaceholder":407},[434,3576,3577],{"class":436,"line":1633},[434,3578,3579],{},"            if (solrSearch.getResponseHeader().getStatus() == 0) {\n",[434,3581,3582],{"class":436,"line":1639},[434,3583,3584],{},"                docs = solrSearch.getResponse().getDocs().get(0);\n",[434,3586,3587],{"class":436,"line":1644},[434,3588,1598],{},[434,3590,3591],{"class":436,"line":1649},[434,3592,3593],{},"        } catch (IOException e) {\n",[434,3595,3596],{"class":436,"line":1655},[434,3597,3598],{},"            e.printStackTrace();\n",[434,3600,3601],{"class":436,"line":1661},[434,3602,1766],{},[434,3604,3605],{"class":436,"line":1667},[434,3606,3375],{},[434,3608,3609],{"class":436,"line":1673},[434,3610,1365],{},[434,3612,3613],{"class":436,"line":1679},[434,3614,1213],{"emptyLinePlaceholder":407},[434,3616,3617],{"class":436,"line":1685},[434,3618,1376],{},[434,3620,3621],{"class":436,"line":1690},[434,3622,3623],{},"     * 组装 dependency\n",[434,3625,3626],{"class":436,"line":1695},[434,3627,1388],{},[434,3629,3630],{"class":436,"line":1700},[434,3631,3632],{},"     * @param docs\n",[434,3634,3635],{"class":436,"line":1706},[434,3636,1394],{},[434,3638,3639],{"class":436,"line":1711},[434,3640,1400],{},[434,3642,3643],{"class":436,"line":1717},[434,3644,3645],{},"    public static Element assemblePomElement(Docs docs) {\n",[434,3647,3648],{"class":436,"line":1723},[434,3649,3650],{},"        Element dependency = new DOMElement(\"dependency\");\n",[434,3652,3653],{"class":436,"line":1728},[434,3654,3655],{},"        if (docs != null) {\n",[434,3657,3658],{"class":436,"line":1733},[434,3659,3660],{},"            dependency.addAttribute(\"groupId\", docs.getG());\n",[434,3662,3663],{"class":436,"line":1739},[434,3664,3665],{},"            dependency.addAttribute(\"artifactId\", docs.getA());\n",[434,3667,3668],{"class":436,"line":1745},[434,3669,3670],{},"            dependency.addAttribute(\"version\", docs.getV());\n",[434,3672,3673],{"class":436,"line":1751},[434,3674,1766],{},[434,3676,3677],{"class":436,"line":1757},[434,3678,3679],{},"        return dependency;\n",[434,3681,3682],{"class":436,"line":1763},[434,3683,1365],{},[434,3685,3686],{"class":436,"line":1769},[434,3687,1213],{"emptyLinePlaceholder":407},[434,3689,3690],{"class":436,"line":1775},[434,3691,1376],{},[434,3693,3694],{"class":436,"line":1780},[434,3695,3696],{},"     * 发起Get请求\n",[434,3698,3699],{"class":436,"line":1785},[434,3700,1388],{},[434,3702,3704],{"class":436,"line":3703},117,[434,3705,3706],{},"     * @param url\n",[434,3708,3710],{"class":436,"line":3709},118,[434,3711,1394],{},[434,3713,3715],{"class":436,"line":3714},119,[434,3716,1400],{},[434,3718,3720],{"class":436,"line":3719},120,[434,3721,3722],{},"    public static String doGet(String url) {\n",[434,3724,3726],{"class":436,"line":3725},121,[434,3727,3728],{},"        String srtResult = null;\n",[434,3730,3732],{"class":436,"line":3731},122,[434,3733,3734],{},"        CloseableHttpClient httpCilent = HttpClients.createDefault();\n",[434,3736,3738],{"class":436,"line":3737},123,[434,3739,3740],{},"        HttpGet httpGet = new HttpGet(url);\n",[434,3742,3744],{"class":436,"line":3743},124,[434,3745,3430],{},[434,3747,3749],{"class":436,"line":3748},125,[434,3750,3751],{},"            HttpResponse httpResponse = httpCilent.execute(httpGet);\n",[434,3753,3755],{"class":436,"line":3754},126,[434,3756,3757],{},"            srtResult = EntityUtils.toString(httpResponse.getEntity());\n",[434,3759,3761],{"class":436,"line":3760},127,[434,3762,3593],{},[434,3764,3766],{"class":436,"line":3765},128,[434,3767,3598],{},[434,3769,3771],{"class":436,"line":3770},129,[434,3772,3773],{},"        } finally {\n",[434,3775,3777],{"class":436,"line":3776},130,[434,3778,3779],{},"            try {\n",[434,3781,3783],{"class":436,"line":3782},131,[434,3784,3785],{},"                httpCilent.close();\n",[434,3787,3789],{"class":436,"line":3788},132,[434,3790,3791],{},"            } catch (IOException e) {\n",[434,3793,3795],{"class":436,"line":3794},133,[434,3796,3797],{},"                e.printStackTrace();\n",[434,3799,3801],{"class":436,"line":3800},134,[434,3802,1598],{},[434,3804,3806],{"class":436,"line":3805},135,[434,3807,1766],{},[434,3809,3811],{"class":436,"line":3810},136,[434,3812,3813],{},"        return srtResult;\n",[434,3815,3817],{"class":436,"line":3816},137,[434,3818,1365],{},[434,3820,3822],{"class":436,"line":3821},138,[434,3823,1213],{"emptyLinePlaceholder":407},[434,3825,3827],{"class":436,"line":3826},139,[434,3828,1376],{},[434,3830,3832],{"class":436,"line":3831},140,[434,3833,3834],{},"     * 计算CheckSum\n",[434,3836,3838],{"class":436,"line":3837},141,[434,3839,1388],{},[434,3841,3843],{"class":436,"line":3842},142,[434,3844,3315],{},[434,3846,3848],{"class":436,"line":3847},143,[434,3849,3850],{},"     * @param algorithm SHA1 or MD5\n",[434,3852,3854],{"class":436,"line":3853},144,[434,3855,1394],{},[434,3857,3859],{"class":436,"line":3858},145,[434,3860,1400],{},[434,3862,3864],{"class":436,"line":3863},146,[434,3865,3866],{},"    public static String getCheckSum(File file, String algorithm) {\n",[434,3868,3870],{"class":436,"line":3869},147,[434,3871,3872],{},"        if (!file.isFile()) {\n",[434,3874,3876],{"class":436,"line":3875},148,[434,3877,3878],{},"            return null;\n",[434,3880,3882],{"class":436,"line":3881},149,[434,3883,1766],{},[434,3885,3887],{"class":436,"line":3886},150,[434,3888,3889],{},"        MessageDigest digest = null;\n",[434,3891,3893],{"class":436,"line":3892},151,[434,3894,3895],{},"        FileInputStream in = null;\n",[434,3897,3899],{"class":436,"line":3898},152,[434,3900,3901],{},"        byte buffer[] = new byte[1024];\n",[434,3903,3905],{"class":436,"line":3904},153,[434,3906,3907],{},"        int len;\n",[434,3909,3911],{"class":436,"line":3910},154,[434,3912,3430],{},[434,3914,3916],{"class":436,"line":3915},155,[434,3917,3918],{},"            digest = MessageDigest.getInstance(algorithm);\n",[434,3920,3922],{"class":436,"line":3921},156,[434,3923,3924],{},"            in = new FileInputStream(file);\n",[434,3926,3928],{"class":436,"line":3927},157,[434,3929,3930],{},"            while ((len = in.read(buffer, 0, 1024)) != -1) {\n",[434,3932,3934],{"class":436,"line":3933},158,[434,3935,3936],{},"                digest.update(buffer, 0, len);\n",[434,3938,3940],{"class":436,"line":3939},159,[434,3941,1598],{},[434,3943,3945],{"class":436,"line":3944},160,[434,3946,3947],{},"            in.close();\n",[434,3949,3951],{"class":436,"line":3950},161,[434,3952,3953],{},"        } catch (Exception e) {\n",[434,3955,3957],{"class":436,"line":3956},162,[434,3958,3598],{},[434,3960,3962],{"class":436,"line":3961},163,[434,3963,3878],{},[434,3965,3967],{"class":436,"line":3966},164,[434,3968,1766],{},[434,3970,3972],{"class":436,"line":3971},165,[434,3973,3974],{},"        BigInteger bigInt = new BigInteger(1, digest.digest());\n",[434,3976,3978],{"class":436,"line":3977},166,[434,3979,3980],{},"        return bigInt.toString(16);\n",[434,3982,3984],{"class":436,"line":3983},167,[434,3985,1365],{},[24,3987,3988],{"id":3988},"下载地址",[35,3990,3991,3999,4007],{},[38,3992,3993,3994],{},"Github：",[347,3995,3998],{"href":3996,"rel":3997},"https:\u002F\u002Fgithub.com\u002FJiaXiaohei\u002Fjar2pom\u002F",[351],"github.com\u002FJiaXiaohei\u002Fjar2pom",[38,4000,4001,4002],{},"Gitee：",[347,4003,4006],{"href":4004,"rel":4005},"https:\u002F\u002Fgitee.com\u002FJiaXiaohei\u002Fjar2pom\u002F",[351],"gitee.com\u002FJiaXiaohei\u002Fjar2pom",[38,4008,4009,4010],{},"CSDN：",[347,4011,4014],{"href":4012,"rel":4013},"https:\u002F\u002Fdownload.csdn.net\u002Fdownload\u002FJustinJia91\u002F12427956",[351],"download.csdn.net\u002Fdownload\u002FJustinJia91\u002F12427956",[793,4016,1032],{},{"title":387,"searchDepth":388,"depth":388,"links":4018},[4019,4020,4021],{"id":1111,"depth":388,"text":1111},{"id":3166,"depth":388,"text":3166},{"id":3988,"depth":388,"text":3988},"2020-05-16","把非 Maven 项目转成 Maven 时，得给一堆本地 jar 补 dependency。这个工具先用 jar 的 SHA1 去 Maven 中心库反查坐标，查不到再退回解析 Manifest。",{},"\u002Fposts\u002Fjar2pom-maven-dependency",{"title":3145,"description":4023},"posts\u002Fjar2pom-maven-dependency",[4029,1822,415],"Maven","gXybox6QJSHd5MuEbxyup-W9roTIX21F74-9IkcB6Rs",{"id":4032,"title":4033,"body":4034,"date":4442,"description":4443,"extension":405,"meta":4444,"navigation":407,"path":4445,"seo":4446,"stem":4447,"tags":4448,"__hash__":4450},"posts\u002Fposts\u002Fflutter-android-sdkmanager-not-found.md","解决 Flutter 的 Android sdkmanager tool not found",{"type":8,"value":4035,"toc":4436},[4036,4038,4044,4047,4050,4056,4380,4382,4393,4398,4404,4409,4415,4420,4423,4426,4433],[24,4037,1831],{"id":1831},[426,4039,4042],{"className":4040,"code":4041,"language":1837},[1835],"Win10\nFlutter 1.12.13+hotfix.8\nAndroid Studio 3.6.1\n",[132,4043,4041],{"__ignoreMap":387},[24,4045,4046],{"id":4046},"问题描述",[11,4048,4049],{},"最近因为显卡 Boom 了，索性重装了系统。\n装完 Flutter 以后 doctor 通不过，一直找不到 sdkmanager。",[11,4051,4052],{},[139,4053],{"alt":4054,"src":4055},"flutter doctor 输出","\u002Fimages\u002Fflutter-android-sdkmanager\u002F01-flutter-doctor.png",[426,4057,4059],{"className":428,"code":4058,"language":430,"meta":387,"style":387},"> flutter doctor\nDoctor summary (to see all details, run flutter doctor -v):\n[√] Flutter (Channel stable, v1.12.13+hotfix.8, on Microsoft Windows [Version 10.0.18363.720], locale\n    zh-CN)\n[!] Android toolchain - develop for Android devices (Android SDK version 29.0.3)\n    X Android license status unknown.\n      Try re-installing or updating your Android SDK Manager.\n      See https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002F#downloads or visit https:\u002F\u002Fflutter.dev\u002Fsetup\u002F#android-setup\n      for detailed instructions.\n[√] Android Studio (version 3.6)\n[√] Connected device (1 available)\n\n! Doctor found issues in 1 category.\n\n> flutter doctor --android-licenses\nAndroid sdkmanager tool not found (D:\\Android\\Sdk\\tools\\bin\\sdkmanager).\nTry re-installing or updating your Android SDK,\nvisit https:\u002F\u002Fflutter.dev\u002Fsetup\u002F#android-setup for detailed instructions.\n\n> \n",[132,4060,4061,4069,4104,4143,4150,4180,4196,4219,4235,4243,4262,4281,4285,4307,4311,4318,4336,4354,4371,4375],{"__ignoreMap":387},[434,4062,4063,4066],{"class":436,"line":437},[434,4064,4065],{"class":645},">",[434,4067,4068],{"class":1910}," flutter doctor\n",[434,4070,4071,4074,4077,4080,4083,4086,4089,4092,4095,4098,4101],{"class":436,"line":388},[434,4072,4073],{"class":440},"Doctor",[434,4075,4076],{"class":444}," summary",[434,4078,4079],{"class":1910}," (to ",[434,4081,4082],{"class":444},"see",[434,4084,4085],{"class":444}," all",[434,4087,4088],{"class":444}," details,",[434,4090,4091],{"class":444}," run",[434,4093,4094],{"class":444}," flutter",[434,4096,4097],{"class":444}," doctor",[434,4099,4100],{"class":444}," -v",[434,4102,4103],{"class":1910},"):\n",[434,4105,4106,4108,4111,4113,4116,4119,4122,4125,4128,4131,4134,4137,4140],{"class":436,"line":396},[434,4107,2011],{"class":645},[434,4109,4110],{"class":1910},"√",[434,4112,2155],{"class":645},[434,4114,4115],{"class":1910}," Flutter (",[434,4117,4118],{"class":440},"Channel",[434,4120,4121],{"class":444}," stable,",[434,4123,4124],{"class":444}," v1.12.13+hotfix.8,",[434,4126,4127],{"class":444}," on",[434,4129,4130],{"class":444}," Microsoft",[434,4132,4133],{"class":444}," Windows",[434,4135,4136],{"class":1910}," [Version ",[434,4138,4139],{"class":444},"10.0.18363.720],",[434,4141,4142],{"class":444}," locale\n",[434,4144,4145,4148],{"class":436,"line":633},[434,4146,4147],{"class":440},"    zh-CN",[434,4149,1920],{"class":1910},[434,4151,4152,4155,4158,4162,4165,4167,4170,4173,4175,4178],{"class":436,"line":655},[434,4153,4154],{"class":645},"[!]",[434,4156,4157],{"class":1910}," Android toolchain - develop ",[434,4159,4161],{"class":4160},"s7zQu","for",[434,4163,4164],{"class":1910}," Android devices ",[434,4166,2596],{"class":645},[434,4168,4169],{"class":440},"Android",[434,4171,4172],{"class":444}," SDK",[434,4174,2003],{"class":444},[434,4176,4177],{"class":1972}," 29.0.3",[434,4179,1920],{"class":645},[434,4181,4182,4185,4188,4191,4193],{"class":436,"line":663},[434,4183,4184],{"class":440},"    X",[434,4186,4187],{"class":444}," Android",[434,4189,4190],{"class":444}," license",[434,4192,480],{"class":444},[434,4194,4195],{"class":444}," unknown.\n",[434,4197,4198,4201,4204,4206,4209,4212,4214,4216],{"class":436,"line":674},[434,4199,4200],{"class":440},"      Try",[434,4202,4203],{"class":444}," re-installing",[434,4205,2975],{"class":444},[434,4207,4208],{"class":444}," updating",[434,4210,4211],{"class":444}," your",[434,4213,4187],{"class":444},[434,4215,4172],{"class":444},[434,4217,4218],{"class":444}," Manager.\n",[434,4220,4221,4224,4227,4229,4232],{"class":436,"line":680},[434,4222,4223],{"class":440},"      See",[434,4225,4226],{"class":444}," https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002F#downloads",[434,4228,2975],{"class":444},[434,4230,4231],{"class":444}," visit",[434,4233,4234],{"class":444}," https:\u002F\u002Fflutter.dev\u002Fsetup\u002F#android-setup\n",[434,4236,4237,4240],{"class":436,"line":694},[434,4238,4239],{"class":4160},"      for",[434,4241,4242],{"class":1910}," detailed instructions.\n",[434,4244,4245,4247,4249,4251,4254,4257,4260],{"class":436,"line":708},[434,4246,2011],{"class":645},[434,4248,4110],{"class":1910},[434,4250,2155],{"class":645},[434,4252,4253],{"class":1910}," Android Studio (",[434,4255,4256],{"class":440},"version",[434,4258,4259],{"class":1972}," 3.6",[434,4261,1920],{"class":1910},[434,4263,4264,4266,4268,4270,4273,4276,4279],{"class":436,"line":722},[434,4265,2011],{"class":645},[434,4267,4110],{"class":1910},[434,4269,2155],{"class":645},[434,4271,4272],{"class":1910}," Connected device (",[434,4274,4275],{"class":440},"1",[434,4277,4278],{"class":444}," available",[434,4280,1920],{"class":1910},[434,4282,4283],{"class":436,"line":900},[434,4284,1213],{"emptyLinePlaceholder":407},[434,4286,4287,4290,4293,4296,4299,4301,4304],{"class":436,"line":973},[434,4288,4289],{"class":645},"!",[434,4291,4292],{"class":440}," Doctor",[434,4294,4295],{"class":444}," found",[434,4297,4298],{"class":444}," issues",[434,4300,2402],{"class":444},[434,4302,4303],{"class":1972}," 1",[434,4305,4306],{"class":444}," category.\n",[434,4308,4309],{"class":436,"line":979},[434,4310,1213],{"emptyLinePlaceholder":407},[434,4312,4313,4315],{"class":436,"line":985},[434,4314,4065],{"class":645},[434,4316,4317],{"class":1910}," flutter doctor --android-licenses\n",[434,4319,4320,4322,4325,4328,4331,4333],{"class":436,"line":991},[434,4321,4169],{"class":440},[434,4323,4324],{"class":444}," sdkmanager",[434,4326,4327],{"class":444}," tool",[434,4329,4330],{"class":444}," not",[434,4332,4295],{"class":444},[434,4334,4335],{"class":1910}," (D:\\Android\\Sdk\\tools\\bin\\sdkmanager).\n",[434,4337,4338,4341,4343,4345,4347,4349,4351],{"class":436,"line":997},[434,4339,4340],{"class":440},"Try",[434,4342,4203],{"class":444},[434,4344,2975],{"class":444},[434,4346,4208],{"class":444},[434,4348,4211],{"class":444},[434,4350,4187],{"class":444},[434,4352,4353],{"class":444}," SDK,\n",[434,4355,4356,4359,4362,4365,4368],{"class":436,"line":1003},[434,4357,4358],{"class":440},"visit",[434,4360,4361],{"class":444}," https:\u002F\u002Fflutter.dev\u002Fsetup\u002F#android-setup",[434,4363,4364],{"class":444}," for",[434,4366,4367],{"class":444}," detailed",[434,4369,4370],{"class":444}," instructions.\n",[434,4372,4373],{"class":436,"line":1008},[434,4374,1213],{"emptyLinePlaceholder":407},[434,4376,4377],{"class":436,"line":1014},[434,4378,4379],{"class":645},">\n",[24,4381,1066],{"id":1066},[11,4383,4384,4385,4388,4389,4392],{},"在 Android Studio 中启动 ",[41,4386,4387],{},"SDK Manager","，去掉选项 ",[41,4390,4391],{},"Hide Obsolete Packages","：",[11,4394,4395],{},[139,4396],{"alt":4387,"src":4397},"\u002Fimages\u002Fflutter-android-sdkmanager\u002F02-sdk-manager.png",[11,4399,4400,4401,4392],{},"选择安装 ",[41,4402,4403],{},"Android SDK Tools (Obsolete)",[11,4405,4406],{},[139,4407],{"alt":4403,"src":4408},"\u002Fimages\u002Fflutter-android-sdkmanager\u002F03-sdk-tools-obsolete.png",[11,4410,4411,4412,4392],{},"点击 ",[41,4413,4414],{},"Apply",[11,4416,4417],{},[139,4418],{"alt":4414,"src":4419},"\u002Fimages\u002Fflutter-android-sdkmanager\u002F04-apply.png",[11,4421,4422],{},"安装完成。",[24,4424,4425],{"id":4425},"原因",[11,4427,4428,4429,4432],{},"不知道为啥 ",[41,4430,4431],{},"Android SDK Tools"," 被废弃了，但是好像 Flutter 还需要其提供支持。",[793,4434,4435],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":387,"searchDepth":388,"depth":388,"links":4437},[4438,4439,4440,4441],{"id":1831,"depth":388,"text":1831},{"id":4046,"depth":388,"text":4046},{"id":1066,"depth":388,"text":1066},{"id":4425,"depth":388,"text":4425},"2020-03-30","重装系统后 flutter doctor 一直报 Android license status unknown，找不到 sdkmanager。根因是被废弃的 Android SDK Tools 没装。",{},"\u002Fposts\u002Fflutter-android-sdkmanager-not-found",{"title":4033,"description":4443},"posts\u002Fflutter-android-sdkmanager-not-found",[4449,4169],"Flutter","GiT5gHSSUrSXafs-nkG3w45OUYqiQiNCK5LT3EeUBBg",{"id":4452,"title":4453,"body":4454,"date":5189,"description":5190,"extension":405,"meta":5191,"navigation":407,"path":5192,"seo":5193,"stem":5194,"tags":5195,"__hash__":5197},"posts\u002Fposts\u002Fcentos-yum-pgadmin4-python3-missing.md","解决 CentOS yum 安装 pgadmin4 报 nothing provides python3-*** 的问题",{"type":8,"value":4455,"toc":5183},[4456,4458,4464,4466,4469,4475,5150,5152,5155,5157,5163,5180],[24,4457,1831],{"id":1831},[426,4459,4462],{"className":4460,"code":4461,"language":1837},[1835],"CentOS8 (最小安装)\nPython3 (yum\u002Fdnf安装)\n",[132,4463,4461],{"__ignoreMap":387},[24,4465,4046],{"id":4046},[11,4467,4468],{},"安装时提示缺少 python3-alembic 等包，\n但是安装了 python3 仍然提示找不到包。",[11,4470,4471],{},[139,4472],{"alt":4473,"src":4474},"yum 安装报错","\u002Fimages\u002Fcentos-yum-pgadmin4\u002Ferror.png",[426,4476,4478],{"className":428,"code":4477,"language":430,"meta":387,"style":387},"[root@HyperV-PSQL ~]# yum -y install pgadmin4\n上次元数据过期检查：0:11:32 前，执行于 2020年03月10日 星期二 11时35分24秒。\n错误：\n 问题: package pgadmin4-4.19-1.rhel8.x86_64 requires pgadmin4-web, but none of the providers can be installed\n  - cannot install the best candidate for the job\n  - nothing provides python3-alembic needed by pgadmin4-web-4.16-1.rhel8.noarch\n  - nothing provides pgadmin4-python3-unittest2 needed by pgadmin4-web-4.16-1.rhel8.noarch\n  - nothing provides python3-blinker >= 1.4 needed by pgadmin4-web-4.16-1.rhel8.noarch\n  - nothing provides python3-beautifulsoup4 >= 4.4.1 needed by pgadmin4-web-4.16-1.rhel8.noarch\n  - nothing provides python3-flask-sqlalchemy >= 2.3.2 needed by pgadmin4-web-4.16-1.rhel8.noarch\n  - nothing provides python3-alembic needed by pgadmin4-web-4.16-2.rhel8.noarch\n  - nothing provides python3-unittest2 needed by pgadmin4-web-4.16-2.rhel8.noarch\n  - nothing provides python3-blinker >= 1.4 needed by pgadmin4-web-4.16-2.rhel8.noarch\n  - nothing provides python3-beautifulsoup4 >= 4.4.1 needed by pgadmin4-web-4.16-2.rhel8.noarch\n  - nothing provides python3-alembic needed by pgadmin4-web-4.17-1.rhel8.noarch\n  - nothing provides python3-unittest2 needed by pgadmin4-web-4.17-1.rhel8.noarch\n  - nothing provides python3-blinker >= 1.4 needed by pgadmin4-web-4.17-1.rhel8.noarch\n  - nothing provides python3-beautifulsoup4 >= 4.4.1 needed by pgadmin4-web-4.17-1.rhel8.noarch\n  - nothing provides python3-alembic needed by pgadmin4-web-4.17-2.rhel8.noarch\n  - nothing provides python3-unittest2 needed by pgadmin4-web-4.17-2.rhel8.noarch\n  - nothing provides python3-bcrypt needed by pgadmin4-web-4.17-2.rhel8.noarch\n  - nothing provides python3-pynacl needed by pgadmin4-web-4.17-2.rhel8.noarch\n  - nothing provides python3-blinker >= 1.4 needed by pgadmin4-web-4.17-2.rhel8.noarch\n  - nothing provides python3-beautifulsoup4 >= 4.4.1 needed by pgadmin4-web-4.17-2.rhel8.noarch\n  - nothing provides python3-alembic needed by pgadmin4-web-4.18-1.rhel8.noarch\n  - nothing provides python3-unittest2 needed by pgadmin4-web-4.18-1.rhel8.noarch\n  - nothing provides python3-bcrypt needed by pgadmin4-web-4.18-1.rhel8.noarch\n  - nothing provides python3-pynacl needed by pgadmin4-web-4.18-1.rhel8.noarch\n  - nothing provides python3-blinker >= 1.4 needed by pgadmin4-web-4.18-1.rhel8.noarch\n  - nothing provides python3-beautifulsoup4 >= 4.4.1 needed by pgadmin4-web-4.18-1.rhel8.noarch\n  - nothing provides python3-bcrypt needed by pgadmin4-web-4.19-1.rhel8.noarch\n  - nothing provides python3-pynacl needed by pgadmin4-web-4.19-1.rhel8.noarch\n  - nothing provides python3-blinker >= 1.4 needed by pgadmin4-web-4.19-1.rhel8.noarch\n(尝试添加 '--skip-broken' 来跳过无法安装的软件包 或 '--nobest' 来不只使用最佳选择的软件包)\n",[132,4479,4480,4492,4508,4513,4551,4575,4597,4614,4640,4664,4688,4705,4722,4744,4766,4783,4799,4821,4843,4860,4876,4893,4910,4932,4954,4971,4987,5003,5019,5041,5063,5080,5096,5118],{"__ignoreMap":387},[434,4481,4482,4484,4487,4489],{"class":436,"line":437},[434,4483,2011],{"class":645},[434,4485,4486],{"class":1910},"root@HyperV-PSQL ",[434,4488,2926],{"class":645},[434,4490,4491],{"class":1910},"# yum -y install pgadmin4\n",[434,4493,4494,4497,4499,4502,4505],{"class":436,"line":388},[434,4495,4496],{"class":440},"上次元数据过期检查：0:11:32",[434,4498,2166],{"class":444},[434,4500,4501],{"class":444}," 2020年03月10日",[434,4503,4504],{"class":444}," 星期二",[434,4506,4507],{"class":444}," 11时35分24秒。\n",[434,4509,4510],{"class":436,"line":396},[434,4511,4512],{"class":440},"错误：\n",[434,4514,4515,4518,4520,4523,4526,4529,4532,4535,4537,4539,4542,4545,4548],{"class":436,"line":633},[434,4516,4517],{"class":440}," 问题:",[434,4519,2416],{"class":444},[434,4521,4522],{"class":444}," pgadmin4-4.19-1.rhel8.x86_64",[434,4524,4525],{"class":444}," requires",[434,4527,4528],{"class":444}," pgadmin4-web,",[434,4530,4531],{"class":444}," but",[434,4533,4534],{"class":444}," none",[434,4536,1998],{"class":444},[434,4538,1898],{"class":444},[434,4540,4541],{"class":444}," providers",[434,4543,4544],{"class":444}," can",[434,4546,4547],{"class":444}," be",[434,4549,4550],{"class":444}," installed\n",[434,4552,4553,4556,4558,4560,4562,4565,4568,4570,4572],{"class":436,"line":655},[434,4554,4555],{"class":440},"  -",[434,4557,2666],{"class":444},[434,4559,2057],{"class":444},[434,4561,1898],{"class":444},[434,4563,4564],{"class":444}," best",[434,4566,4567],{"class":444}," candidate",[434,4569,4364],{"class":444},[434,4571,1898],{"class":444},[434,4573,4574],{"class":444}," job\n",[434,4576,4577,4579,4582,4585,4588,4591,4594],{"class":436,"line":663},[434,4578,4555],{"class":440},[434,4580,4581],{"class":444}," nothing",[434,4583,4584],{"class":444}," provides",[434,4586,4587],{"class":444}," python3-alembic",[434,4589,4590],{"class":444}," needed",[434,4592,4593],{"class":444}," by",[434,4595,4596],{"class":444}," pgadmin4-web-4.16-1.rhel8.noarch\n",[434,4598,4599,4601,4603,4605,4608,4610,4612],{"class":436,"line":674},[434,4600,4555],{"class":440},[434,4602,4581],{"class":444},[434,4604,4584],{"class":444},[434,4606,4607],{"class":444}," pgadmin4-python3-unittest2",[434,4609,4590],{"class":444},[434,4611,4593],{"class":444},[434,4613,4596],{"class":444},[434,4615,4616,4618,4620,4622,4625,4628,4631,4634,4636,4638],{"class":436,"line":680},[434,4617,4555],{"class":440},[434,4619,4581],{"class":444},[434,4621,4584],{"class":444},[434,4623,4624],{"class":444}," python3-blinker",[434,4626,4627],{"class":645}," >",[434,4629,4630],{"class":444},"=",[434,4632,4633],{"class":1972}," 1.4",[434,4635,4590],{"class":444},[434,4637,4593],{"class":444},[434,4639,4596],{"class":444},[434,4641,4642,4644,4646,4648,4651,4653,4655,4658,4660,4662],{"class":436,"line":694},[434,4643,4555],{"class":440},[434,4645,4581],{"class":444},[434,4647,4584],{"class":444},[434,4649,4650],{"class":444}," python3-beautifulsoup4",[434,4652,4627],{"class":645},[434,4654,4630],{"class":444},[434,4656,4657],{"class":1972}," 4.4.1",[434,4659,4590],{"class":444},[434,4661,4593],{"class":444},[434,4663,4596],{"class":444},[434,4665,4666,4668,4670,4672,4675,4677,4679,4682,4684,4686],{"class":436,"line":708},[434,4667,4555],{"class":440},[434,4669,4581],{"class":444},[434,4671,4584],{"class":444},[434,4673,4674],{"class":444}," python3-flask-sqlalchemy",[434,4676,4627],{"class":645},[434,4678,4630],{"class":444},[434,4680,4681],{"class":1972}," 2.3.2",[434,4683,4590],{"class":444},[434,4685,4593],{"class":444},[434,4687,4596],{"class":444},[434,4689,4690,4692,4694,4696,4698,4700,4702],{"class":436,"line":722},[434,4691,4555],{"class":440},[434,4693,4581],{"class":444},[434,4695,4584],{"class":444},[434,4697,4587],{"class":444},[434,4699,4590],{"class":444},[434,4701,4593],{"class":444},[434,4703,4704],{"class":444}," pgadmin4-web-4.16-2.rhel8.noarch\n",[434,4706,4707,4709,4711,4713,4716,4718,4720],{"class":436,"line":900},[434,4708,4555],{"class":440},[434,4710,4581],{"class":444},[434,4712,4584],{"class":444},[434,4714,4715],{"class":444}," python3-unittest2",[434,4717,4590],{"class":444},[434,4719,4593],{"class":444},[434,4721,4704],{"class":444},[434,4723,4724,4726,4728,4730,4732,4734,4736,4738,4740,4742],{"class":436,"line":973},[434,4725,4555],{"class":440},[434,4727,4581],{"class":444},[434,4729,4584],{"class":444},[434,4731,4624],{"class":444},[434,4733,4627],{"class":645},[434,4735,4630],{"class":444},[434,4737,4633],{"class":1972},[434,4739,4590],{"class":444},[434,4741,4593],{"class":444},[434,4743,4704],{"class":444},[434,4745,4746,4748,4750,4752,4754,4756,4758,4760,4762,4764],{"class":436,"line":979},[434,4747,4555],{"class":440},[434,4749,4581],{"class":444},[434,4751,4584],{"class":444},[434,4753,4650],{"class":444},[434,4755,4627],{"class":645},[434,4757,4630],{"class":444},[434,4759,4657],{"class":1972},[434,4761,4590],{"class":444},[434,4763,4593],{"class":444},[434,4765,4704],{"class":444},[434,4767,4768,4770,4772,4774,4776,4778,4780],{"class":436,"line":985},[434,4769,4555],{"class":440},[434,4771,4581],{"class":444},[434,4773,4584],{"class":444},[434,4775,4587],{"class":444},[434,4777,4590],{"class":444},[434,4779,4593],{"class":444},[434,4781,4782],{"class":444}," pgadmin4-web-4.17-1.rhel8.noarch\n",[434,4784,4785,4787,4789,4791,4793,4795,4797],{"class":436,"line":991},[434,4786,4555],{"class":440},[434,4788,4581],{"class":444},[434,4790,4584],{"class":444},[434,4792,4715],{"class":444},[434,4794,4590],{"class":444},[434,4796,4593],{"class":444},[434,4798,4782],{"class":444},[434,4800,4801,4803,4805,4807,4809,4811,4813,4815,4817,4819],{"class":436,"line":997},[434,4802,4555],{"class":440},[434,4804,4581],{"class":444},[434,4806,4584],{"class":444},[434,4808,4624],{"class":444},[434,4810,4627],{"class":645},[434,4812,4630],{"class":444},[434,4814,4633],{"class":1972},[434,4816,4590],{"class":444},[434,4818,4593],{"class":444},[434,4820,4782],{"class":444},[434,4822,4823,4825,4827,4829,4831,4833,4835,4837,4839,4841],{"class":436,"line":1003},[434,4824,4555],{"class":440},[434,4826,4581],{"class":444},[434,4828,4584],{"class":444},[434,4830,4650],{"class":444},[434,4832,4627],{"class":645},[434,4834,4630],{"class":444},[434,4836,4657],{"class":1972},[434,4838,4590],{"class":444},[434,4840,4593],{"class":444},[434,4842,4782],{"class":444},[434,4844,4845,4847,4849,4851,4853,4855,4857],{"class":436,"line":1008},[434,4846,4555],{"class":440},[434,4848,4581],{"class":444},[434,4850,4584],{"class":444},[434,4852,4587],{"class":444},[434,4854,4590],{"class":444},[434,4856,4593],{"class":444},[434,4858,4859],{"class":444}," pgadmin4-web-4.17-2.rhel8.noarch\n",[434,4861,4862,4864,4866,4868,4870,4872,4874],{"class":436,"line":1014},[434,4863,4555],{"class":440},[434,4865,4581],{"class":444},[434,4867,4584],{"class":444},[434,4869,4715],{"class":444},[434,4871,4590],{"class":444},[434,4873,4593],{"class":444},[434,4875,4859],{"class":444},[434,4877,4878,4880,4882,4884,4887,4889,4891],{"class":436,"line":1019},[434,4879,4555],{"class":440},[434,4881,4581],{"class":444},[434,4883,4584],{"class":444},[434,4885,4886],{"class":444}," python3-bcrypt",[434,4888,4590],{"class":444},[434,4890,4593],{"class":444},[434,4892,4859],{"class":444},[434,4894,4895,4897,4899,4901,4904,4906,4908],{"class":436,"line":1255},[434,4896,4555],{"class":440},[434,4898,4581],{"class":444},[434,4900,4584],{"class":444},[434,4902,4903],{"class":444}," python3-pynacl",[434,4905,4590],{"class":444},[434,4907,4593],{"class":444},[434,4909,4859],{"class":444},[434,4911,4912,4914,4916,4918,4920,4922,4924,4926,4928,4930],{"class":436,"line":1261},[434,4913,4555],{"class":440},[434,4915,4581],{"class":444},[434,4917,4584],{"class":444},[434,4919,4624],{"class":444},[434,4921,4627],{"class":645},[434,4923,4630],{"class":444},[434,4925,4633],{"class":1972},[434,4927,4590],{"class":444},[434,4929,4593],{"class":444},[434,4931,4859],{"class":444},[434,4933,4934,4936,4938,4940,4942,4944,4946,4948,4950,4952],{"class":436,"line":1267},[434,4935,4555],{"class":440},[434,4937,4581],{"class":444},[434,4939,4584],{"class":444},[434,4941,4650],{"class":444},[434,4943,4627],{"class":645},[434,4945,4630],{"class":444},[434,4947,4657],{"class":1972},[434,4949,4590],{"class":444},[434,4951,4593],{"class":444},[434,4953,4859],{"class":444},[434,4955,4956,4958,4960,4962,4964,4966,4968],{"class":436,"line":1273},[434,4957,4555],{"class":440},[434,4959,4581],{"class":444},[434,4961,4584],{"class":444},[434,4963,4587],{"class":444},[434,4965,4590],{"class":444},[434,4967,4593],{"class":444},[434,4969,4970],{"class":444}," pgadmin4-web-4.18-1.rhel8.noarch\n",[434,4972,4973,4975,4977,4979,4981,4983,4985],{"class":436,"line":1278},[434,4974,4555],{"class":440},[434,4976,4581],{"class":444},[434,4978,4584],{"class":444},[434,4980,4715],{"class":444},[434,4982,4590],{"class":444},[434,4984,4593],{"class":444},[434,4986,4970],{"class":444},[434,4988,4989,4991,4993,4995,4997,4999,5001],{"class":436,"line":1284},[434,4990,4555],{"class":440},[434,4992,4581],{"class":444},[434,4994,4584],{"class":444},[434,4996,4886],{"class":444},[434,4998,4590],{"class":444},[434,5000,4593],{"class":444},[434,5002,4970],{"class":444},[434,5004,5005,5007,5009,5011,5013,5015,5017],{"class":436,"line":1289},[434,5006,4555],{"class":440},[434,5008,4581],{"class":444},[434,5010,4584],{"class":444},[434,5012,4903],{"class":444},[434,5014,4590],{"class":444},[434,5016,4593],{"class":444},[434,5018,4970],{"class":444},[434,5020,5021,5023,5025,5027,5029,5031,5033,5035,5037,5039],{"class":436,"line":1295},[434,5022,4555],{"class":440},[434,5024,4581],{"class":444},[434,5026,4584],{"class":444},[434,5028,4624],{"class":444},[434,5030,4627],{"class":645},[434,5032,4630],{"class":444},[434,5034,4633],{"class":1972},[434,5036,4590],{"class":444},[434,5038,4593],{"class":444},[434,5040,4970],{"class":444},[434,5042,5043,5045,5047,5049,5051,5053,5055,5057,5059,5061],{"class":436,"line":1301},[434,5044,4555],{"class":440},[434,5046,4581],{"class":444},[434,5048,4584],{"class":444},[434,5050,4650],{"class":444},[434,5052,4627],{"class":645},[434,5054,4630],{"class":444},[434,5056,4657],{"class":1972},[434,5058,4590],{"class":444},[434,5060,4593],{"class":444},[434,5062,4970],{"class":444},[434,5064,5065,5067,5069,5071,5073,5075,5077],{"class":436,"line":1306},[434,5066,4555],{"class":440},[434,5068,4581],{"class":444},[434,5070,4584],{"class":444},[434,5072,4886],{"class":444},[434,5074,4590],{"class":444},[434,5076,4593],{"class":444},[434,5078,5079],{"class":444}," pgadmin4-web-4.19-1.rhel8.noarch\n",[434,5081,5082,5084,5086,5088,5090,5092,5094],{"class":436,"line":1311},[434,5083,4555],{"class":440},[434,5085,4581],{"class":444},[434,5087,4584],{"class":444},[434,5089,4903],{"class":444},[434,5091,4590],{"class":444},[434,5093,4593],{"class":444},[434,5095,5079],{"class":444},[434,5097,5098,5100,5102,5104,5106,5108,5110,5112,5114,5116],{"class":436,"line":1317},[434,5099,4555],{"class":440},[434,5101,4581],{"class":444},[434,5103,4584],{"class":444},[434,5105,4624],{"class":444},[434,5107,4627],{"class":645},[434,5109,4630],{"class":444},[434,5111,4633],{"class":1972},[434,5113,4590],{"class":444},[434,5115,4593],{"class":444},[434,5117,5079],{"class":444},[434,5119,5120,5122,5125,5127,5130,5132,5135,5138,5140,5143,5145,5148],{"class":436,"line":1322},[434,5121,2596],{"class":645},[434,5123,5124],{"class":440},"尝试添加",[434,5126,2763],{"class":645},[434,5128,5129],{"class":444},"--skip-broken",[434,5131,646],{"class":645},[434,5133,5134],{"class":444}," 来跳过无法安装的软件包",[434,5136,5137],{"class":444}," 或",[434,5139,2763],{"class":645},[434,5141,5142],{"class":444},"--nobest",[434,5144,646],{"class":645},[434,5146,5147],{"class":444}," 来不只使用最佳选择的软件包",[434,5149,1920],{"class":645},[24,5151,4425],{"id":4425},[11,5153,5154],{},"官方的 rpm repository 没有提供对应的包。",[24,5156,1066],{"id":1066},[11,5158,5159,5160,4392],{},"安装 ",[41,5161,5162],{},"EPEL",[426,5164,5166],{"className":428,"code":5165,"language":430,"meta":387,"style":387},"yum install epel-release -y\n",[132,5167,5168],{"__ignoreMap":387},[434,5169,5170,5172,5174,5177],{"class":436,"line":437},[434,5171,3120],{"class":440},[434,5173,2057],{"class":444},[434,5175,5176],{"class":444}," epel-release",[434,5178,5179],{"class":444}," -y\n",[793,5181,5182],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":387,"searchDepth":388,"depth":388,"links":5184},[5185,5186,5187,5188],{"id":1831,"depth":388,"text":1831},{"id":4046,"depth":388,"text":4046},{"id":4425,"depth":388,"text":4425},{"id":1066,"depth":388,"text":1066},"2020-03-13","CentOS 8 上装 pgadmin4 一直缺 python3-alembic 之类的包，但 python3 明明装了。原因是官方 rpm 仓库没提供这些包，得先装 EPEL。",{},"\u002Fposts\u002Fcentos-yum-pgadmin4-python3-missing",{"title":4453,"description":5190},"posts\u002Fcentos-yum-pgadmin4-python3-missing",[816,5196,817],"PostgreSQL","m8HlbPTWcENXN-aO3c9aheDUKgp-zFDXfe9aG1lKEXI",{"id":5199,"title":3157,"body":5200,"date":6136,"description":6137,"extension":405,"meta":6138,"navigation":407,"path":6139,"seo":6140,"stem":6141,"tags":6142,"__hash__":6143},"posts\u002Fposts\u002Fjar2pom-nexus2-dependency.md",{"type":8,"value":5201,"toc":6132},[5202,5213,6058,6062,6121,6124,6130],[5203,5204,5205],"blockquote",{},[11,5206,5207,5208,104],{},"此版本基于 Nexus OSS 2 相关接口。\n基于 Maven 中心库的版本请",[347,5209,5212],{"href":5210,"rel":5211},"https:\u002F\u002Fblog.csdn.net\u002FJustinJia91\u002Farticle\u002Fdetails\u002F106162722",[351],"点这里",[426,5214,5216],{"className":1144,"code":5215,"language":1146,"meta":387,"style":387},"package com.jxh.tool;\n\nimport org.apache.http.HttpResponse;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.impl.client.HttpClients;\nimport org.apache.http.util.EntityUtils;\nimport org.dom4j.Document;\nimport org.dom4j.DocumentException;\nimport org.dom4j.DocumentHelper;\nimport org.dom4j.Element;\nimport org.dom4j.dom.DOMElement;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.math.BigInteger;\nimport java.security.MessageDigest;\nimport java.util.jar.*;\n\n\u002F**\n * 通过Jar包SHA1或MD5生成Pom文件\n *\n * @author JiaXiaohei\n * @date 2018-03-16\n *\u002F\npublic class Jar2pom {\n\n    \u002F**\n     * Maven库\n     *\u002F\n    \u002F\u002Fpublic static final String nexusUrl = \"http:\u002F\u002Fmaven.aliyun.com\u002Fnexus\u002Fservice\u002Flocal\u002Flucene\u002Fsearch\";\n    public static final String nexusUrl = \"http:\u002F\u002F59.110.144.164\u002Fnexus\u002Fservice\u002Flocal\u002Flucene\u002Fsearch\";\n\n\n    public static void main(String[] args) {\n    \u002F\u002F先通过Jar的SHA1查询 如果不存在则解析Manifest查询\n        File libs = new File(\"D:\\\\lib\");\n        for (File jar : libs.listFiles()) {\n            System.out.println(\"\u003C!--  \" + jar.getName() + \" -->\");\n            if (!getPomByChecksum(jar).isTextOnly()) {\n                System.out.println(\"\u003C!--  Search by Checksum -->\");\n                System.out.println(getPomByChecksum(jar).asXML());\n            } else if (!getPomByManifest(jar).isTextOnly()) {\n                System.out.println(\"\u003C!--  Search by Manifest -->\");\n                System.out.println(getPomByManifest(jar).asXML());\n            } else {\n                System.out.println(\"\u003C!--  No data was found -->\");\n            }\n            System.out.println();\n        }\n\n    }\n\n    \u002F**\n     * 通过Jar SHA1返回Pom dependency\n     *\n     * @param file\n     * @return\n     *\u002F\n    public static Element getPomByChecksum(File file) {\n        String checkSum = getCheckSum(file, \"SHA1\");\n        String xml = doGet(nexusUrl + \"?sha1=\" + checkSum);\n        return assemblePomElement(xml);\n    }\n\n    \u002F**\n     * 通过Jar Manifest返回Pom dependency\n     *\n     * @param file\n     * @return\n     *\u002F\n    public static Element getPomByManifest(File file) {\n        try {\n            JarFile jarfile = new JarFile(file);\n            Manifest mainmanifest = jarfile.getManifest();\n            jarfile.close();\n            if (null == mainmanifest) {\n                return new DOMElement(\"dependency\");\n            }\n            String a = null, v = null;\n            if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Extension-Name\"))) {\n                a = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Extension-Name\"));\n            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Implementation-Title\"))) {\n                a = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Implementation-Title\"));\n            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Specification-Title\"))) {\n                a = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Specification-Title\"));\n            }\n            if (a != null && a.length() != 0) {\n                a = a.replace(\"\\\"\", \"\").replace(\" \", \"-\");\n            }\n            if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Bundle-Version\"))) {\n                v = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Bundle-Version\"));\n            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Implementation-Version\"))) {\n                v = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Implementation-Version\"));\n            } else if (mainmanifest.getMainAttributes().containsKey(new Attributes.Name(\"Specification-Version\"))) {\n                v = mainmanifest.getMainAttributes().getValue(new Attributes.Name(\"Specification-Version\"));\n            }\n            if (v != null && v.length() != 0) {\n                v = v.replace(\"\\\"\", \"\").replace(\" \", \"-\");\n            }\n            String xml = doGet(nexusUrl + \"?a=\" + a + \"&v=\" + v);\n            return assemblePomElement(xml);\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        return new DOMElement(\"dependency\");\n    }\n\n    \u002F**\n     * 解析获取的XML 组装dependency\n     *\n     * @param xml\n     * @return\n     *\u002F\n    public static Element assemblePomElement(String xml) {\n        Element dependency = new DOMElement(\"dependency\");\n\n        if (xml != null && xml.length() != 0) {\n            try {\n                Document document = DocumentHelper.parseText(xml);\n                Element dataElement = document.getRootElement().element(\"data\");\n                if (dataElement.getText() != null && dataElement.getText().length() != 0) {\n                    Element artifactElement = dataElement.element(\"artifact\");\n                    dependency.add((Element) artifactElement.element(\"groupId\").clone());\n                    dependency.add((Element) artifactElement.element(\"artifactId\").clone());\n                    dependency.add((Element) artifactElement.element(\"version\").clone());\n                }\n            } catch (DocumentException e) {\n                e.printStackTrace();\n            }\n        }\n        return dependency;\n    }\n\n    \u002F**\n     * 发起Get请求\n     *\n     * @param url\n     * @return\n     *\u002F\n    public static String doGet(String url) {\n        String srtResult = null;\n        CloseableHttpClient httpCilent = HttpClients.createDefault();\n        HttpGet httpGet = new HttpGet(url);\n        try {\n            HttpResponse httpResponse = httpCilent.execute(httpGet);\n            srtResult = EntityUtils.toString(httpResponse.getEntity());\n        } catch (IOException e) {\n            e.printStackTrace();\n        } finally {\n            try {\n                httpCilent.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n        return srtResult;\n    }\n\n    \u002F**\n     * 计算CheckSum\n     *\n     * @param file\n     * @param algorithm SHA1 or MD5\n     * @return\n     *\u002F\n    public static String getCheckSum(File file, String algorithm) {\n        if (!file.isFile()) {\n            return null;\n        }\n        MessageDigest digest = null;\n        FileInputStream in = null;\n        byte buffer[] = new byte[1024];\n        int len;\n        try {\n            digest = MessageDigest.getInstance(algorithm);\n            in = new FileInputStream(file);\n            while ((len = in.read(buffer, 0, 1024)) != -1) {\n                digest.update(buffer, 0, len);\n            }\n            in.close();\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n        BigInteger bigInt = new BigInteger(1, digest.digest());\n        return bigInt.toString(16);\n    }\n\n}\n",[132,5217,5218,5223,5227,5232,5237,5242,5247,5252,5257,5262,5267,5272,5277,5281,5286,5291,5296,5301,5306,5311,5315,5319,5324,5329,5334,5339,5343,5348,5352,5356,5361,5365,5370,5375,5379,5383,5387,5392,5396,5400,5404,5409,5413,5418,5423,5427,5432,5437,5442,5446,5450,5454,5458,5462,5466,5470,5474,5478,5482,5486,5490,5495,5499,5504,5509,5513,5517,5521,5525,5529,5533,5537,5541,5546,5550,5554,5558,5562,5566,5571,5575,5579,5583,5587,5591,5595,5599,5603,5607,5611,5615,5619,5623,5627,5631,5635,5639,5643,5647,5651,5655,5659,5664,5669,5673,5677,5681,5686,5690,5694,5698,5703,5707,5712,5716,5720,5725,5729,5733,5738,5742,5747,5752,5757,5762,5767,5772,5777,5781,5786,5790,5794,5798,5802,5806,5810,5814,5818,5822,5826,5830,5834,5838,5842,5846,5850,5854,5858,5862,5866,5870,5874,5878,5882,5886,5890,5894,5898,5902,5906,5910,5914,5918,5922,5926,5930,5934,5938,5943,5948,5953,5958,5963,5968,5973,5978,5983,5988,5993,5998,6003,6008,6013,6018,6023,6028,6033,6038,6043,6048,6053],{"__ignoreMap":387},[434,5219,5220],{"class":436,"line":437},[434,5221,5222],{},"package com.jxh.tool;\n",[434,5224,5225],{"class":436,"line":388},[434,5226,1213],{"emptyLinePlaceholder":407},[434,5228,5229],{"class":436,"line":396},[434,5230,5231],{},"import org.apache.http.HttpResponse;\n",[434,5233,5234],{"class":436,"line":633},[434,5235,5236],{},"import org.apache.http.client.methods.HttpGet;\n",[434,5238,5239],{"class":436,"line":655},[434,5240,5241],{},"import org.apache.http.impl.client.CloseableHttpClient;\n",[434,5243,5244],{"class":436,"line":663},[434,5245,5246],{},"import org.apache.http.impl.client.HttpClients;\n",[434,5248,5249],{"class":436,"line":674},[434,5250,5251],{},"import org.apache.http.util.EntityUtils;\n",[434,5253,5254],{"class":436,"line":680},[434,5255,5256],{},"import org.dom4j.Document;\n",[434,5258,5259],{"class":436,"line":694},[434,5260,5261],{},"import org.dom4j.DocumentException;\n",[434,5263,5264],{"class":436,"line":708},[434,5265,5266],{},"import org.dom4j.DocumentHelper;\n",[434,5268,5269],{"class":436,"line":722},[434,5270,5271],{},"import org.dom4j.Element;\n",[434,5273,5274],{"class":436,"line":900},[434,5275,5276],{},"import org.dom4j.dom.DOMElement;\n",[434,5278,5279],{"class":436,"line":973},[434,5280,1213],{"emptyLinePlaceholder":407},[434,5282,5283],{"class":436,"line":979},[434,5284,5285],{},"import java.io.File;\n",[434,5287,5288],{"class":436,"line":985},[434,5289,5290],{},"import java.io.FileInputStream;\n",[434,5292,5293],{"class":436,"line":991},[434,5294,5295],{},"import java.io.IOException;\n",[434,5297,5298],{"class":436,"line":997},[434,5299,5300],{},"import java.math.BigInteger;\n",[434,5302,5303],{"class":436,"line":1003},[434,5304,5305],{},"import java.security.MessageDigest;\n",[434,5307,5308],{"class":436,"line":1008},[434,5309,5310],{},"import java.util.jar.*;\n",[434,5312,5313],{"class":436,"line":1014},[434,5314,1213],{"emptyLinePlaceholder":407},[434,5316,5317],{"class":436,"line":1019},[434,5318,1247],{},[434,5320,5321],{"class":436,"line":1255},[434,5322,5323],{}," * 通过Jar包SHA1或MD5生成Pom文件\n",[434,5325,5326],{"class":436,"line":1261},[434,5327,5328],{}," *\n",[434,5330,5331],{"class":436,"line":1267},[434,5332,5333],{}," * @author JiaXiaohei\n",[434,5335,5336],{"class":436,"line":1273},[434,5337,5338],{}," * @date 2018-03-16\n",[434,5340,5341],{"class":436,"line":1278},[434,5342,1258],{},[434,5344,5345],{"class":436,"line":1284},[434,5346,5347],{},"public class Jar2pom {\n",[434,5349,5350],{"class":436,"line":1289},[434,5351,1213],{"emptyLinePlaceholder":407},[434,5353,5354],{"class":436,"line":1295},[434,5355,1376],{},[434,5357,5358],{"class":436,"line":1301},[434,5359,5360],{},"     * Maven库\n",[434,5362,5363],{"class":436,"line":1306},[434,5364,1400],{},[434,5366,5367],{"class":436,"line":1311},[434,5368,5369],{},"    \u002F\u002Fpublic static final String nexusUrl = \"http:\u002F\u002Fmaven.aliyun.com\u002Fnexus\u002Fservice\u002Flocal\u002Flucene\u002Fsearch\";\n",[434,5371,5372],{"class":436,"line":1317},[434,5373,5374],{},"    public static final String nexusUrl = \"http:\u002F\u002F59.110.144.164\u002Fnexus\u002Fservice\u002Flocal\u002Flucene\u002Fsearch\";\n",[434,5376,5377],{"class":436,"line":1322},[434,5378,1213],{"emptyLinePlaceholder":407},[434,5380,5381],{"class":436,"line":1328},[434,5382,1213],{"emptyLinePlaceholder":407},[434,5384,5385],{"class":436,"line":1333},[434,5386,3176],{},[434,5388,5389],{"class":436,"line":1339},[434,5390,5391],{},"    \u002F\u002F先通过Jar的SHA1查询 如果不存在则解析Manifest查询\n",[434,5393,5394],{"class":436,"line":1344},[434,5395,3186],{},[434,5397,5398],{"class":436,"line":1350},[434,5399,3191],{},[434,5401,5402],{"class":436,"line":1356},[434,5403,3200],{},[434,5405,5406],{"class":436,"line":1362},[434,5407,5408],{},"            if (!getPomByChecksum(jar).isTextOnly()) {\n",[434,5410,5411],{"class":436,"line":1368},[434,5412,3219],{},[434,5414,5415],{"class":436,"line":1373},[434,5416,5417],{},"                System.out.println(getPomByChecksum(jar).asXML());\n",[434,5419,5420],{"class":436,"line":1379},[434,5421,5422],{},"            } else if (!getPomByManifest(jar).isTextOnly()) {\n",[434,5424,5425],{"class":436,"line":1385},[434,5426,3251],{},[434,5428,5429],{"class":436,"line":1391},[434,5430,5431],{},"                System.out.println(getPomByManifest(jar).asXML());\n",[434,5433,5434],{"class":436,"line":1397},[434,5435,5436],{},"            } else {\n",[434,5438,5439],{"class":436,"line":1403},[434,5440,5441],{},"                System.out.println(\"\u003C!--  No data was found -->\");\n",[434,5443,5444],{"class":436,"line":1409},[434,5445,1598],{},[434,5447,5448],{"class":436,"line":1415},[434,5449,3281],{},[434,5451,5452],{"class":436,"line":1420},[434,5453,1766],{},[434,5455,5456],{"class":436,"line":1425},[434,5457,1213],{"emptyLinePlaceholder":407},[434,5459,5460],{"class":436,"line":1430},[434,5461,1365],{},[434,5463,5464],{"class":436,"line":1436},[434,5465,1213],{"emptyLinePlaceholder":407},[434,5467,5468],{"class":436,"line":1441},[434,5469,1376],{},[434,5471,5472],{"class":436,"line":1446},[434,5473,3306],{},[434,5475,5476],{"class":436,"line":1451},[434,5477,1388],{},[434,5479,5480],{"class":436,"line":1457},[434,5481,3315],{},[434,5483,5484],{"class":436,"line":1463},[434,5485,1394],{},[434,5487,5488],{"class":436,"line":1468},[434,5489,1400],{},[434,5491,5492],{"class":436,"line":1473},[434,5493,5494],{},"    public static Element getPomByChecksum(File file) {\n",[434,5496,5497],{"class":436,"line":1478},[434,5498,3342],{},[434,5500,5501],{"class":436,"line":1484},[434,5502,5503],{},"        String xml = doGet(nexusUrl + \"?sha1=\" + checkSum);\n",[434,5505,5506],{"class":436,"line":1489},[434,5507,5508],{},"        return assemblePomElement(xml);\n",[434,5510,5511],{"class":436,"line":1495},[434,5512,1365],{},[434,5514,5515],{"class":436,"line":1500},[434,5516,1213],{"emptyLinePlaceholder":407},[434,5518,5519],{"class":436,"line":1506},[434,5520,1376],{},[434,5522,5523],{"class":436,"line":1512},[434,5524,3396],{},[434,5526,5527],{"class":436,"line":1518},[434,5528,1388],{},[434,5530,5531],{"class":436,"line":1524},[434,5532,3315],{},[434,5534,5535],{"class":436,"line":1530},[434,5536,1394],{},[434,5538,5539],{"class":436,"line":1536},[434,5540,1400],{},[434,5542,5543],{"class":436,"line":1542},[434,5544,5545],{},"    public static Element getPomByManifest(File file) {\n",[434,5547,5548],{"class":436,"line":1548},[434,5549,3430],{},[434,5551,5552],{"class":436,"line":1554},[434,5553,3435],{},[434,5555,5556],{"class":436,"line":1560},[434,5557,3440],{},[434,5559,5560],{"class":436,"line":1566},[434,5561,3445],{},[434,5563,5564],{"class":436,"line":1571},[434,5565,3450],{},[434,5567,5568],{"class":436,"line":1577},[434,5569,5570],{},"                return new DOMElement(\"dependency\");\n",[434,5572,5573],{"class":436,"line":1583},[434,5574,1598],{},[434,5576,5577],{"class":436,"line":1589},[434,5578,3464],{},[434,5580,5581],{"class":436,"line":1595},[434,5582,3469],{},[434,5584,5585],{"class":436,"line":1601},[434,5586,3474],{},[434,5588,5589],{"class":436,"line":1607},[434,5590,3479],{},[434,5592,5593],{"class":436,"line":1612},[434,5594,3484],{},[434,5596,5597],{"class":436,"line":1617},[434,5598,3489],{},[434,5600,5601],{"class":436,"line":1622},[434,5602,3494],{},[434,5604,5605],{"class":436,"line":1628},[434,5606,1598],{},[434,5608,5609],{"class":436,"line":1633},[434,5610,3503],{},[434,5612,5613],{"class":436,"line":1639},[434,5614,3508],{},[434,5616,5617],{"class":436,"line":1644},[434,5618,1598],{},[434,5620,5621],{"class":436,"line":1649},[434,5622,3517],{},[434,5624,5625],{"class":436,"line":1655},[434,5626,3522],{},[434,5628,5629],{"class":436,"line":1661},[434,5630,3527],{},[434,5632,5633],{"class":436,"line":1667},[434,5634,3532],{},[434,5636,5637],{"class":436,"line":1673},[434,5638,3537],{},[434,5640,5641],{"class":436,"line":1679},[434,5642,3542],{},[434,5644,5645],{"class":436,"line":1685},[434,5646,1598],{},[434,5648,5649],{"class":436,"line":1690},[434,5650,3551],{},[434,5652,5653],{"class":436,"line":1695},[434,5654,3556],{},[434,5656,5657],{"class":436,"line":1700},[434,5658,1598],{},[434,5660,5661],{"class":436,"line":1706},[434,5662,5663],{},"            String xml = doGet(nexusUrl + \"?a=\" + a + \"&v=\" + v);\n",[434,5665,5666],{"class":436,"line":1711},[434,5667,5668],{},"            return assemblePomElement(xml);\n",[434,5670,5671],{"class":436,"line":1717},[434,5672,3593],{},[434,5674,5675],{"class":436,"line":1723},[434,5676,3598],{},[434,5678,5679],{"class":436,"line":1728},[434,5680,1766],{},[434,5682,5683],{"class":436,"line":1733},[434,5684,5685],{},"        return new DOMElement(\"dependency\");\n",[434,5687,5688],{"class":436,"line":1739},[434,5689,1365],{},[434,5691,5692],{"class":436,"line":1745},[434,5693,1213],{"emptyLinePlaceholder":407},[434,5695,5696],{"class":436,"line":1751},[434,5697,1376],{},[434,5699,5700],{"class":436,"line":1757},[434,5701,5702],{},"     * 解析获取的XML 组装dependency\n",[434,5704,5705],{"class":436,"line":1763},[434,5706,1388],{},[434,5708,5709],{"class":436,"line":1769},[434,5710,5711],{},"     * @param xml\n",[434,5713,5714],{"class":436,"line":1775},[434,5715,1394],{},[434,5717,5718],{"class":436,"line":1780},[434,5719,1400],{},[434,5721,5722],{"class":436,"line":1785},[434,5723,5724],{},"    public static Element assemblePomElement(String xml) {\n",[434,5726,5727],{"class":436,"line":3703},[434,5728,3650],{},[434,5730,5731],{"class":436,"line":3709},[434,5732,1213],{"emptyLinePlaceholder":407},[434,5734,5735],{"class":436,"line":3714},[434,5736,5737],{},"        if (xml != null && xml.length() != 0) {\n",[434,5739,5740],{"class":436,"line":3719},[434,5741,3779],{},[434,5743,5744],{"class":436,"line":3725},[434,5745,5746],{},"                Document document = DocumentHelper.parseText(xml);\n",[434,5748,5749],{"class":436,"line":3731},[434,5750,5751],{},"                Element dataElement = document.getRootElement().element(\"data\");\n",[434,5753,5754],{"class":436,"line":3737},[434,5755,5756],{},"                if (dataElement.getText() != null && dataElement.getText().length() != 0) {\n",[434,5758,5759],{"class":436,"line":3743},[434,5760,5761],{},"                    Element artifactElement = dataElement.element(\"artifact\");\n",[434,5763,5764],{"class":436,"line":3748},[434,5765,5766],{},"                    dependency.add((Element) artifactElement.element(\"groupId\").clone());\n",[434,5768,5769],{"class":436,"line":3754},[434,5770,5771],{},"                    dependency.add((Element) artifactElement.element(\"artifactId\").clone());\n",[434,5773,5774],{"class":436,"line":3760},[434,5775,5776],{},"                    dependency.add((Element) artifactElement.element(\"version\").clone());\n",[434,5778,5779],{"class":436,"line":3765},[434,5780,1545],{},[434,5782,5783],{"class":436,"line":3770},[434,5784,5785],{},"            } catch (DocumentException e) {\n",[434,5787,5788],{"class":436,"line":3776},[434,5789,3797],{},[434,5791,5792],{"class":436,"line":3782},[434,5793,1598],{},[434,5795,5796],{"class":436,"line":3788},[434,5797,1766],{},[434,5799,5800],{"class":436,"line":3794},[434,5801,3679],{},[434,5803,5804],{"class":436,"line":3800},[434,5805,1365],{},[434,5807,5808],{"class":436,"line":3805},[434,5809,1213],{"emptyLinePlaceholder":407},[434,5811,5812],{"class":436,"line":3810},[434,5813,1376],{},[434,5815,5816],{"class":436,"line":3816},[434,5817,3696],{},[434,5819,5820],{"class":436,"line":3821},[434,5821,1388],{},[434,5823,5824],{"class":436,"line":3826},[434,5825,3706],{},[434,5827,5828],{"class":436,"line":3831},[434,5829,1394],{},[434,5831,5832],{"class":436,"line":3837},[434,5833,1400],{},[434,5835,5836],{"class":436,"line":3842},[434,5837,3722],{},[434,5839,5840],{"class":436,"line":3847},[434,5841,3728],{},[434,5843,5844],{"class":436,"line":3853},[434,5845,3734],{},[434,5847,5848],{"class":436,"line":3858},[434,5849,3740],{},[434,5851,5852],{"class":436,"line":3863},[434,5853,3430],{},[434,5855,5856],{"class":436,"line":3869},[434,5857,3751],{},[434,5859,5860],{"class":436,"line":3875},[434,5861,3757],{},[434,5863,5864],{"class":436,"line":3881},[434,5865,3593],{},[434,5867,5868],{"class":436,"line":3886},[434,5869,3598],{},[434,5871,5872],{"class":436,"line":3892},[434,5873,3773],{},[434,5875,5876],{"class":436,"line":3898},[434,5877,3779],{},[434,5879,5880],{"class":436,"line":3904},[434,5881,3785],{},[434,5883,5884],{"class":436,"line":3910},[434,5885,3791],{},[434,5887,5888],{"class":436,"line":3915},[434,5889,3797],{},[434,5891,5892],{"class":436,"line":3921},[434,5893,1598],{},[434,5895,5896],{"class":436,"line":3927},[434,5897,1766],{},[434,5899,5900],{"class":436,"line":3933},[434,5901,3813],{},[434,5903,5904],{"class":436,"line":3939},[434,5905,1365],{},[434,5907,5908],{"class":436,"line":3944},[434,5909,1213],{"emptyLinePlaceholder":407},[434,5911,5912],{"class":436,"line":3950},[434,5913,1376],{},[434,5915,5916],{"class":436,"line":3956},[434,5917,3834],{},[434,5919,5920],{"class":436,"line":3961},[434,5921,1388],{},[434,5923,5924],{"class":436,"line":3966},[434,5925,3315],{},[434,5927,5928],{"class":436,"line":3971},[434,5929,3850],{},[434,5931,5932],{"class":436,"line":3977},[434,5933,1394],{},[434,5935,5936],{"class":436,"line":3983},[434,5937,1400],{},[434,5939,5941],{"class":436,"line":5940},168,[434,5942,3866],{},[434,5944,5946],{"class":436,"line":5945},169,[434,5947,3872],{},[434,5949,5951],{"class":436,"line":5950},170,[434,5952,3878],{},[434,5954,5956],{"class":436,"line":5955},171,[434,5957,1766],{},[434,5959,5961],{"class":436,"line":5960},172,[434,5962,3889],{},[434,5964,5966],{"class":436,"line":5965},173,[434,5967,3895],{},[434,5969,5971],{"class":436,"line":5970},174,[434,5972,3901],{},[434,5974,5976],{"class":436,"line":5975},175,[434,5977,3907],{},[434,5979,5981],{"class":436,"line":5980},176,[434,5982,3430],{},[434,5984,5986],{"class":436,"line":5985},177,[434,5987,3918],{},[434,5989,5991],{"class":436,"line":5990},178,[434,5992,3924],{},[434,5994,5996],{"class":436,"line":5995},179,[434,5997,3930],{},[434,5999,6001],{"class":436,"line":6000},180,[434,6002,3936],{},[434,6004,6006],{"class":436,"line":6005},181,[434,6007,1598],{},[434,6009,6011],{"class":436,"line":6010},182,[434,6012,3947],{},[434,6014,6016],{"class":436,"line":6015},183,[434,6017,3953],{},[434,6019,6021],{"class":436,"line":6020},184,[434,6022,3598],{},[434,6024,6026],{"class":436,"line":6025},185,[434,6027,3878],{},[434,6029,6031],{"class":436,"line":6030},186,[434,6032,1766],{},[434,6034,6036],{"class":436,"line":6035},187,[434,6037,3974],{},[434,6039,6041],{"class":436,"line":6040},188,[434,6042,3980],{},[434,6044,6046],{"class":436,"line":6045},189,[434,6047,1365],{},[434,6049,6051],{"class":436,"line":6050},190,[434,6052,1213],{"emptyLinePlaceholder":407},[434,6054,6056],{"class":436,"line":6055},191,[434,6057,1788],{},[24,6059,6061],{"id":6060},"依赖-jar","依赖 Jar",[426,6063,6067],{"className":6064,"code":6065,"language":6066,"meta":387,"style":387},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","        \u003Cdependency>\n            \u003CgroupId>org.apache.httpcomponents\u003C\u002FgroupId>\n            \u003CartifactId>httpclient\u003C\u002FartifactId>\n            \u003Cversion>4.5.5\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n\n        \u003Cdependency>\n            \u003CgroupId>org.dom4j\u003C\u002FgroupId>\n            \u003CartifactId>dom4j\u003C\u002FartifactId>\n            \u003Cversion>[2.1.1,)\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n","xml",[132,6068,6069,6074,6079,6084,6089,6094,6098,6102,6107,6112,6117],{"__ignoreMap":387},[434,6070,6071],{"class":436,"line":437},[434,6072,6073],{},"        \u003Cdependency>\n",[434,6075,6076],{"class":436,"line":388},[434,6077,6078],{},"            \u003CgroupId>org.apache.httpcomponents\u003C\u002FgroupId>\n",[434,6080,6081],{"class":436,"line":396},[434,6082,6083],{},"            \u003CartifactId>httpclient\u003C\u002FartifactId>\n",[434,6085,6086],{"class":436,"line":633},[434,6087,6088],{},"            \u003Cversion>4.5.5\u003C\u002Fversion>\n",[434,6090,6091],{"class":436,"line":655},[434,6092,6093],{},"        \u003C\u002Fdependency>\n",[434,6095,6096],{"class":436,"line":663},[434,6097,1213],{"emptyLinePlaceholder":407},[434,6099,6100],{"class":436,"line":674},[434,6101,6073],{},[434,6103,6104],{"class":436,"line":680},[434,6105,6106],{},"            \u003CgroupId>org.dom4j\u003C\u002FgroupId>\n",[434,6108,6109],{"class":436,"line":694},[434,6110,6111],{},"            \u003CartifactId>dom4j\u003C\u002FartifactId>\n",[434,6113,6114],{"class":436,"line":708},[434,6115,6116],{},"            \u003Cversion>[2.1.1,)\u003C\u002Fversion>\n",[434,6118,6119],{"class":436,"line":722},[434,6120,6093],{},[24,6122,6123],{"id":6123},"开发环境",[426,6125,6128],{"className":6126,"code":6127,"language":1837},[1835],"jdk1.7.0_80\napache-maven-3.5.0\nIntelliJ IDEA Community Edition 2017.1.4 x64\n",[132,6129,6127],{"__ignoreMap":387},[793,6131,1032],{},{"title":387,"searchDepth":388,"depth":388,"links":6133},[6134,6135],{"id":6060,"depth":388,"text":6061},{"id":6123,"depth":388,"text":6123},"2018-03-18","给非 Maven 项目的一堆本地 jar 生成 dependency。用 jar 的 SHA1 去 Nexus OSS 2 的 lucene 接口反查坐标，查不到再退回解析 Manifest。",{},"\u002Fposts\u002Fjar2pom-nexus2-dependency",{"title":3157,"description":6137},"posts\u002Fjar2pom-nexus2-dependency",[4029,1822,415],"i_vX-NkNEk-H-GzcqN5f8Fk0M_Qq49nVjWIBkB0G8Vg",{"id":6145,"title":6146,"body":6147,"date":6549,"description":6550,"extension":405,"meta":6551,"navigation":407,"path":6552,"seo":6553,"stem":6554,"tags":6555,"__hash__":6558},"posts\u002Fposts\u002Foracle-sort-positive-negative.md","ORACLE 正负数分开排序 SQL",{"type":8,"value":6148,"toc":6543},[6149,6152,6182,6185,6225,6301,6305,6325,6350,6427,6431,6449,6471,6541],[24,6150,6151],{"id":6151},"表结构",[426,6153,6155],{"className":838,"code":6154,"language":840,"meta":387,"style":387},"create table TEST_ORDER\n(\n  t_name  VARCHAR2(5),\n  t_value NUMBER(3)\n);\n",[132,6156,6157,6162,6167,6172,6177],{"__ignoreMap":387},[434,6158,6159],{"class":436,"line":437},[434,6160,6161],{},"create table TEST_ORDER\n",[434,6163,6164],{"class":436,"line":388},[434,6165,6166],{},"(\n",[434,6168,6169],{"class":436,"line":396},[434,6170,6171],{},"  t_name  VARCHAR2(5),\n",[434,6173,6174],{"class":436,"line":633},[434,6175,6176],{},"  t_value NUMBER(3)\n",[434,6178,6179],{"class":436,"line":655},[434,6180,6181],{},");\n",[24,6183,6184],{"id":6184},"表数据",[426,6186,6188],{"className":838,"code":6187,"language":840,"meta":387,"style":387},"insert into TEST_ORDER (t_name, t_value) values ('A', 10);\ninsert into TEST_ORDER (t_name, t_value) values ('B', 30);\ninsert into TEST_ORDER (t_name, t_value) values ('C', 20);\ninsert into TEST_ORDER (t_name, t_value) values ('D', 40);\ninsert into TEST_ORDER (t_name, t_value) values ('E', -10);\ninsert into TEST_ORDER (t_name, t_value) values ('F', -30);\ninsert into TEST_ORDER (t_name, t_value) values ('G', -20);\n",[132,6189,6190,6195,6200,6205,6210,6215,6220],{"__ignoreMap":387},[434,6191,6192],{"class":436,"line":437},[434,6193,6194],{},"insert into TEST_ORDER (t_name, t_value) values ('A', 10);\n",[434,6196,6197],{"class":436,"line":388},[434,6198,6199],{},"insert into TEST_ORDER (t_name, t_value) values ('B', 30);\n",[434,6201,6202],{"class":436,"line":396},[434,6203,6204],{},"insert into TEST_ORDER (t_name, t_value) values ('C', 20);\n",[434,6206,6207],{"class":436,"line":633},[434,6208,6209],{},"insert into TEST_ORDER (t_name, t_value) values ('D', 40);\n",[434,6211,6212],{"class":436,"line":655},[434,6213,6214],{},"insert into TEST_ORDER (t_name, t_value) values ('E', -10);\n",[434,6216,6217],{"class":436,"line":663},[434,6218,6219],{},"insert into TEST_ORDER (t_name, t_value) values ('F', -30);\n",[434,6221,6222],{"class":436,"line":674},[434,6223,6224],{},"insert into TEST_ORDER (t_name, t_value) values ('G', -20);\n",[6226,6227,6228,6241],"table",{},[6229,6230,6231],"thead",{},[6232,6233,6234,6238],"tr",{},[6235,6236,6237],"th",{},"T_NAME",[6235,6239,6240],{},"T_VALUE",[6242,6243,6244,6253,6261,6269,6277,6285,6293],"tbody",{},[6232,6245,6246,6250],{},[6247,6248,6249],"td",{},"A",[6247,6251,6252],{},"10",[6232,6254,6255,6258],{},[6247,6256,6257],{},"B",[6247,6259,6260],{},"30",[6232,6262,6263,6266],{},[6247,6264,6265],{},"C",[6247,6267,6268],{},"20",[6232,6270,6271,6274],{},[6247,6272,6273],{},"D",[6247,6275,6276],{},"40",[6232,6278,6279,6282],{},[6247,6280,6281],{},"E",[6247,6283,6284],{},"-10",[6232,6286,6287,6290],{},[6247,6288,6289],{},"F",[6247,6291,6292],{},"-30",[6232,6294,6295,6298],{},[6247,6296,6297],{},"G",[6247,6299,6300],{},"-20",[24,6302,6304],{"id":6303},"先正后负-正数升序-负数降序","先正后负 正数升序 负数降序",[426,6306,6308],{"className":838,"code":6307,"language":840,"meta":387,"style":387},"SELECT T_NAME, T_VALUE\n  FROM TEST_ORDER\n ORDER BY SIGN(T_VALUE) DESC, ABS(T_VALUE) ASC;\n",[132,6309,6310,6315,6320],{"__ignoreMap":387},[434,6311,6312],{"class":436,"line":437},[434,6313,6314],{},"SELECT T_NAME, T_VALUE\n",[434,6316,6317],{"class":436,"line":388},[434,6318,6319],{},"  FROM TEST_ORDER\n",[434,6321,6322],{"class":436,"line":396},[434,6323,6324],{}," ORDER BY SIGN(T_VALUE) DESC, ABS(T_VALUE) ASC;\n",[426,6326,6328],{"className":838,"code":6327,"language":840,"meta":387,"style":387},"SELECT T_NAME,\n       T_VALUE,\n       RANK() OVER(ORDER BY SIGN(T_VALUE) DESC, ABS(T_VALUE) ASC) AS RANKING\n  FROM TEST_ORDER;\n",[132,6329,6330,6335,6340,6345],{"__ignoreMap":387},[434,6331,6332],{"class":436,"line":437},[434,6333,6334],{},"SELECT T_NAME,\n",[434,6336,6337],{"class":436,"line":388},[434,6338,6339],{},"       T_VALUE,\n",[434,6341,6342],{"class":436,"line":396},[434,6343,6344],{},"       RANK() OVER(ORDER BY SIGN(T_VALUE) DESC, ABS(T_VALUE) ASC) AS RANKING\n",[434,6346,6347],{"class":436,"line":633},[434,6348,6349],{},"  FROM TEST_ORDER;\n",[6226,6351,6352,6363],{},[6229,6353,6354],{},[6232,6355,6356,6358,6360],{},[6235,6357,6237],{},[6235,6359,6240],{},[6235,6361,6362],{},"RANKING",[6242,6364,6365,6373,6382,6391,6400,6409,6418],{},[6232,6366,6367,6369,6371],{},[6247,6368,6249],{},[6247,6370,6252],{},[6247,6372,4275],{},[6232,6374,6375,6377,6379],{},[6247,6376,6265],{},[6247,6378,6268],{},[6247,6380,6381],{},"2",[6232,6383,6384,6386,6388],{},[6247,6385,6257],{},[6247,6387,6260],{},[6247,6389,6390],{},"3",[6232,6392,6393,6395,6397],{},[6247,6394,6273],{},[6247,6396,6276],{},[6247,6398,6399],{},"4",[6232,6401,6402,6404,6406],{},[6247,6403,6281],{},[6247,6405,6284],{},[6247,6407,6408],{},"5",[6232,6410,6411,6413,6415],{},[6247,6412,6297],{},[6247,6414,6300],{},[6247,6416,6417],{},"6",[6232,6419,6420,6422,6424],{},[6247,6421,6289],{},[6247,6423,6292],{},[6247,6425,6426],{},"7",[24,6428,6430],{"id":6429},"先正后负-正数降序-负数升序","先正后负 正数降序 负数升序",[426,6432,6434],{"className":838,"code":6433,"language":840,"meta":387,"style":387},"SELECT T_NAME, T_VALUE\n  FROM TEST_ORDER\n ORDER BY SIGN(T_VALUE) DESC, ABS(T_VALUE) DESC;\n",[132,6435,6436,6440,6444],{"__ignoreMap":387},[434,6437,6438],{"class":436,"line":437},[434,6439,6314],{},[434,6441,6442],{"class":436,"line":388},[434,6443,6319],{},[434,6445,6446],{"class":436,"line":396},[434,6447,6448],{}," ORDER BY SIGN(T_VALUE) DESC, ABS(T_VALUE) DESC;\n",[426,6450,6452],{"className":838,"code":6451,"language":840,"meta":387,"style":387},"SELECT T_NAME,\n       T_VALUE,\n       RANK() OVER(ORDER BY SIGN(T_VALUE) DESC, ABS(T_VALUE) DESC) AS RANKING\n  FROM TEST_ORDER;\n",[132,6453,6454,6458,6462,6467],{"__ignoreMap":387},[434,6455,6456],{"class":436,"line":437},[434,6457,6334],{},[434,6459,6460],{"class":436,"line":388},[434,6461,6339],{},[434,6463,6464],{"class":436,"line":396},[434,6465,6466],{},"       RANK() OVER(ORDER BY SIGN(T_VALUE) DESC, ABS(T_VALUE) DESC) AS RANKING\n",[434,6468,6469],{"class":436,"line":633},[434,6470,6349],{},[6226,6472,6473,6483],{},[6229,6474,6475],{},[6232,6476,6477,6479,6481],{},[6235,6478,6237],{},[6235,6480,6240],{},[6235,6482,6362],{},[6242,6484,6485,6493,6501,6509,6517,6525,6533],{},[6232,6486,6487,6489,6491],{},[6247,6488,6273],{},[6247,6490,6276],{},[6247,6492,4275],{},[6232,6494,6495,6497,6499],{},[6247,6496,6257],{},[6247,6498,6260],{},[6247,6500,6381],{},[6232,6502,6503,6505,6507],{},[6247,6504,6265],{},[6247,6506,6268],{},[6247,6508,6390],{},[6232,6510,6511,6513,6515],{},[6247,6512,6249],{},[6247,6514,6252],{},[6247,6516,6399],{},[6232,6518,6519,6521,6523],{},[6247,6520,6289],{},[6247,6522,6292],{},[6247,6524,6408],{},[6232,6526,6527,6529,6531],{},[6247,6528,6297],{},[6247,6530,6300],{},[6247,6532,6417],{},[6232,6534,6535,6537,6539],{},[6247,6536,6281],{},[6247,6538,6284],{},[6247,6540,6426],{},[793,6542,1032],{},{"title":387,"searchDepth":388,"depth":388,"links":6544},[6545,6546,6547,6548],{"id":6151,"depth":388,"text":6151},{"id":6184,"depth":388,"text":6184},{"id":6303,"depth":388,"text":6304},{"id":6429,"depth":388,"text":6430},"2017-09-12","用 SIGN() 把正数和负数分成两组，再各自按绝对值升序或降序排。附 RANK() 版本。",{},"\u002Fposts\u002Foracle-sort-positive-negative",{"title":6146,"description":6550},"posts\u002Foracle-sort-positive-negative",[6556,6557],"Oracle","SQL","9V1MVwXuVwjJ4oNgm5p6skDOU5MF6ROWQUpk-Wwqlak",{"id":6560,"title":6561,"body":6562,"date":8114,"description":8115,"extension":405,"meta":8116,"navigation":407,"path":8117,"seo":8118,"stem":8119,"tags":8120,"__hash__":8124},"posts\u002Fposts\u002Fcentos7-hadoop-spark-cluster-setup.md","CentOS7 下 Hadoop 2.7.3 + Spark 2.1.0 集群环境搭建",{"type":8,"value":6563,"toc":8077},[6564,6566,6615,6619,6675,6677,6698,6702,6715,6780,6784,6788,6808,6812,6815,6828,6837,6840,6852,6856,6899,6903,6934,6938,6958,6961,6965,6968,6984,6987,7021,7025,7028,7054,7058,7070,7073,7097,7101,7106,7203,7208,7223,7228,7255,7260,7313,7318,7403,7408,7424,7491,7496,7568,7572,7588,7592,7595,7599,7608,7612,7621,7625,7640,7644,7647,7659,7663,7675,7678,7701,7704,7708,7748,7753,7768,7832,7836,7848,7852,7855,7859,7868,7872,7874,7878,7881,8043,8045,8074],[24,6565,1831],{"id":1831},[6226,6567,6568,6581],{},[6229,6569,6570],{},[6232,6571,6572,6575,6578],{},[6235,6573,6574],{},"主机名",[6235,6576,6577],{},"ip",[6235,6579,6580],{},"进程",[6242,6582,6583,6594,6605],{},[6232,6584,6585,6588,6591],{},[6247,6586,6587],{},"nn.hadoop.data.example.net",[6247,6589,6590],{},"172.16.156.220",[6247,6592,6593],{},"NameNode、Master、ResourceManager、SecondaryNameNode、JobHistoryServer",[6232,6595,6596,6599,6602],{},[6247,6597,6598],{},"dn1.hadoop.data.example.net",[6247,6600,6601],{},"172.16.156.221",[6247,6603,6604],{},"NodeManager、DataNode、Worker",[6232,6606,6607,6610,6613],{},[6247,6608,6609],{},"dn2.hadoop.data.example.net",[6247,6611,6612],{},"172.16.156.222",[6247,6614,6604],{},[154,6616,6618],{"id":6617},"yum-安装如下包可能有部分包用不到","yum 安装如下包（可能有部分包用不到）",[426,6620,6622],{"className":428,"code":6621,"language":430,"meta":387,"style":387},"yum install pcre-devel openssl openssl-devel openssh-clients htop gcc zlib lrzsz zip unzip vim telnet-server ncurses wget net-tools\n",[132,6623,6624],{"__ignoreMap":387},[434,6625,6626,6628,6630,6633,6636,6639,6642,6645,6648,6651,6654,6657,6660,6663,6666,6669,6672],{"class":436,"line":437},[434,6627,3120],{"class":440},[434,6629,2057],{"class":444},[434,6631,6632],{"class":444}," pcre-devel",[434,6634,6635],{"class":444}," openssl",[434,6637,6638],{"class":444}," openssl-devel",[434,6640,6641],{"class":444}," openssh-clients",[434,6643,6644],{"class":444}," htop",[434,6646,6647],{"class":444}," gcc",[434,6649,6650],{"class":444}," zlib",[434,6652,6653],{"class":444}," lrzsz",[434,6655,6656],{"class":444}," zip",[434,6658,6659],{"class":444}," unzip",[434,6661,6662],{"class":444}," vim",[434,6664,6665],{"class":444}," telnet-server",[434,6667,6668],{"class":444}," ncurses",[434,6670,6671],{"class":444}," wget",[434,6673,6674],{"class":444}," net-tools\n",[154,6676,451],{"id":451},[426,6678,6680],{"className":428,"code":6679,"language":430,"meta":387,"style":387},"systemctl stop firewalld.service\nsystemctl disable firewalld.service\n",[132,6681,6682,6690],{"__ignoreMap":387},[434,6683,6684,6686,6688],{"class":436,"line":437},[434,6685,441],{"class":440},[434,6687,463],{"class":444},[434,6689,448],{"class":444},[434,6691,6692,6694,6696],{"class":436,"line":388},[434,6693,441],{"class":440},[434,6695,514],{"class":444},[434,6697,448],{"class":444},[154,6699,6701],{"id":6700},"配置-hosts-文件","配置 hosts 文件",[426,6703,6705],{"className":428,"code":6704,"language":430,"meta":387,"style":387},"vi \u002Fetc\u002Fhosts\n",[132,6706,6707],{"__ignoreMap":387},[434,6708,6709,6712],{"class":436,"line":437},[434,6710,6711],{"class":440},"vi",[434,6713,6714],{"class":444}," \u002Fetc\u002Fhosts\n",[426,6716,6718],{"className":428,"code":6717,"language":430,"meta":387,"style":387},"127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4\n::1         localhost localhost.localdomain localhost6 localhost6.localdomain6\n\n172.16.156.220  nn.hadoop.data.example.net\n172.16.156.221  dn1.hadoop.data.example.net\n172.16.156.222  dn2.hadoop.data.example.net\n",[132,6719,6720,6737,6755,6759,6766,6773],{"__ignoreMap":387},[434,6721,6722,6725,6728,6731,6734],{"class":436,"line":437},[434,6723,6724],{"class":440},"127.0.0.1",[434,6726,6727],{"class":444},"   localhost",[434,6729,6730],{"class":444}," localhost.localdomain",[434,6732,6733],{"class":444}," localhost4",[434,6735,6736],{"class":444}," localhost4.localdomain4\n",[434,6738,6739,6741,6744,6747,6749,6752],{"class":436,"line":388},[434,6740,2826],{"class":2103},[434,6742,6743],{"class":444},":1",[434,6745,6746],{"class":444},"         localhost",[434,6748,6730],{"class":444},[434,6750,6751],{"class":444}," localhost6",[434,6753,6754],{"class":444}," localhost6.localdomain6\n",[434,6756,6757],{"class":436,"line":396},[434,6758,1213],{"emptyLinePlaceholder":407},[434,6760,6761,6763],{"class":436,"line":633},[434,6762,6590],{"class":440},[434,6764,6765],{"class":444},"  nn.hadoop.data.example.net\n",[434,6767,6768,6770],{"class":436,"line":655},[434,6769,6601],{"class":440},[434,6771,6772],{"class":444},"  dn1.hadoop.data.example.net\n",[434,6774,6775,6777],{"class":436,"line":663},[434,6776,6612],{"class":440},[434,6778,6779],{"class":444},"  dn2.hadoop.data.example.net\n",[24,6781,6783],{"id":6782},"安装-jdk-和-scala","安装 JDK 和 Scala",[154,6785,6787],{"id":6786},"_0创建文件夹","0.创建文件夹",[426,6789,6791],{"className":428,"code":6790,"language":430,"meta":387,"style":387},"mkdir \u002Fapp\u002Fjava\nmkdir \u002Fapp\u002Fscala\n",[132,6792,6793,6801],{"__ignoreMap":387},[434,6794,6795,6798],{"class":436,"line":437},[434,6796,6797],{"class":440},"mkdir",[434,6799,6800],{"class":444}," \u002Fapp\u002Fjava\n",[434,6802,6803,6805],{"class":436,"line":388},[434,6804,6797],{"class":440},[434,6806,6807],{"class":444}," \u002Fapp\u002Fscala\n",[154,6809,6811],{"id":6810},"_1下载","1.下载",[11,6813,6814],{},"下载 JDK",[426,6816,6818],{"className":428,"code":6817,"language":430,"meta":387,"style":387},"wget http:\u002F\u002Fdownload.oracle.com\u002Fotn-pub\u002Fjava\u002Fjdk\u002F8u121-b13\u002Fe9e7ea248e2c4826b92b3f075a80e441\u002Fjdk-8u121-linux-x64.tar.gz\n",[132,6819,6820],{"__ignoreMap":387},[434,6821,6822,6825],{"class":436,"line":437},[434,6823,6824],{"class":440},"wget",[434,6826,6827],{"class":444}," http:\u002F\u002Fdownload.oracle.com\u002Fotn-pub\u002Fjava\u002Fjdk\u002F8u121-b13\u002Fe9e7ea248e2c4826b92b3f075a80e441\u002Fjdk-8u121-linux-x64.tar.gz\n",[11,6829,6830,6831,6836],{},"如果失效，",[347,6832,6835],{"href":6833,"rel":6834},"http:\u002F\u002Fwww.oracle.com\u002Ftechnetwork\u002Fjava\u002Fjavase\u002Fdownloads\u002Findex.html",[351],"点这里下载"," 并上传至服务器",[11,6838,6839],{},"下载 Scala",[426,6841,6843],{"className":428,"code":6842,"language":430,"meta":387,"style":387},"wget http:\u002F\u002Fdownloads.lightbend.com\u002Fscala\u002F2.12.1\u002Fscala-2.12.1.tgz\n",[132,6844,6845],{"__ignoreMap":387},[434,6846,6847,6849],{"class":436,"line":437},[434,6848,6824],{"class":440},[434,6850,6851],{"class":444}," http:\u002F\u002Fdownloads.lightbend.com\u002Fscala\u002F2.12.1\u002Fscala-2.12.1.tgz\n",[154,6853,6855],{"id":6854},"_2移动解压","2.移动&解压",[426,6857,6859],{"className":428,"code":6858,"language":430,"meta":387,"style":387},"mv jdk-8u121-linux-x64.tar.gz \u002Fapp\u002Fjava\ntar -zxvf jdk-8u121-linux-x64.tar.gz\nmv scala-2.12.1.tgz \u002Fapp\u002Fscala\ntar -zxvf scala-2.12.1.tgz\n",[132,6860,6861,6870,6881,6890],{"__ignoreMap":387},[434,6862,6863,6865,6868],{"class":436,"line":437},[434,6864,2112],{"class":440},[434,6866,6867],{"class":444}," jdk-8u121-linux-x64.tar.gz",[434,6869,6800],{"class":444},[434,6871,6872,6875,6878],{"class":436,"line":388},[434,6873,6874],{"class":440},"tar",[434,6876,6877],{"class":444}," -zxvf",[434,6879,6880],{"class":444}," jdk-8u121-linux-x64.tar.gz\n",[434,6882,6883,6885,6888],{"class":436,"line":396},[434,6884,2112],{"class":440},[434,6886,6887],{"class":444}," scala-2.12.1.tgz",[434,6889,6807],{"class":444},[434,6891,6892,6894,6896],{"class":436,"line":633},[434,6893,6874],{"class":440},[434,6895,6877],{"class":444},[434,6897,6898],{"class":444}," scala-2.12.1.tgz\n",[154,6900,6902],{"id":6901},"_3授权","3.授权",[426,6904,6906],{"className":428,"code":6905,"language":430,"meta":387,"style":387},"chmod -R 775 \u002Fapp\u002F\nchown -R hadoop \u002Fapp\u002F\n",[132,6907,6908,6922],{"__ignoreMap":387},[434,6909,6910,6913,6916,6919],{"class":436,"line":437},[434,6911,6912],{"class":440},"chmod",[434,6914,6915],{"class":444}," -R",[434,6917,6918],{"class":1972}," 775",[434,6920,6921],{"class":444}," \u002Fapp\u002F\n",[434,6923,6924,6927,6929,6932],{"class":436,"line":388},[434,6925,6926],{"class":440},"chown",[434,6928,6915],{"class":444},[434,6930,6931],{"class":444}," hadoop",[434,6933,6921],{"class":444},[24,6935,6937],{"id":6936},"创建-hadoop-用户","创建 hadoop 用户",[426,6939,6941],{"className":428,"code":6940,"language":430,"meta":387,"style":387},"useradd hadoop\npasswd hadoop\n",[132,6942,6943,6951],{"__ignoreMap":387},[434,6944,6945,6948],{"class":436,"line":437},[434,6946,6947],{"class":440},"useradd",[434,6949,6950],{"class":444}," hadoop\n",[434,6952,6953,6956],{"class":436,"line":388},[434,6954,6955],{"class":440},"passwd",[434,6957,6950],{"class":444},[11,6959,6960],{},"如无特殊说明 以后均为 hadoop 用户操作",[24,6962,6964],{"id":6963},"ssh-免密登录","SSH 免密登录",[11,6966,6967],{},"生成秘钥：~\u002F.ssh\u002Fid_rsa 和 ~\u002F.ssh\u002Fid_rsa.pub",[426,6969,6971],{"className":428,"code":6970,"language":430,"meta":387,"style":387},"ssh-keygen -t rsa \n",[132,6972,6973],{"__ignoreMap":387},[434,6974,6975,6978,6981],{"class":436,"line":437},[434,6976,6977],{"class":440},"ssh-keygen",[434,6979,6980],{"class":444}," -t",[434,6982,6983],{"class":444}," rsa\n",[11,6985,6986],{},"拷贝公钥到其他机器上",[426,6988,6990],{"className":428,"code":6989,"language":430,"meta":387,"style":387},"ssh-copy-id -i nn.hadoop.data.example.net\nssh-copy-id -i dn1.hadoop.data.example.net\nssh-copy-id -i dn2.hadoop.data.example.net\n",[132,6991,6992,7003,7012],{"__ignoreMap":387},[434,6993,6994,6997,7000],{"class":436,"line":437},[434,6995,6996],{"class":440},"ssh-copy-id",[434,6998,6999],{"class":444}," -i",[434,7001,7002],{"class":444}," nn.hadoop.data.example.net\n",[434,7004,7005,7007,7009],{"class":436,"line":388},[434,7006,6996],{"class":440},[434,7008,6999],{"class":444},[434,7010,7011],{"class":444}," dn1.hadoop.data.example.net\n",[434,7013,7014,7016,7018],{"class":436,"line":396},[434,7015,6996],{"class":440},[434,7017,6999],{"class":444},[434,7019,7020],{"class":444}," dn2.hadoop.data.example.net\n",[24,7022,7024],{"id":7023},"安装-hadoop","安装 Hadoop",[154,7026,6787],{"id":7027},"_0创建文件夹-1",[426,7029,7031],{"className":428,"code":7030,"language":430,"meta":387,"style":387},"mkdir \u002Fapp\u002Fhadoop\u002Fdata\nmkdir \u002Fapp\u002Fhadoop\u002Fname\nmkdir \u002Fapp\u002Fhadoop\u002Ftmp\n",[132,7032,7033,7040,7047],{"__ignoreMap":387},[434,7034,7035,7037],{"class":436,"line":437},[434,7036,6797],{"class":440},[434,7038,7039],{"class":444}," \u002Fapp\u002Fhadoop\u002Fdata\n",[434,7041,7042,7044],{"class":436,"line":388},[434,7043,6797],{"class":440},[434,7045,7046],{"class":444}," \u002Fapp\u002Fhadoop\u002Fname\n",[434,7048,7049,7051],{"class":436,"line":396},[434,7050,6797],{"class":440},[434,7052,7053],{"class":444}," \u002Fapp\u002Fhadoop\u002Ftmp\n",[154,7055,7057],{"id":7056},"_1下载-hadoop","1.下载 hadoop",[426,7059,7061],{"className":428,"code":7060,"language":430,"meta":387,"style":387},"wget http:\u002F\u002Fwww.apache.org\u002Fdyn\u002Fcloser.cgi\u002Fhadoop\u002Fcommon\u002Fhadoop-2.7.3\u002Fhadoop-2.7.3.tar.gz\n",[132,7062,7063],{"__ignoreMap":387},[434,7064,7065,7067],{"class":436,"line":437},[434,7066,6824],{"class":440},[434,7068,7069],{"class":444}," http:\u002F\u002Fwww.apache.org\u002Fdyn\u002Fcloser.cgi\u002Fhadoop\u002Fcommon\u002Fhadoop-2.7.3\u002Fhadoop-2.7.3.tar.gz\n",[154,7071,6855],{"id":7072},"_2移动解压-1",[426,7074,7076],{"className":428,"code":7075,"language":430,"meta":387,"style":387},"mv hadoop-2.7.3.tar.gz \u002Fapp\u002Fhadoop\ntar -zxvf hadoop-2.7.3.tar.gz\n",[132,7077,7078,7088],{"__ignoreMap":387},[434,7079,7080,7082,7085],{"class":436,"line":437},[434,7081,2112],{"class":440},[434,7083,7084],{"class":444}," hadoop-2.7.3.tar.gz",[434,7086,7087],{"class":444}," \u002Fapp\u002Fhadoop\n",[434,7089,7090,7092,7094],{"class":436,"line":388},[434,7091,6874],{"class":440},[434,7093,6877],{"class":444},[434,7095,7096],{"class":444}," hadoop-2.7.3.tar.gz\n",[154,7098,7100],{"id":7099},"_3修改配置文件","3.修改配置文件",[11,7102,7103],{},[41,7104,7105],{},"\u002Fetc\u002Fprofile（root 权限）",[426,7107,7109],{"className":428,"code":7108,"language":430,"meta":387,"style":387},"HADOOP_HOME=\u002Fapp\u002Fhadoop\u002Fhadoop-2.7.3\nexport HADOOP_INSTALL=$HADOOP_HOME\nexport HADOOP_MAPRED_HOME=$HADOOP_HOME\nexport HADOOP_COMMON_HOME=$HADOOP_HOME\nexport HADOOP_HDFS_HOME=$HADOOP_HOME\nexport YARN_HOME=$HADOOP_HOME\nexport HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME\u002Flib\u002Fnative\nexport PATH=$PATH:$HADOOP_HOME\u002Fsbin:$HADOOP_HOME\u002Fbin\n",[132,7110,7111,7121,7135,7146,7157,7168,7179,7191],{"__ignoreMap":387},[434,7112,7113,7116,7118],{"class":436,"line":437},[434,7114,7115],{"class":1910},"HADOOP_HOME",[434,7117,4630],{"class":645},[434,7119,7120],{"class":444},"\u002Fapp\u002Fhadoop\u002Fhadoop-2.7.3\n",[434,7122,7123,7127,7130,7132],{"class":436,"line":388},[434,7124,7126],{"class":7125},"spNyl","export",[434,7128,7129],{"class":1910}," HADOOP_INSTALL",[434,7131,4630],{"class":645},[434,7133,7134],{"class":1910},"$HADOOP_HOME\n",[434,7136,7137,7139,7142,7144],{"class":436,"line":396},[434,7138,7126],{"class":7125},[434,7140,7141],{"class":1910}," HADOOP_MAPRED_HOME",[434,7143,4630],{"class":645},[434,7145,7134],{"class":1910},[434,7147,7148,7150,7153,7155],{"class":436,"line":633},[434,7149,7126],{"class":7125},[434,7151,7152],{"class":1910}," HADOOP_COMMON_HOME",[434,7154,4630],{"class":645},[434,7156,7134],{"class":1910},[434,7158,7159,7161,7164,7166],{"class":436,"line":655},[434,7160,7126],{"class":7125},[434,7162,7163],{"class":1910}," HADOOP_HDFS_HOME",[434,7165,4630],{"class":645},[434,7167,7134],{"class":1910},[434,7169,7170,7172,7175,7177],{"class":436,"line":663},[434,7171,7126],{"class":7125},[434,7173,7174],{"class":1910}," YARN_HOME",[434,7176,4630],{"class":645},[434,7178,7134],{"class":1910},[434,7180,7181,7183,7186,7188],{"class":436,"line":674},[434,7182,7126],{"class":7125},[434,7184,7185],{"class":1910}," HADOOP_COMMON_LIB_NATIVE_DIR",[434,7187,4630],{"class":645},[434,7189,7190],{"class":1910},"$HADOOP_HOME\u002Flib\u002Fnative\n",[434,7192,7193,7195,7198,7200],{"class":436,"line":680},[434,7194,7126],{"class":7125},[434,7196,7197],{"class":1910}," PATH",[434,7199,4630],{"class":645},[434,7201,7202],{"class":1910},"$PATH:$HADOOP_HOME\u002Fsbin:$HADOOP_HOME\u002Fbin\n",[11,7204,7205],{},[41,7206,7207],{},"slaves",[426,7209,7211],{"className":428,"code":7210,"language":430,"meta":387,"style":387},"dn1.hadoop.data.example.net\ndn2.hadoop.data.example.net\n",[132,7212,7213,7218],{"__ignoreMap":387},[434,7214,7215],{"class":436,"line":437},[434,7216,7217],{"class":440},"dn1.hadoop.data.example.net\n",[434,7219,7220],{"class":436,"line":388},[434,7221,7222],{"class":440},"dn2.hadoop.data.example.net\n",[11,7224,7225],{},[41,7226,7227],{},"hadoop-env.sh",[426,7229,7231],{"className":428,"code":7230,"language":430,"meta":387,"style":387},"# export JAVA_HOME=${JAVA_HOME}\n改为\nexport JAVA_HOME=\u002Fapp\u002Fjava\u002Fjdk1.8.0_121\u002F\n",[132,7232,7233,7238,7243],{"__ignoreMap":387},[434,7234,7235],{"class":436,"line":437},[434,7236,7237],{"class":2540},"# export JAVA_HOME=${JAVA_HOME}\n",[434,7239,7240],{"class":436,"line":388},[434,7241,7242],{"class":440},"改为\n",[434,7244,7245,7247,7250,7252],{"class":436,"line":396},[434,7246,7126],{"class":7125},[434,7248,7249],{"class":1910}," JAVA_HOME",[434,7251,4630],{"class":645},[434,7253,7254],{"class":1910},"\u002Fapp\u002Fjava\u002Fjdk1.8.0_121\u002F\n",[11,7256,7257],{},[41,7258,7259],{},"core-site.xml",[426,7261,7263],{"className":6064,"code":7262,"language":6066,"meta":387,"style":387},"\u003Cconfiguration>\n    \u003Cproperty>\n    \u003Cname>fs.defaultFS\u003C\u002Fname>\n    \u003Cvalue>hdfs:\u002F\u002Fnn.hadoop.data.example.net:9000\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n    \u003Cproperty>\n    \u003Cname>hadoop.tmp.dir\u003C\u002Fname>\n    \u003Cvalue>\u002Fapp\u002Fhadoop\u002Ftmp\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\u003C\u002Fconfiguration>\n",[132,7264,7265,7270,7275,7280,7285,7290,7294,7299,7304,7308],{"__ignoreMap":387},[434,7266,7267],{"class":436,"line":437},[434,7268,7269],{},"\u003Cconfiguration>\n",[434,7271,7272],{"class":436,"line":388},[434,7273,7274],{},"    \u003Cproperty>\n",[434,7276,7277],{"class":436,"line":396},[434,7278,7279],{},"    \u003Cname>fs.defaultFS\u003C\u002Fname>\n",[434,7281,7282],{"class":436,"line":633},[434,7283,7284],{},"    \u003Cvalue>hdfs:\u002F\u002Fnn.hadoop.data.example.net:9000\u003C\u002Fvalue>\n",[434,7286,7287],{"class":436,"line":655},[434,7288,7289],{},"    \u003C\u002Fproperty>\n",[434,7291,7292],{"class":436,"line":663},[434,7293,7274],{},[434,7295,7296],{"class":436,"line":674},[434,7297,7298],{},"    \u003Cname>hadoop.tmp.dir\u003C\u002Fname>\n",[434,7300,7301],{"class":436,"line":680},[434,7302,7303],{},"    \u003Cvalue>\u002Fapp\u002Fhadoop\u002Ftmp\u003C\u002Fvalue>\n",[434,7305,7306],{"class":436,"line":694},[434,7307,7289],{},[434,7309,7310],{"class":436,"line":708},[434,7311,7312],{},"\u003C\u002Fconfiguration>\n",[11,7314,7315],{},[41,7316,7317],{},"hdfs-site.xml",[426,7319,7321],{"className":6064,"code":7320,"language":6066,"meta":387,"style":387},"\u003Cconfiguration>\n    \u003Cproperty>\n        \u003Cname>dfs.namenode.secondary.http-address\u003C\u002Fname>\n        \u003Cvalue>nn.hadoop.data.example.net:50090\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n    \u003Cproperty>\n        \u003Cname>dfs.namenode.name.dir\u003C\u002Fname>\n        \u003Cvalue>\u002Fapp\u002Fhadoop\u002Fname\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n    \u003Cproperty>\n        \u003Cname>dfs.replication\u003C\u002Fname>\n        \u003Cvalue>1\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n    \u003Cproperty>\n        \u003Cname>dfs.datanode.data.dir\u003C\u002Fname>\n        \u003Cvalue>\u002Fapp\u002Fhadoop\u002Fdata\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\u003C\u002Fconfiguration>\n",[132,7322,7323,7327,7331,7336,7341,7345,7349,7354,7359,7363,7367,7372,7377,7381,7385,7390,7395,7399],{"__ignoreMap":387},[434,7324,7325],{"class":436,"line":437},[434,7326,7269],{},[434,7328,7329],{"class":436,"line":388},[434,7330,7274],{},[434,7332,7333],{"class":436,"line":396},[434,7334,7335],{},"        \u003Cname>dfs.namenode.secondary.http-address\u003C\u002Fname>\n",[434,7337,7338],{"class":436,"line":633},[434,7339,7340],{},"        \u003Cvalue>nn.hadoop.data.example.net:50090\u003C\u002Fvalue>\n",[434,7342,7343],{"class":436,"line":655},[434,7344,7289],{},[434,7346,7347],{"class":436,"line":663},[434,7348,7274],{},[434,7350,7351],{"class":436,"line":674},[434,7352,7353],{},"        \u003Cname>dfs.namenode.name.dir\u003C\u002Fname>\n",[434,7355,7356],{"class":436,"line":680},[434,7357,7358],{},"        \u003Cvalue>\u002Fapp\u002Fhadoop\u002Fname\u003C\u002Fvalue>\n",[434,7360,7361],{"class":436,"line":694},[434,7362,7289],{},[434,7364,7365],{"class":436,"line":708},[434,7366,7274],{},[434,7368,7369],{"class":436,"line":722},[434,7370,7371],{},"        \u003Cname>dfs.replication\u003C\u002Fname>\n",[434,7373,7374],{"class":436,"line":900},[434,7375,7376],{},"        \u003Cvalue>1\u003C\u002Fvalue>\n",[434,7378,7379],{"class":436,"line":973},[434,7380,7289],{},[434,7382,7383],{"class":436,"line":979},[434,7384,7274],{},[434,7386,7387],{"class":436,"line":985},[434,7388,7389],{},"        \u003Cname>dfs.datanode.data.dir\u003C\u002Fname>\n",[434,7391,7392],{"class":436,"line":991},[434,7393,7394],{},"        \u003Cvalue>\u002Fapp\u002Fhadoop\u002Fdata\u003C\u002Fvalue>\n",[434,7396,7397],{"class":436,"line":997},[434,7398,7289],{},[434,7400,7401],{"class":436,"line":1003},[434,7402,7312],{},[11,7404,7405],{},[41,7406,7407],{},"mapred-site.xml",[426,7409,7411],{"className":428,"code":7410,"language":430,"meta":387,"style":387},"cp mapred-site.xml.template mapred-site.xml\n",[132,7412,7413],{"__ignoreMap":387},[434,7414,7415,7418,7421],{"class":436,"line":437},[434,7416,7417],{"class":440},"cp",[434,7419,7420],{"class":444}," mapred-site.xml.template",[434,7422,7423],{"class":444}," mapred-site.xml\n",[426,7425,7427],{"className":6064,"code":7426,"language":6066,"meta":387,"style":387},"\u003Cconfiguration>\n    \u003Cproperty>\n        \u003Cname>mapreduce.framework.name\u003C\u002Fname>\n        \u003Cvalue>yarn\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n    \u003Cproperty>\n        \u003Cname>mapreduce.jobhistory.address\u003C\u002Fname>\n        \u003Cvalue>nn.hadoop.data.example.net:10020\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n    \u003Cproperty>\n        \u003Cname>mapreduce.jobhistory.webapp.address\u003C\u002Fname>\n        \u003Cvalue>nn.hadoop.data.example.net:19888\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\u003C\u002Fconfiguration>\n",[132,7428,7429,7433,7437,7442,7447,7451,7455,7460,7465,7469,7473,7478,7483,7487],{"__ignoreMap":387},[434,7430,7431],{"class":436,"line":437},[434,7432,7269],{},[434,7434,7435],{"class":436,"line":388},[434,7436,7274],{},[434,7438,7439],{"class":436,"line":396},[434,7440,7441],{},"        \u003Cname>mapreduce.framework.name\u003C\u002Fname>\n",[434,7443,7444],{"class":436,"line":633},[434,7445,7446],{},"        \u003Cvalue>yarn\u003C\u002Fvalue>\n",[434,7448,7449],{"class":436,"line":655},[434,7450,7289],{},[434,7452,7453],{"class":436,"line":663},[434,7454,7274],{},[434,7456,7457],{"class":436,"line":674},[434,7458,7459],{},"        \u003Cname>mapreduce.jobhistory.address\u003C\u002Fname>\n",[434,7461,7462],{"class":436,"line":680},[434,7463,7464],{},"        \u003Cvalue>nn.hadoop.data.example.net:10020\u003C\u002Fvalue>\n",[434,7466,7467],{"class":436,"line":694},[434,7468,7289],{},[434,7470,7471],{"class":436,"line":708},[434,7472,7274],{},[434,7474,7475],{"class":436,"line":722},[434,7476,7477],{},"        \u003Cname>mapreduce.jobhistory.webapp.address\u003C\u002Fname>\n",[434,7479,7480],{"class":436,"line":900},[434,7481,7482],{},"        \u003Cvalue>nn.hadoop.data.example.net:19888\u003C\u002Fvalue>\n",[434,7484,7485],{"class":436,"line":973},[434,7486,7289],{},[434,7488,7489],{"class":436,"line":979},[434,7490,7312],{},[11,7492,7493],{},[41,7494,7495],{},"yarn-site.xml",[426,7497,7499],{"className":6064,"code":7498,"language":6066,"meta":387,"style":387},"\u003Cconfiguration>\n\u003C!-- Site specific YARN configuration properties -->\n    \u003Cproperty>\n        \u003Cname>yarn.resourcemanager.hostname\u003C\u002Fname>\n        \u003Cvalue>nn.hadoop.data.example.net\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n    \u003Cproperty>\n        \u003Cname>yarn.nodemanager.aux-services\u003C\u002Fname>\n        \u003Cvalue>mapreduce_shuffle\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n    \u003Cproperty>\n         \u003Cname>yarn.nodemanager.aux-services.mapreduce.shuffle.class\u003C\u002Fname>\n         \u003Cvalue>org.apache.hadoop.mapred.ShuffleHandler\u003C\u002Fvalue>\n    \u003C\u002Fproperty>\n\u003C\u002Fconfiguration>\n",[132,7500,7501,7505,7510,7514,7519,7524,7528,7532,7537,7542,7546,7550,7555,7560,7564],{"__ignoreMap":387},[434,7502,7503],{"class":436,"line":437},[434,7504,7269],{},[434,7506,7507],{"class":436,"line":388},[434,7508,7509],{},"\u003C!-- Site specific YARN configuration properties -->\n",[434,7511,7512],{"class":436,"line":396},[434,7513,7274],{},[434,7515,7516],{"class":436,"line":633},[434,7517,7518],{},"        \u003Cname>yarn.resourcemanager.hostname\u003C\u002Fname>\n",[434,7520,7521],{"class":436,"line":655},[434,7522,7523],{},"        \u003Cvalue>nn.hadoop.data.example.net\u003C\u002Fvalue>\n",[434,7525,7526],{"class":436,"line":663},[434,7527,7289],{},[434,7529,7530],{"class":436,"line":674},[434,7531,7274],{},[434,7533,7534],{"class":436,"line":680},[434,7535,7536],{},"        \u003Cname>yarn.nodemanager.aux-services\u003C\u002Fname>\n",[434,7538,7539],{"class":436,"line":694},[434,7540,7541],{},"        \u003Cvalue>mapreduce_shuffle\u003C\u002Fvalue>\n",[434,7543,7544],{"class":436,"line":708},[434,7545,7289],{},[434,7547,7548],{"class":436,"line":722},[434,7549,7274],{},[434,7551,7552],{"class":436,"line":900},[434,7553,7554],{},"         \u003Cname>yarn.nodemanager.aux-services.mapreduce.shuffle.class\u003C\u002Fname>\n",[434,7556,7557],{"class":436,"line":973},[434,7558,7559],{},"         \u003Cvalue>org.apache.hadoop.mapred.ShuffleHandler\u003C\u002Fvalue>\n",[434,7561,7562],{"class":436,"line":979},[434,7563,7289],{},[434,7565,7566],{"class":436,"line":985},[434,7567,7312],{},[154,7569,7571],{"id":7570},"_4格式化-namenode","4.格式化 namenode",[426,7573,7575],{"className":428,"code":7574,"language":430,"meta":387,"style":387},"hadoop namenode -format\n",[132,7576,7577],{"__ignoreMap":387},[434,7578,7579,7582,7585],{"class":436,"line":437},[434,7580,7581],{"class":440},"hadoop",[434,7583,7584],{"class":444}," namenode",[434,7586,7587],{"class":444}," -format\n",[154,7589,7591],{"id":7590},"_5复制文件到其他机器","5.复制文件到其他机器",[11,7593,7594],{},"将 \u002Fapp\u002Fhadoop（包括 data、name、tmp 和配置好的 hadoop）复制到其他机器。",[154,7596,7598],{"id":7597},"_6启动-dfs","6.启动 dfs",[426,7600,7602],{"className":428,"code":7601,"language":430,"meta":387,"style":387},"start-dfs.sh\n",[132,7603,7604],{"__ignoreMap":387},[434,7605,7606],{"class":436,"line":437},[434,7607,7601],{"class":440},[154,7609,7611],{"id":7610},"_7启动-yarn","7.启动 yarn",[426,7613,7615],{"className":428,"code":7614,"language":430,"meta":387,"style":387},"start-yarn.sh\n",[132,7616,7617],{"__ignoreMap":387},[434,7618,7619],{"class":436,"line":437},[434,7620,7614],{"class":440},[154,7622,7624],{"id":7623},"_8启动-jobhistory","8.启动 jobhistory",[426,7626,7628],{"className":428,"code":7627,"language":430,"meta":387,"style":387},"mr-jobhistory-daemon.sh start historyserver\n",[132,7629,7630],{"__ignoreMap":387},[434,7631,7632,7635,7637],{"class":436,"line":437},[434,7633,7634],{"class":440},"mr-jobhistory-daemon.sh",[434,7636,445],{"class":444},[434,7638,7639],{"class":444}," historyserver\n",[24,7641,7643],{"id":7642},"安装-spark2","安装 Spark2",[154,7645,6787],{"id":7646},"_0创建文件夹-2",[426,7648,7650],{"className":428,"code":7649,"language":430,"meta":387,"style":387},"mkdir \u002Fapp\u002Fspark\n",[132,7651,7652],{"__ignoreMap":387},[434,7653,7654,7656],{"class":436,"line":437},[434,7655,6797],{"class":440},[434,7657,7658],{"class":444}," \u002Fapp\u002Fspark\n",[154,7660,7662],{"id":7661},"_1下载-spark2","1.下载 Spark2",[426,7664,7666],{"className":428,"code":7665,"language":430,"meta":387,"style":387},"wget http:\u002F\u002Fwww.apache.org\u002Fdyn\u002Fcloser.lua\u002Fspark\u002Fspark-2.1.0\u002Fspark-2.1.0-bin-hadoop2.7.tgz\n",[132,7667,7668],{"__ignoreMap":387},[434,7669,7670,7672],{"class":436,"line":437},[434,7671,6824],{"class":440},[434,7673,7674],{"class":444}," http:\u002F\u002Fwww.apache.org\u002Fdyn\u002Fcloser.lua\u002Fspark\u002Fspark-2.1.0\u002Fspark-2.1.0-bin-hadoop2.7.tgz\n",[154,7676,6855],{"id":7677},"_2移动解压-2",[426,7679,7681],{"className":428,"code":7680,"language":430,"meta":387,"style":387},"mv spark-2.1.0-bin-hadoop2.7.tgz \u002Fapp\u002Fspark\ntar -zxvf spark-2.1.0-bin-hadoop2.7.tgz\n",[132,7682,7683,7692],{"__ignoreMap":387},[434,7684,7685,7687,7690],{"class":436,"line":437},[434,7686,2112],{"class":440},[434,7688,7689],{"class":444}," spark-2.1.0-bin-hadoop2.7.tgz",[434,7691,7658],{"class":444},[434,7693,7694,7696,7698],{"class":436,"line":388},[434,7695,6874],{"class":440},[434,7697,6877],{"class":444},[434,7699,7700],{"class":444}," spark-2.1.0-bin-hadoop2.7.tgz\n",[154,7702,7100],{"id":7703},"_3修改配置文件-1",[11,7705,7706],{},[41,7707,7105],{},[426,7709,7711],{"className":428,"code":7710,"language":430,"meta":387,"style":387},"export SPARK_HOME=\u002Fapp\u002Fspark\u002Fspark-2.1.0-bin-hadoop2.7\nexport PATH=\"$SPARK_HOME\u002Fbin:$PATH\"\n",[132,7712,7713,7725],{"__ignoreMap":387},[434,7714,7715,7717,7720,7722],{"class":436,"line":437},[434,7716,7126],{"class":7125},[434,7718,7719],{"class":1910}," SPARK_HOME",[434,7721,4630],{"class":645},[434,7723,7724],{"class":1910},"\u002Fapp\u002Fspark\u002Fspark-2.1.0-bin-hadoop2.7\n",[434,7726,7727,7729,7731,7733,7736,7739,7742,7745],{"class":436,"line":388},[434,7728,7126],{"class":7125},[434,7730,7197],{"class":1910},[434,7732,4630],{"class":645},[434,7734,7735],{"class":645},"\"",[434,7737,7738],{"class":1910},"$SPARK_HOME",[434,7740,7741],{"class":444},"\u002Fbin:",[434,7743,7744],{"class":1910},"$PATH",[434,7746,7747],{"class":645},"\"\n",[11,7749,7750],{},[41,7751,7752],{},"spark-env.sh",[426,7754,7756],{"className":428,"code":7755,"language":430,"meta":387,"style":387},"cp spark-env.sh.template spark-env.sh\n",[132,7757,7758],{"__ignoreMap":387},[434,7759,7760,7762,7765],{"class":436,"line":437},[434,7761,7417],{"class":440},[434,7763,7764],{"class":444}," spark-env.sh.template",[434,7766,7767],{"class":444}," spark-env.sh\n",[426,7769,7771],{"className":428,"code":7770,"language":430,"meta":387,"style":387},"export SCALA_HOME=\u002Fapp\u002Fscala\u002Fscala-2.12.1\nexport JAVA_HOME=\u002Fapp\u002Fjava\u002Fjdk1.8.0_121\nexport SPARK_MASTER_IP=nn.hadoop.data.easydebug.net\nexport SPARK_WORKER_MEMORY=1g\nexport HADOOP_CONF_DIR=\u002Fapp\u002Fhadoop\u002Fhadoop-2.7.3\u002Fetc\u002Fhadoop\n",[132,7772,7773,7785,7796,7808,7820],{"__ignoreMap":387},[434,7774,7775,7777,7780,7782],{"class":436,"line":437},[434,7776,7126],{"class":7125},[434,7778,7779],{"class":1910}," SCALA_HOME",[434,7781,4630],{"class":645},[434,7783,7784],{"class":1910},"\u002Fapp\u002Fscala\u002Fscala-2.12.1\n",[434,7786,7787,7789,7791,7793],{"class":436,"line":388},[434,7788,7126],{"class":7125},[434,7790,7249],{"class":1910},[434,7792,4630],{"class":645},[434,7794,7795],{"class":1910},"\u002Fapp\u002Fjava\u002Fjdk1.8.0_121\n",[434,7797,7798,7800,7803,7805],{"class":436,"line":396},[434,7799,7126],{"class":7125},[434,7801,7802],{"class":1910}," SPARK_MASTER_IP",[434,7804,4630],{"class":645},[434,7806,7807],{"class":1910},"nn.hadoop.data.easydebug.net\n",[434,7809,7810,7812,7815,7817],{"class":436,"line":633},[434,7811,7126],{"class":7125},[434,7813,7814],{"class":1910}," SPARK_WORKER_MEMORY",[434,7816,4630],{"class":645},[434,7818,7819],{"class":1910},"1g\n",[434,7821,7822,7824,7827,7829],{"class":436,"line":655},[434,7823,7126],{"class":7125},[434,7825,7826],{"class":1910}," HADOOP_CONF_DIR",[434,7828,4630],{"class":645},[434,7830,7831],{"class":1910},"\u002Fapp\u002Fhadoop\u002Fhadoop-2.7.3\u002Fetc\u002Fhadoop\n",[11,7833,7834],{},[41,7835,7207],{},[426,7837,7838],{"className":428,"code":7210,"language":430,"meta":387,"style":387},[132,7839,7840,7844],{"__ignoreMap":387},[434,7841,7842],{"class":436,"line":437},[434,7843,7217],{"class":440},[434,7845,7846],{"class":436,"line":388},[434,7847,7222],{"class":440},[154,7849,7851],{"id":7850},"_4复制文件到其他机器","4.复制文件到其他机器",[11,7853,7854],{},"将 \u002Fapp\u002Fspark 复制到其他机器。",[154,7856,7858],{"id":7857},"_5启动-spark","5.启动 Spark",[426,7860,7862],{"className":428,"code":7861,"language":430,"meta":387,"style":387},"\u002Fapp\u002Fspark\u002Fspark-2.1.0-bin-hadoop2.7\u002Fsbin\u002Fstart-all.sh\n",[132,7863,7864],{"__ignoreMap":387},[434,7865,7866],{"class":436,"line":437},[434,7867,7861],{"class":440},[24,7869,7871],{"id":7870},"安装完成-_","安装完成 ^_^",[1841,7873],{},[154,7875,7877],{"id":7876},"因为系统变量改了几次最后贴一下完整的","因为系统变量改了几次，最后贴一下完整的",[11,7879,7880],{},"其实可以在配置前直接贴进去。",[426,7882,7884],{"className":428,"code":7883,"language":430,"meta":387,"style":387},"export JAVA_HOME=\u002Fapp\u002Fjava\u002Fjdk1.8.0_121\nexport SCALA_HOME=\u002Fapp\u002Fscala\u002Fscala-2.12.1\nexport PATH=$JAVA_HOME\u002Fbin:$SCALA_HOME\u002Fbin:$PATH\nexport CLASSPATH=.:$JAVA_HOME\u002Flib\u002Fdt.jar:$JAVA_HOME\u002Flib\u002Ftools.jar\n\nHADOOP_HOME=\u002Fapp\u002Fhadoop\u002Fhadoop-2.7.3\nexport HADOOP_INSTALL=$HADOOP_HOME\nexport HADOOP_MAPRED_HOME=$HADOOP_HOME\nexport HADOOP_COMMON_HOME=$HADOOP_HOME\nexport HADOOP_HDFS_HOME=$HADOOP_HOME\nexport YARN_HOME=$HADOOP_HOME\nexport HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME\u002Flib\u002Fnative\nexport PATH=$PATH:$HADOOP_HOME\u002Fsbin:$HADOOP_HOME\u002Fbin\n\nexport SPARK_HOME=\u002Fapp\u002Fspark\u002Fspark-2.1.0-bin-hadoop2.7\nexport PATH=\"$SPARK_HOME\u002Fbin:$PATH\"\n",[132,7885,7886,7896,7906,7917,7929,7933,7941,7951,7961,7971,7981,7991,8001,8011,8015,8025],{"__ignoreMap":387},[434,7887,7888,7890,7892,7894],{"class":436,"line":437},[434,7889,7126],{"class":7125},[434,7891,7249],{"class":1910},[434,7893,4630],{"class":645},[434,7895,7795],{"class":1910},[434,7897,7898,7900,7902,7904],{"class":436,"line":388},[434,7899,7126],{"class":7125},[434,7901,7779],{"class":1910},[434,7903,4630],{"class":645},[434,7905,7784],{"class":1910},[434,7907,7908,7910,7912,7914],{"class":436,"line":396},[434,7909,7126],{"class":7125},[434,7911,7197],{"class":1910},[434,7913,4630],{"class":645},[434,7915,7916],{"class":1910},"$JAVA_HOME\u002Fbin:$SCALA_HOME\u002Fbin:$PATH\n",[434,7918,7919,7921,7924,7926],{"class":436,"line":633},[434,7920,7126],{"class":7125},[434,7922,7923],{"class":1910}," CLASSPATH",[434,7925,4630],{"class":645},[434,7927,7928],{"class":1910},".:$JAVA_HOME\u002Flib\u002Fdt.jar:$JAVA_HOME\u002Flib\u002Ftools.jar\n",[434,7930,7931],{"class":436,"line":655},[434,7932,1213],{"emptyLinePlaceholder":407},[434,7934,7935,7937,7939],{"class":436,"line":663},[434,7936,7115],{"class":1910},[434,7938,4630],{"class":645},[434,7940,7120],{"class":444},[434,7942,7943,7945,7947,7949],{"class":436,"line":674},[434,7944,7126],{"class":7125},[434,7946,7129],{"class":1910},[434,7948,4630],{"class":645},[434,7950,7134],{"class":1910},[434,7952,7953,7955,7957,7959],{"class":436,"line":680},[434,7954,7126],{"class":7125},[434,7956,7141],{"class":1910},[434,7958,4630],{"class":645},[434,7960,7134],{"class":1910},[434,7962,7963,7965,7967,7969],{"class":436,"line":694},[434,7964,7126],{"class":7125},[434,7966,7152],{"class":1910},[434,7968,4630],{"class":645},[434,7970,7134],{"class":1910},[434,7972,7973,7975,7977,7979],{"class":436,"line":708},[434,7974,7126],{"class":7125},[434,7976,7163],{"class":1910},[434,7978,4630],{"class":645},[434,7980,7134],{"class":1910},[434,7982,7983,7985,7987,7989],{"class":436,"line":722},[434,7984,7126],{"class":7125},[434,7986,7174],{"class":1910},[434,7988,4630],{"class":645},[434,7990,7134],{"class":1910},[434,7992,7993,7995,7997,7999],{"class":436,"line":900},[434,7994,7126],{"class":7125},[434,7996,7185],{"class":1910},[434,7998,4630],{"class":645},[434,8000,7190],{"class":1910},[434,8002,8003,8005,8007,8009],{"class":436,"line":973},[434,8004,7126],{"class":7125},[434,8006,7197],{"class":1910},[434,8008,4630],{"class":645},[434,8010,7202],{"class":1910},[434,8012,8013],{"class":436,"line":979},[434,8014,1213],{"emptyLinePlaceholder":407},[434,8016,8017,8019,8021,8023],{"class":436,"line":985},[434,8018,7126],{"class":7125},[434,8020,7719],{"class":1910},[434,8022,4630],{"class":645},[434,8024,7724],{"class":1910},[434,8026,8027,8029,8031,8033,8035,8037,8039,8041],{"class":436,"line":991},[434,8028,7126],{"class":7125},[434,8030,7197],{"class":1910},[434,8032,4630],{"class":645},[434,8034,7735],{"class":645},[434,8036,7738],{"class":1910},[434,8038,7741],{"class":444},[434,8040,7744],{"class":1910},[434,8042,7747],{"class":645},[1841,8044],{},[5203,8046,8047,8050,8058,8066],{},[11,8048,8049],{},"参考文章",[11,8051,8052,8053],{},"CentOS 6.5 hadoop 2.7.3 集群环境搭建\n",[347,8054,8057],{"href":8055,"rel":8056},"http:\u002F\u002Fblog.csdn.net\u002Fmxxlevel\u002Farticle\u002Fdetails\u002F52653086",[351],"blog.csdn.net\u002Fmxxlevel\u002Farticle\u002Fdetails\u002F52653086",[11,8059,8060,8061],{},"Spark修炼之道（进阶篇）——Spark 入门到精通：第一节 Spark 1.5.0 集群搭建\n",[347,8062,8065],{"href":8063,"rel":8064},"https:\u002F\u002Fyq.aliyun.com\u002Farticles\u002F60309?spm=5176.8251999.569296.66.0H8Bal",[351],"yq.aliyun.com\u002Farticles\u002F60309",[11,8067,8068,8069],{},"Hadoop2.7.3+Spark2.1.0 完全分布式环境 搭建全过程\n",[347,8070,8073],{"href":8071,"rel":8072},"http:\u002F\u002Fwww.cnblogs.com\u002Fpurstar\u002Fp\u002F6293605.html",[351],"cnblogs.com\u002Fpurstar\u002Fp\u002F6293605.html",[793,8075,8076],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":387,"searchDepth":388,"depth":388,"links":8078},[8079,8084,8090,8091,8092,8103,8111],{"id":1831,"depth":388,"text":1831,"children":8080},[8081,8082,8083],{"id":6617,"depth":396,"text":6618},{"id":451,"depth":396,"text":451},{"id":6700,"depth":396,"text":6701},{"id":6782,"depth":388,"text":6783,"children":8085},[8086,8087,8088,8089],{"id":6786,"depth":396,"text":6787},{"id":6810,"depth":396,"text":6811},{"id":6854,"depth":396,"text":6855},{"id":6901,"depth":396,"text":6902},{"id":6936,"depth":388,"text":6937},{"id":6963,"depth":388,"text":6964},{"id":7023,"depth":388,"text":7024,"children":8093},[8094,8095,8096,8097,8098,8099,8100,8101,8102],{"id":7027,"depth":396,"text":6787},{"id":7056,"depth":396,"text":7057},{"id":7072,"depth":396,"text":6855},{"id":7099,"depth":396,"text":7100},{"id":7570,"depth":396,"text":7571},{"id":7590,"depth":396,"text":7591},{"id":7597,"depth":396,"text":7598},{"id":7610,"depth":396,"text":7611},{"id":7623,"depth":396,"text":7624},{"id":7642,"depth":388,"text":7643,"children":8104},[8105,8106,8107,8108,8109,8110],{"id":7646,"depth":396,"text":6787},{"id":7661,"depth":396,"text":7662},{"id":7677,"depth":396,"text":6855},{"id":7703,"depth":396,"text":7100},{"id":7850,"depth":396,"text":7851},{"id":7857,"depth":396,"text":7858},{"id":7870,"depth":388,"text":7871,"children":8112},[8113],{"id":7876,"depth":396,"text":7877},"2017-04-03","1 个 NameNode + 2 个 DataNode 的最小集群从零搭起：装 JDK\u002FScala、配 SSH 免密、改 Hadoop 和 Spark 的各个配置文件，到启动 dfs \u002F yarn \u002F jobhistory \u002F spark。",{},"\u002Fposts\u002Fcentos7-hadoop-spark-cluster-setup",{"title":6561,"description":8115},"posts\u002Fcentos7-hadoop-spark-cluster-setup",[8121,8122,8123,816],"Hadoop","Spark","大数据","l1G-4Zt0wIq9pgZ5Nnet1mvOeQBaa2Cqo3BLnROXsFQ",{"id":8126,"title":8127,"body":8128,"date":8257,"description":8258,"extension":405,"meta":8259,"navigation":407,"path":8260,"seo":8261,"stem":8262,"tags":8263,"__hash__":8267},"posts\u002Fposts\u002Fwindows-install-facebook-prophet.md","Facebook 开源预测工具 Prophet 安装方法",{"type":8,"value":8129,"toc":8249},[8130,8139,8141,8143,8153,8157,8167,8171,8179,8183,8213,8216,8218,8221,8226,8231,8236,8247],[11,8131,8132,8133,8138],{},"最近研究看到一篇介绍 ",[347,8134,8137],{"href":8135,"rel":8136},"http:\u002F\u002Fmp.weixin.qq.com\u002Fs\u002F6yZRKbH0GYvqHwCDmpL-Uw",[351],"facebook 开源的大规模预测框架 Prophet"," 的文章，折腾了两个晚上终于在 Win 环境下安装成功，把结果分享下。",[1841,8140],{},[24,8142,1831],{"id":1831},[5203,8144,8145],{},[35,8146,8147,8150],{},[38,8148,8149],{},"Windows 7 x64",[38,8151,8152],{},"Anaconda3-4.2.0-Windows-x86 (Python 3.5)",[24,8154,8156],{"id":8155},"安装-visual-c-2015-build-tools","安装 Visual C++ 2015 Build Tools",[5203,8158,8159],{},[11,8160,8161,8162],{},"Prophet 需要 C 语言编译，在 Win 环境下需要先安装 ",[347,8163,8166],{"href":8164,"rel":8165},"http:\u002F\u002Flandinghub.visualstudio.com\u002Fvisual-cpp-build-tools",[351],"Visual C++ 2015 Build Tools",[24,8168,8170],{"id":8169},"安装-pystan","安装 pystan",[5203,8172,8173],{},[11,8174,8175,8176],{},"Prophet 依赖 pystan 包所以也需要安装 pystan\n",[132,8177,8178],{},"pip install pystan",[24,8180,8182],{"id":8181},"安装-prophet","安装 Prophet",[5203,8184,8185,8193,8204],{},[11,8186,8187],{},[41,8188,8189,8190],{},"不要用 ",[132,8191,8192],{},"pip install fbprophet",[11,8194,8195,8200,8201],{},[347,8196,8199],{"href":8197,"rel":8198},"https:\u002F\u002Fgithub.com\u002Ffacebookincubator\u002Fprophet",[351],"下载"," prophet 最新源码。\n或者 ",[132,8202,8203],{},"git clone https:\u002F\u002Fgithub.com\u002Ffacebookincubator\u002Fprophet",[11,8205,8206,8207,8210],{},"解压到指定目录，例如 D:\\Anaconda3\\prophet\nCMD:\n",[132,8208,8209],{},"cd D:\\Anaconda3\\prophet\\python",[132,8211,8212],{},"pip install -e .",[24,8214,8215],{"id":8215},"安装完成",[1841,8217],{},[24,8219,8220],{"id":8220},"踩过的坑",[11,8222,8223],{},[41,8224,8225],{},"1. error: command ‘C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\cl.exe’ failed with exit status 2",[5203,8227,8228],{},[11,8229,8230],{},"先确认 Visual C++ 2015 Build Tools 是否安装；如果已经安装，请放弃使用 pip 安装 Prophet。下载源码安装 Prophet 无问题。",[11,8232,8233],{},[41,8234,8235],{},"2. No such file or directory: u’fbprophet\u002Fstan_models\u002Flinear_growth.pkl’",[5203,8237,8238],{},[11,8239,8240,8241,8246],{},"目测是一个",[347,8242,8245],{"href":8243,"rel":8244},"https:\u002F\u002Fgithub.com\u002Ffacebookincubator\u002Fprophet\u002Fpull\u002F100",[351],"已知 BUG","，已经修复。但好像 Release 的 v0.1 源码未更新。直接下载最新源码编译无报错。",[1841,8248],{},{"title":387,"searchDepth":388,"depth":388,"links":8250},[8251,8252,8253,8254,8255,8256],{"id":1831,"depth":388,"text":1831},{"id":8155,"depth":388,"text":8156},{"id":8169,"depth":388,"text":8170},{"id":8181,"depth":388,"text":8182},{"id":8215,"depth":388,"text":8215},{"id":8220,"depth":388,"text":8220},"2017-03-16","Win 下装 Prophet 不能用 pip install fbprophet，得先装 VC++ 2015 Build Tools 和 pystan，再从源码装。附两个踩坑记录。",{},"\u002Fposts\u002Fwindows-install-facebook-prophet",{"title":8127,"description":8258},"posts\u002Fwindows-install-facebook-prophet",[8264,8265,8266],"Python","Prophet","环境配置","yXvlR_ZI35tb-kDjwjaABLwx4Qxkwe20Ek459jNtV6c",1789404663887]