Maven发布401问题排查

日志问题现象 Caused by: org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException: Failed to deploy artifacts: Could not transfer artifact com.aa.bb:client:jar:1.0.0-20191231.021137-1 from/to company::default (http://test.company.local/nexus/repository/maven-snapshots): Transfer failed for http://test.company.local/nexus/repository/maven-snapshots/com/aa/bb/client/1.0.0-SNAPSHOT/client-1.0.0-20191231.021137-1.jar 401 Unauthorized 根据提示,401未授权,表面来看就是发布的权限未认证 排查步骤 settings文件是否配置了发布的用户名与密码,且用户有deploy的权限 <servers> <server> <id>myid</id> <username>myuser</username> <password>mypasswd</password> </server> </servers> 查看deploy插件的版本 如果是2.X的版本,可以使用以下命令进行发布 mvn -DaltDeploymentRepository=company::default::http://test.compnay.local/nexus/repository/maven-snapshots clean package deploy 如果是3.X的版本,则需要按3.X版本进行指定发布 mvn deploy:deploy-file -Dfile=xxx-1.0.0-SNAPSHOT.jar -Durl=http://test.local/nexus/content/repositories/snapshots -DrepositoryId=test-snapshot Deploy 3.0.0-M1的发布bug 如果配置的deploy的插件为3.0.0-M1,则可参考3.0.0-M1 401 bug 进行修改,具体就是指定depoly版本为2.8,根据插件作者的回复感觉就是3.0.0-M1与altDeploymentRepository参数不能一起用

2019-12-31 ·  (🌟Updated: 2019-12-31) · 1 min · 51 words · tomyli

那些有用maven命令

查看当前系统的配置信息 排查问题可以查看当前maven所依赖系统的所有变量(系统变量或者环境变量)信息 mvn help:system 查看当前有效的settings文件 maven的配置文件分为全局配置与个人配置,全局配置在$M2_HOME/conf/下,个人配置一般在~/.m2/下,此时查看当前有效的settings配置可以使用 mvn help:effective-settings 查看Settings配置的值 以下命令可以查看settings文件中的settings->servers的配置 mvn -q -Dexpression=settings.servers -DforceStdout help:evaluate 使用help:evaluate可以查看所有的配置信息 指定发布到其它仓库 Deploy插件2.X版本发布 有时候在pom文件中指定了发布的仓库地址,但是又需要发布到另一个仓库,这时可以指定-DaltDeploymentRepository来实现 mvn -DaltDeploymentRepository=id::layout::url 具体说明参见deploy:deploy Deploy插件3.0.0-M1版本发布 /data/mvn/bin/mvn org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy-file -DgroupId=com.qqreader -Dfile=./target/$(/data/mvn/bin/mvn -q -Dexpression=project.build.finalName -DforceStdout help:evaluate).jar -Durl=http://testurl.local/nexus/content/repositories/snapshots -DrepositoryId=snapshot-id

2019-12-31 ·  (🌟Updated: 2020-01-03) · 1 min · 33 words · tomyli

JAVA8问题处理回顾-持续更新

金额累加问题 使用Reduce进行累加操作,参考这里 List<BigDecimal> bdList = new ArrayList<>(); //populate list BigDecimal result = bdList.stream().reduce(BigDecimal.ZERO, BigDecimal::add); 查找集合的最后一个元素 JAVA8的Stream只提供了FindFirst功能,没有FindLast功能,可以使用Reduce来实现查找最后一个元素的效果 import java.util.*; import java.util.stream.*; public class GetLastEleFromCollection { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aaa"); list.add("idddd"); list.add("bbbb"); String lastElement = list.stream() .reduce((first, second) -> second) .orElse(null); System.out.println(lastElement); } } bbbb 比较两个时间是否是同一天 import java.time.*; import java.time.temporal.*; public class CompareDay { public static void main(String[] args) { final LocalDateTime now = LocalDateTime.now(); final LocalDateTime localDateTime = LocalDateTime.of(2019, 9, 29, 0, 0, 0); System.out.println(localDateTime.truncatedTo(ChronoUnit.DAYS).isEqual(now.truncatedTo(ChronoUnit.DAYS))); } } true 实现与Python的zip函数功能 import java.util.*; import java.util.function.*; public class Zip { public static void main(String[] args) { List<List<Integer>> result = handle(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), (i, j) -> Arrays.asList(i, j)); System.out.println(result); } public static <T, U, R> List<R> handle(List<T> list, List<U> list1, BiFunction<T, U, R> biFunction) { List<R> result = new ArrayList<>(); for(int i = 0; i < list.size(); i ++) { result.add(biFunction.apply(list.get(i), list1.get(i))); } return result; } } [[1 (\, 4)] (\, [2 (\, 5)]) (\, [3 (\, 6)])] 多个Predicate链 import java.util.*; import java.util.stream.*; import java.util.function.*; public class MorePredicate { public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6); final Predicate<Integer> predicate = i -> i % 2 == 0; final Predicate<Integer> predicate1 = predicate.and(integer -> integer > 5); List<Integer> result = list.stream() .filter(predicate1) .collect(Collectors.toList()); System.out.println(result); } } [6]

2019-08-24 ·  (🌟Updated: 2019-09-29) · 2 min · 220 words · tomyli

Apollo Client自定义问题拾遗

由于公司很多服务要接入Apollo配置中心,并且对于项目的接入有网络要求,根据官方说明,需要自定义Client来完成 接入步骤 新建maven项目 在Idea中新建maven项目,基于quickstart构建 增加项目依赖 官方说明的建议在新的client中依赖Apollo官方的client,再根据业务进行扩展,所以maven依赖apollo-client,公司项目的网络访问需要通过L5来进行,所以还要依赖L5的jar,目前这个jar包没有maven坐标,只能以lib方式引入 自定义MetaServer 关键的部分,自定义满足公司网络条件的MetaServer,Apollo官网说明是实现MetaServerProvider且Order值小的Providor被使用,按照说明进行实现 Maven打包Client 执行 mvn clean install 进行打包,解压jar包发现就只有一个Providor的实现类,这样jar运行有问题。需要把新Client所有的依赖都打进jar包,在网上找了半天,需要在POM中增加maven的plugin的配置,如下: <!-- 打包所有的maven依赖到jar包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <artifactSet> <excludes> <exclude>junit:junit</exclude> </excludes> </artifactSet> </configuration> </execution> </executions> </plugin> <!-- 添加依赖的非maven jar包 --> <plugin> <groupId>com.googlecode.addjars-maven-plugin</groupId> <artifactId>addjars-maven-plugin</artifactId> <version>1.0.5</version> <executions> <execution> <goals> <goal>add-jars</goal> </goals> <configuration> <resources> <resource> <directory>${basedir}/lib</directory> </resource> </resources> </configuration> </execution> </executions> </plugin> 由于项目中使用了maven依赖与非maven依赖,所以上述的两个插件都要使用。增加了上面两个插件后再运行打包命令查看生成的jar就发现所有的依赖都在jar中了。 项目中使用Client 选择一个项目在测试环境进行配置调试,自定义的Meta Server一直没有生效,所以查找官方文档,由于自定义Providor是通过SPI方式实现的,所以正确的实现方式是新建resource文件夹,指定MetaServerProvider的真正实现类的带包名类才可以,哎,找了我好久。 后续操作 后续会把client上传到内部maven仓库,完善配置API,使业务方可以零配置来使用配置中心。 总结 Maven的打包机制还是不清晰,处理打包问题费了很多时间,要好好重新学习一下 Apollo的官方文档还需要再仔细阅读,有问题多查issue,因为可能有人已经遇到了 多读读源码,真正的体会大牛的软件设计思想

2019-07-01 ·  (🌟Updated: 2019-07-01) · 1 min · 70 words · tomyli

Apollo 配置中心畅游

目前市面上的开源产品 Disconf 2014年7月百度开源的配置管理中心,同样具备配置的管理能力,目前已经不维护了,最近的一次代码提交是两年前了。 Spring Cloud Config 2014年9月开源,Spring Cloud生态组件,与Spring Cloud体系无缝整合。 Apollo 2016年5月,携程框架部开源的配置管理中心,具备规范的权限、流程治理等特性。 Nacos 2018年6月,阿里开源的配置中心,可以做DNS和RPC的服务发现。 为什么选择Apollo 社区活跃 刚刚发布了1.4.0版本,Issue处理速度快 文档齐全 体验,部署,设计文档都齐全 重要的灰度发布 想发布一台机器试试水,可以! 开源协议友好 Apache 2 license Apollo都有哪些重要功能 以下摘自官网说明 统一管理不同环境、不同集群的配置 配置修改实时生效(热发布) 版本发布管理 目前只支持对最近版本的恢复。https://github.com/ctripcorp/apollo/issues/1642 灰度发布 权限管理、发布审核、操作审计 编辑与发布是两个独立的操作。 客户端配置信息监控 提供Java和.Net原生客户端 提供开放平台API 这样可以通过其它方式来查看配置信息,平台API说明 使用方便的后台配置系统Portal 分布式部署相对较复杂,这是缺点 外部依赖少,目前依赖Mysql Apollo的组成 Apollo长什么样? Apollo整体设计 总体架构 代码结构 各模块概要介绍 Apollo Config Service 提供配置获取接口,服务对象为Apollo客户端 Apollo Admin Service 提供配置管理(修改、发布)接口,服务与Portal Apollo Portal 提供WEB界面供用户管理配置 Apollo的重要设计 Admin Service与Config Service的通信方式 Apollo使用Mysql实现消息(ReleaseMessage)的处理,消息内容为AppId+Cluster+Namespace,具体的设计思想可以参考这里 客户端与服务端的通信方式 客户端与服务端保持一个长连接(通过Http Long Polling实现) Client Server 重要的Namespace Namespace是配置项的集合,类似于一个配置文件的概念,获取的权限分为private与public两种权限。 Namespace的类型 私有类型 公有类型 关联类型(继承类型) Cluster能用来做什么? 分机房实例,分任务功能实例,比如在一些实例执行job,需要增加-Dapollo.cluster=配置指定集群名 ...

2019-05-09 ·  (🌟Updated: 2019-06-25) · 1 min · 108 words · tomyli

ARTS-打卡第一天

Algorithm LeetCode 第一题 题目描述 给一个int数组,返回数组中两个数字相加的和是目标 数的下标。可以假设每个输入只有一个解决方案,并且不能使用同一个元素两次。 Example 给出nums = [2, 7, 11, 15], 目标数为9,则返回[0, 1] 题目解答 import java.util.*; public class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < nums.length; i ++) { int second = target - nums[i]; if(map.containsKey(second)) { return new int[]{map.get(second), i}; } map.put(nums[i], i); } return new int[]{}; } } 相比两次循环的方式,这种处理的时间复杂度为O(n), 空间复杂度也为O(n). ...

2019-05-09 ·  (🌟Updated: 2020-01-08) · 1 min · 129 words · tomyli

Centos7 install issue collect

由于工作需要,使用VMWare虚拟机安装了Centos7系统,遇到了很多问题,现在把这些问题记录下来,以备后用。 解决Centos7 yum could not retrieve mirrorlist错误 刚安装好的VM使用ip add查看局域网的ip没有结果,这个参考https://my.oschina.net/u/2456768/blog/3011881 配置静态ip 安装虚拟机就是模拟多个机器通讯的情况,但是目前的配置是机器ip是动态获取的,老是变,每次都得看ip,所以需要配置一下VMware来支持静态ip。主要机器上的配置信息为: IPADDR=192.168.116.101 NETMASK=255.255.255.0 GATEWAY=192.168.116.2 DNS1=192.168.116.2 这个参考了https://blog.csdn.net/zhishengqianjun/article/details/77046796 Centos7安装后配置国内仓库源 由于国内访问centos的原始源慢,需要换成163的软件源,新安装的系统执行命令都提示not found,只能从物理下载源的配置再上传到VM中,但是首先得知道VM的ip地址,使用ifconfig是不可能了,查了一下可以使用 ip a 来查看VM的ip地址,这样配置源的的问题可以解决了,具体的配置源的方法参考https://blog.csdn.net/inslow/article/details/54177191 Centos7安装VMware Tools 想更好的让VM与物理机协同,则VMware Tools必须要安装,好久不用linux的我连挂载也忘的一干二净了。搜了一下,参考https://blog.csdn.net/WarnerWu/article/details/73718901 完成VMware Tools的安装。这样共享目录的功能就可以正常使用了 安装Jdk8 一句命令搞定: yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 安装mysql 使用yum安装mysql需要下载安装mysql的源,更新后就可以安装了,这个参考了https://www.linode.com/docs/databases/mysql/how-to-install-mysql-on-centos-7/ 修改mysql的root密码 安装完mysql后登录找不到密码了,其实在使用yum安装时会mysql会自动生成一个随机密码,这个密码可以在安装的日志中找到。此方法参考了https://blog.csdn.net/kuluzs/article/details/51924086 开放3306端口 为了方便mysql工具进行操作,需要开放3306端口。Centos7的防火墙还改了。具体就3个命令: systemctl start firewalld firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload 这个参考了https://www.jianshu.com/p/225a853350d9 安装oh-my-bash 由于一般服务器都自带bash为默认的shell,但是操作起来着实不方便,安装oh-my-bash可以对shell进行一些增强。https://github.com/ohmybash/oh-my-bash Centos自动登录 安装后每次启动VM都要输入密码,这个对于自己测试很麻烦,要使Centos能登录后自动登录需要做以下操作: 移除原来的getty@tty1.service软链接 rm /etc/systemd/system/getty.target.wants/getty@tty1.service 拷贝getty@.service file 并且命名为 getty@tty1.service cp /lib/systemd/system/getty@.service /etc/systemd/system/getty@tty1.service 编辑新拷贝的getty@tty1.service,修改以下内容,最后一行必须加上 [Service] ... ExecStart=-/sbin/agetty --autologin root --noclear %I ... [Install] ... ;Alias=getty@tty1.service 在getty.target.wants目录做一下软链接 ...

2019-05-06 ·  (🌟Updated: 2019-06-26) · 1 min · 85 words · tomyli

那些高效的Chrome插件

Surfingkeys 👍 严重推荐,VIM键盘模拟,自定义程度非常高 Immersive Translate 👍 无敌翻译软件,支持网页、PDF、本地文件翻译 Tampermonkey 👍 用户自定义脚本管理器 Enhanced GitHub Github加强版,显示仓库大小,下载单个文件等好用功能。插件地址 眺览 TillGlance 👍 一目十行的阅读方式 Elmo - Your AI companion to create summaries and insights 最大优点是生成的摘要最接近原文 Language Reactor 探索、理解并从母语材料中学习的完美助手 PeekLink - Chrome Web Store 浏览体验大升级 iorate/ublacklist: Blocks specific sites from appearing in Google search results WeRead to Readwise Sync, 微信读书笔记同步到Readwise - Chrome Web Store podStation Podcast Player - Chrome Web Store 浏览器中播放播客,支持下载 RSSHub Radar - Chrome Web Store Burning Vocabulary - Reading and Vocabulary Mate j3sch/logseq-clipper: A browser extension for capturing web content directly into your Logseq graph. Adapted from Obsidian’s Web Clipper. 优化logseq官方插件,直接捕获内容 ...

2019-03-08 ·  (🌟Updated: 2026-04-01) · 2 min · 326 words · tomyli

那些提高效率的命令行工具

brew Mac软件包管理工具。用命令行命令来安装软件,仓库软件丰富。地址 bat bat? No,高端cat,不费眼。带颜色显示,支持git状态,自动分页。地址 cowsay 奶牛说: 地址 coreutils 使用Rust重写的gnuutils。地址 direnv 环境变量切换,可以指定在进入某一文件夹后的操作,比如输出一条欢迎语句,在退出文件夹后则卸载变量(操作),它的stdlib内置了一些功能来处理环境。 地址 exa ls、tree的替代者,支持多种显示方式,支持按指定条件排序显示。地址 duti mac默认软件打开程序配置。再也不用一个手动的点击设置了,可以脚本化。地址 riggrep 强大的find,查询速度更快,支持匹配结果的字符替换,支持定义输出颜色。地址 fortune 英文名言集合,可以使用fortunes进行扩展,对中文用户更友好。地址 fzf 强大的交互式搜索,大大提高效率,官网提供了很多实用的操作目录与git的命令。地址 goku 改键神器Karabiner的配置管理器,更健康,更人性化。地址 htop 交互式的top信息显示,支持配色。地址 imgcat 命令行看图片。可以控制显示的高度、宽度。地址 jq json内容操作显示。支持分离、过滤、转换元素,判断JSON元素节点是否存在等功能,内置了很多方便的函数。 地址 jenv JDK版本管理命令行工具,支持全局、当前目录、当前shell的jdk版本指定。还可以指定Java虚拟机指定的JVM参数。支持插件的启用与禁用。地址 lnav log file navigator,增加的日志查看,可以根据日志级别显示不同颜色的日志信息。支持分页显示。地址 lolcat 命令、文件内容多彩输出。地址 m-cli Mac的瑞士军刀,支持各种mac组件(Dock,蓝牙,WIFI,Finder)的操作。地址 mackup Mac应用配置同步,支持多种存储方式。支持自定义应用的同步配置。主要命令为backup,restore,uninstall。地址 mas 命令行安装apple store应用。地址 mycli 命令行中的mysql客户端。地址 ncdu 增强版本的du,机器空间使用查询,支持扫描结果导出与导入,支持多种排序方式。地址 Ranger 命令行下的文件管理,强大到没朋友。地址 pandoc 文档转换,支持非常多的的格式转换。地址 pyenv pythne版本管理工具。地址 pyenv-virtualenv pythne虚拟环境管理,管理pyenv配置的环境。地址 prettyping 增强的ping,图形化显示,可以轻松的看出ping的地址的网络状况。地址 rtv 命令行中浏览reddit。地址 s-search 命令行下进行web搜索。地址 tmux 终端多会话管理器。地址 tldr 命令快速查询。简单的man。地址 Terminal Notify 命令行操作mac显示通知,支持图标显示与点击后操作(如打开网址,执行命令)等。地址 w3m 终端浏览器,操作方便。地址 ...

2018-09-30 ·  (🌟Updated: 2021-02-04) · 1 min · 119 words · tomyli

那些提高效率的Alfred Workflow

Alfred Maestro 操作Maestro的workflow,可以直接查找macro并执行。插件地址 Alfred github workflow 搜索github上的项目,可以搜索项目,人物等。插件地址 MyIP 快速的查询本机的ip,包括本地IP与外网IP。 SwitchHosts! 在alfred中快速本地host的配置,配合SwitchHosts来使用。插件地址 SnippetsLab 在alfred中快速查看SnippetsLab中的代码片断 VMWare Control 在alfred中控制vmware虚拟机。支持启动、停止、挂起、切换等操作。插件地址 lxbrvr/alfred-keepassxc-workflow: Alfred workflow for fetching the attributes of the KeepassXC entries. Alfred 快速密码访问 Alfred Browser Toolbox Toolbox是一个文件操作浏览的工具,它支持创建、查找文件的功能,还可以查询pdf文件,非常方便。Mac上的Finder使用确定不方便。这里有具体的使用方式。 Alfred Keywords Help 安装的workflow多了,记忆触发的keyword就比较困难,使用Keywords help这个插件可以显示出所有已经安装的workflow的触发key,还可以根据workflow进行查询。 Alfred My Mind 快速查询Nikita的githubpage内容的workflow,我在他的文章里面学到了很多。插件地址 Awesome lists 快速查询Github上awesome列表的workflow,只为发现更多。插件地址,这个也是Nikita的作品。 Baidu Map 在alfred上使用百度地图。插件地址 Birthday 在alfred中显示你来到这个世界多长时间,让你珍惜每一分,每一秒。插件地址 Calendar 在alfred中显示出当月的日历信息。插件地址 Chromes Bookmarks 在aflred中搜索Chrome浏览器的书签,非常的好用。插件地址 Common Search 国内常用网站的搜索,现在支持知乎、淘宝、掘金、github。插件地址 Dash 在alfred中进行Dash的搜索,开发者必备。插件地址 Directory watches 本地目录文件查看,指定目录的搜索,回收站文件显示。 Emacs Workflow 在alfred中进行emacs的操作,比如打开文件等。插件地址 Git Repos 搜索本地的git文件夹,搜索到后可以使用指定软件进行打开,开发时很有用。插件地址 Google Chrome History 在alfred中快速查看Chrome的浏览历史。插件地址 ...

2018-09-21 ·  (🌟Updated: 2025-01-03) · 1 min · 174 words · tomyli