Java

  • Java,  工具,  技术

    如何在本地环境同时用多个jdk版本

    如果工作在不同的项目,可能需要不同的jdk版本。如果用mvn的话默认只是用系统设置的版本。这时候如果想在命令行编译就会比较麻烦。最简单的做法是把系统的java版本设置成最常用的,然后设置别名分别对应不同的版本。 下面是例子: 这样就可以了。 另一个方法通常IDE的mvn都可以用单独的配置,比如说用Intellij,我们可以在不同的Intellij的project设置不同的版本:

  • Java,  安全,  技术

    Java Agent的使用

    最近集成Rapid7 的tcell 安全agent到我们的application。在report里面可以显示各个api end point的访问情况和返回情况,并且还能检测xss等数据。好奇他们是怎么做的,顺手查看了文档,发现其实挺简单。其实就是在运行java程序的时候 加入 javaagent的参数。不同的framework tcell提供了不同的agent,比如说Sprint,Dropwizard。 javaagent是通过修改bytecodes的方式修改运行程序的。这里有一篇很好的文章介绍java instrumentation的: https://www.baeldung.com/java-instrumentation . 通过javaagent还能做挺多的其他东西,比如说: 动态的添加loghttps://lightrun.com/debugging-live-java-applications-with-lightrun/ Jolokia is an agent converting JMX to http based REST end points. https://jolokia.org/reference/html/agents.html#agents-jvm https://www.baeldung.com/java-instrumentation . 自定义任何东西 后记:我以为Sentry也是通过javaagent实现的,看了之后发现不是。

  • Java,  技术

    Baeldung-最好的技术网站,没有之一

    已经记不清楚看过多少baeldung的文章,今天又用它解决了一个java debug的问题。Tungsten以前一直可以remote debug忽然最近发现不行了。 最后还是这边文章解决了问题:https://www.baeldung.com/java-application-remote-debugging 原来根本原因是我们升级了JDK到8,老的Java 5的debug参数已经不能用了。。而且貌似Java 9以后参数又变了。 我看Baeldung有中文版,但是翻译工作做的真的一般。。中文真的应该有一个类似的权威的技术门户,文章的质量控制真的非常非常重要。有很多的技术网站,但是内容都是网友贡献,有些很好,有些质量却很差。还是需要中心化的审核机制

  • Java,  技术

    Java Streaming Basic

    10年前加入现在的公司的时候公司的产品还在用JDK5,写code自然完全不会用Lamda,Streaming这些8才出现的特性。 后来开始做micro service了,用到新版本的JDK,但是我也很少写code了。中间看了一些书,不过一直是似是而非。是时间仔细看下了。 Intermediate Operations filter limit map flatMap Stream.map和Stream.flatMap的区别 先看signature. 区别是 flatMap穿进去一个Item,出来一个Stream: 这两个其实是完全不一样的东西,map就是把steam里面的item转换成另外一个,非常简单。flatMap是用来处理item也是list的情况,有时候我们想把两维列表转化成一个,就可以用这。下面是一个简单的例子: 下面是项目的一个更加实际的例子: 这个例子是拿到一个父对象,父对象里面有子对象,这样就能拿到所有的子对象。 总的来说stream就是一个循环,而flatMap就是一个嵌套循环。 下面是另外一个lamda的例子(不是method reference): Terminal Operation forEach forEach其实就是iterate.不用改被用作计算,就是用简单的report,或者简单的操作比如把结果加到另一个colection里面. –<Effective Java> collect 常用的的下面几种: toList toSet toMap:如果有重复key,会出错。第三个参数可以用来去重。比如可以选择最大,选择最后的一个。 groupingBy:Value可以是一个数组,也可以是summary,比如`counting()`. Joining: 三个参数,join的delimiter, start character,end character