上上师兄 发布的文章

Maven工程,经常需要查找冲突的jar包,一个常用的方式是在命令行执行:

mvn dependency:tree

然后在打印出来的依赖树中找到依赖的(包括间接依赖)的jar包的不同版本。
如果依赖较多的话,可以将其输出到一个文件中,然后便于查找,像这样:

mvn dependency:tree > dependency.txt

如果使用Intellij IDEA的话,可以安装Maven Helper插件。

具体可以在IDEA中依次点击:File-Settings-Plugins-browser repositories, 然后在搜索框输入 Maven Helper搜索,即可搜出来进行安装。安装后需要重启下。

安装完成后,就可以在IDEA中打开项目的pom.xml文件,在编辑器面板的左下角,可以发现多了一个TAB,Dependency Analyzer,点击切换到此面板,就可以在此查看冲突的jar包,也可以查找jar,通过点击查看依赖树,右击包名可以跳转到pom.xml文件中的对应位置,甚至可以直接exclude此二方包。更多功能可以自己安装后探索下, 或者参考附录的链接了解此插件的更多信息。

参考:
https://plugins.jetbrains.com/plugin/7179-maven-helper

像Python一样,用Clojure写一些日常要用的小脚本。

1)常规方法
前提:安装了JDK,并下载了clojure的jar包。
因为clojure本身是基于JVM的,而且它本身集成在一个jar包里,因此,执行clojure脚本可以直接通过java命令。
如下:

java -cp /path/to/clojure.jar clojure.main file1.clj arg1 arg2

在file1.clj中,可以通过command-line-args得到参数的list,比如(arg1, arg2)。

2)使用leiningen的插件lein-exec
前提:安装了JDK(v8.0)和Leiningen(v2.8.0)。
在~/.lein/profiles.clj(如果不存在,则创建此文件)中添加:

{:user {:plugins [[lein-exec "0.3.6"]]}}

然后在命令行执行lein version 或者其他的task,那么就会自动下载插件(默认下载的~/.m2/repository/lein-exec/目录下)。
此步如果卡着不动,可能是网络原因,可以从:(https://mvnrepository.com/artifact/lein-exec/lein-exec/0.3.6) 手动下载下来,放到本地对应目录下。

之后就可以通过

lein exec file1.clj arg1 arg2

来执行脚本文件了。在file1.clj中,可以通过command-line-args得到参数的list,但是与上面的常规方法不一样的是:它是包含脚本文件的名字的,比如(file1.clj, arg1, arg2)。

参考:
https://github.com/kumarshantanu/lein-exec
https://clojure.github.io/clojure/clojure.main-api.html

本文是自己学习Guava类库的一些学习心得,主要来自Guava的官方文档,并夹杂了一些自己的理解。

Guava是Google内部使用的核心Java类库的开源版本,这些核心实用类都是Google内部员工平时编码中经常使用的类库,已经在Google的生产环境验证,因此,我们可以放心的使用他们。

Guava的定位是使得用Java语言工作更加愉快和更加高效。JDK自带的utilities类(比如Collections类)被广泛应用并极大的简化了Java代码,Guava的目标就是要继续这个“传说”。

Effective Java第47条,“了解并使用类库”,告诉我们,使用类库比自己写一个实用工具类更可取。(个人觉得,如果为了学习,这条可以忽略,相反,自己写一个类库并且跟现有的优秀的类库比较,反而更利于个人成长。)
【总之,不要重复造轮子。如果你需要一些看起来很通用的功能,那么可能已经存在相应的类库实现了你的功能。如果存在,那么就使用它;如果你不知道,那么可以去搜下。总之,使用类库大部分情况比自己实现要更好。这个无关你作为一个程序员的能力,因为通用的类库集聚了大部分程序员的努力,肯定比你自己实现这个功能投入的精力要多。】(摘自effective java)

所以,不得不说:

  • Guava在Google的生产环境经过了实战测试。
  • Guava经过了很多的单元测试。自动化的测试,并且覆盖率很高,尤其是collect子包。
  • Guava开发很活跃,用户参与也很积极。
  • 总之,很牛逼。

Guava在增加特性方面偏保守,在决定是否增加一个特性时,会考虑是否‘实用’并且‘普遍存在’。‘实用’表现在:可以节省你大量的代码;避免让你写出很难调试或者易于出错的代码;提高可读性;提高速度。‘普遍存在’就是在代码中竟然被使用,这一项可以通过Google内部的代码库里扫描统计出来。

相对于增加特性方面的保守,Guava在去除不需要的特性方面很果断,会把这些特性标为deprecate继而删除该特性。因此,使用@Beta注解的类或者方法要谨慎使用。

Guava的实现针对一些通用的设计原则,包括:

  • 针对特定的场景,这些api是最优的解决方案;
  • 类或者方法的语义是可以从他们的签名上很明显很直观的看出来。实现可以很smart,但是名字要很直观。
  • 鼓励Guava的用户有好的代码习惯,而Guava它自己的代码本身也是好代码习惯的典范。(比如快速失败,拒绝null)
  • 不要试图单独解决每一种场景,相反提供通用的工具以解决我们可能没遇到过的场景。
  • 强调可维护性,并留出未来重构的空间。(结果:大部分暴露出去的类应该是final的,就像effective java 17条说的;把AbstractXXX类暴露出去也应该很谨慎。)

参考文档:https://github.com/google/guava/wiki/PhilosophyExplained

maven 3.3 执行mvn dependency:tree时,会报出如下异常:

Error injecting: org.apache.maven.shared.dependency.graph.internal.Maven3DependencyGraphBuilder java.lang.NoClassDefFoundError: org/sonatype/aether/graph/Dependency

原因是因为,在Maven 3.1-alpha-1 从Sonatype Aether迁移到了Eclipse Aether,而这个变更对于某些插件(比如maven-dependency-plugin, android-maven-plugin, maven-shade-plugin, maven-site-plugin)是不兼容的。所以会报出找不到相关的类。

解决方法是:使用Maven 3.1.*之前的版本,比如3.0.5。或者根据如下链接,升级对应的插件的版本。

知道路遥这个人是因为路遥知马力,后来知道路遥是个作家,他的《平凡的世界》很出名。那时候,读高中,知道很多名著的名字,但是仅限于知道,并不曾读完这些大部头的书,毕竟大部分时间都用来对付考试。

后来读完了《平凡的世界》,久久不能平静。设想着自己是故事的主人公,也想着通过努力去改变自己的命运,而内心的浪漫情怀却也总被命运的无奈所触动。

看完《平凡的世界》后,觉得不过瘾,于是继续去搜索路遥的其他作品,又看了他的中篇小说《人生》,感叹个人命运在时代背景下的无力与无奈。

看完这两本后,再次搜寻路遥的作品,发现了一本书名很有意思的书,就是最近读完的《早晨从中午开始》,不得不说,起个好名字,真的很重要。

这本书收藏了很久,一直没有读。一方面是近几年来专业书看的相对多点,另一方面是因为总有比这本更想看的书要读。于是,本来早晨的事儿,拖着拖着就到了中午。

这书的名字很有趣,尤其是对于爱睡懒觉的人儿,大抵上也是从中午开始一天的。而这本书要表达的应该也有这个意思,因为路遥的一天也是从中午开始的,每天要凌晨2-3才睡下。另外一个意思则是,“当生命进入正午的时候,工作却要求我像早晨的太阳一样充满青春的朝气投身于其间……”。

《早晨从中午开始》是作者路遥的写作随笔集,其中的一篇,名字叫“早晨从中午开始”,详细记录了作者在《人生》发表后,创作《平凡的世界》的过程和自己的心路历程。作者从1982年《人生》获奖后开始,到88年创作完成平凡的世界,经历了6年的时间,其中三年准备材料,三年写作。看完之后,才明白什么是拿生命在创作。以下为部分摘录:

【“我渴望重新投入一种沉重。只有在无比沉重的劳动中,人才会活得更为充实。 是的,只要不丧失远大的使命感,或者说还保持着较为清醒的头脑,就决然不能把人生之船长期停泊在某个温暖的港湾,应该重新扬起风帆,驶向生活的惊涛骇浪中,以领略其间的无限风光。人,不仅要战胜失败,而且还要超越胜利。”这段表达了自己在《人生》获得全国大奖之后的思考,是在圈子里混还是继续创作。

“只有初恋般的热情和宗教般的意志,人才有可能成就某种事业” 继续给自己打气。

“人是一个非常复杂的矛盾体。为了不受干扰地工作,常常要逃避世俗的热闹;可一旦长期陷入孤镜,又感到痛苦,又感到难以忍受。”创作的孤独。

“体力在迅速下降,有时候累得连头也抬不起来。抽烟太多,胸脯隐隐作疼。眼睛发炎一直未好,痛苦不堪。”长期的创作导致的身体状态越来越差,期间甚至一度中断写作。

“几乎不是思想的支配,而是不知出于一种什么原因,我从桌前站起来所做的第一件事,就是把手中的那支圆珠笔从窗户里扔了出去。”创作完成后,作者将笔直接从窗户扔了出去,如释重负。】

有时候自己在想,作家应该是什么样子,作家的文学作品应该要起到什么作用。在这本书中,路遥给出了自己的答案,文学作品,应该反映时代和社会发展,大家能从小说中看的到整个社会的缩影和突出问题。“作家的劳动绝不仅仅是为了取悦当代,而更重要的是给历史一个深厚的交代。”,我对这个答案很认同。不知道当代文学作品和现在的作家是个什么样子?!在这方面,韩有一点影子,而郭却差太远。作家应该要有社会责任感。

路遥是我个人非常喜欢的作家,而《平凡的人生》非常值得再读,这本《早晨从中午开始》算是平凡的世界的“饭后甜点”吧。