scala.sys.process简介及实战
简介
Ruby很方便的支持操作系统的调用,如:
irb> system 'dir'
irb> system 'ls -la'
irb> system 'curl -I http://www.iteye.com'
irb> result = `curl -I http://www.iteye.com`
irb> open("|ls -la"){|it| it.gets }
现在不用羡慕Ruby了,Scala 2.9里也提供类似功能:新增加了package: scala.sys及scala.sys.process, 这些代码最初由SBT(a simple build tool for Scala)项目贡献,主要用于简化与操作系统进程的交互与调用。
虽然Java本身通过java.lang.Process提供了这方面的支持,但是API偏底层,易用性不高。
而scala.sys.process提供了漂亮的DSLs,如:
//导入定义在process package object里的隐式方法,如!, !!, #> 等
import scala.sys.process._
//执行ls -l
"ls -l" !
//执行ls -l 并获取标准输出流信息
val result = "ls -l".!!
//下载网页
new java.net.URL("http://www.iteye.com") #> new java.io.File("iteye.html") !
关于scala.sys的更多用法我们可以参考sbt的文档,或阅读scala API
实战
问题描述:
一个maven Web工程使用jetty:run 启动时抛出以下异常:
java.util.zip.ZipException: invalid entry size (expected 6659 but got 8867 bytes)
at java.util.zip.ZipInputStream.readEnd(ZipInputStream.java:403)
...
at org.eclipse.jetty.webapp.JarScanner.scan(JarScanner.java:75)
...
运行mvn dependency:analyze试图分析工程依赖情况信息时,也抛出同样的异常。
分析异常推测应该是工程依赖的某个jar文件有问题,但是jetty插件抛出异常信息里没有明确的信息指明那些jar有问题。
解决思路:
我们可以通过maven命令mvn -X jetty:run 的输出的调试信息找出所有依赖jar的路径。
但是何不给本地maven仓库(位于$HOME/.m2/repository)的所有jar来个大扫荡呢?
说干就干,我们知道jar是以zip文件格式压缩打包的,为了方便起见可利用zip命令行工具来进行校验:
$ zip -T path
(注:windows系统下可以安装Gow工具包,它里面打包130来个unix 系统的常用工具,如:zip, cat, wget, cURL等等.)
实现思路很简单,递归访问$HOME/.m2/repository每个子目录,找出jar文件,并使用系统调用zip工具来验证每个jar文件是否正常。
立刻动手:
如果熟悉find命令的话,如下代码即可搞定:
$ bash
bash-2.03$ find . -type f -name \*.jar -exec zip -T {} \;
这次我们用Scala结合系统调用来完成这个任务, Test.scala代码如下:
import java.io.File
import sys.process._
import actors._
import Actor._
def isJarFile(file: File) =
if(file.isFile && file.getName.endsWith(".jar")) true else false
/**
* 遍历找出所有jar并将其传递给处理函数.
*/
def walk[T](start: File)(jarFunc: File => T ): Unit = start match {
case file if isJarFile(start) =>
jarFunc(file)
case dir if start.isDirectory =>
for(f <- dir.listFiles)
walk(f)(jarFunc)
case _ =>
}
//Actor实现的命令执行器
val processor = actor{
loop {
react {
case cmd:String =>
cmd #>> new File("result.txt") ! //#>>执行结果同时写入文件
}
}
}
val start = new File(System.getProperty("user.home") + "/.m2/repository")
walk(start){ jarFile =>
//委托给Actor来异步处理
processor ! "zip -T " + jarFile.getAbsolutePath
}
运行,看结果
$ scala Test.scala
打开result.txt一看, 不出意外,一个jar出现问题
zip error: Zip file structure invalid (C:/Users/itang/.m2/repository/org/springframework/security/spring-security-acl/3.1.0.CI-SNAPSHOT/spring-security-acl-3.1.0.CI-20110715.170427-480.jar)
zip warning: unexpected signature on disk 0 at 74785
好吧, 我要去处理spring-security-acl的这个jar了。
分享到:
相关推荐
在浏览器上运行 Scala Scala.js ,Scala.js 是一个将 Scala 语言编译成 JavaScript 的工具,可以让你直接在浏览...
scala-js-ts-importer, Scala.js的打印机导入程序 从打字类型定义到 Scala.js的导入程序这里工具读取为 TypeScript 编写的类型定义文件,并将它们重写为可以使用 Scala.js的. scala 文件。过程不精确 100 %,因此...
大数据技术之Scala.docx
这个是UltraEdit编辑器中的关于Scala的高亮文件类型。
scala 英文版
Programming.in.Scala.pdf
Programming.Scala.2nd.Edition.2014.12;Programming.Scala.2nd.Edition.2014.12
Learning.Scala.2014.12.pdf
Scala.for.the.Impatient.2nd.Edition 最新版,最好的scala入门教程
响应式架构 消息模式Actor实现与Scala.Akka应用集成 高清扫描版
Scala.for.the.Impatient.2nd.2017.pdf
scala in depth, Manning.Scala.in.Depth.May.2012
Programming.in.Scala.2nd.Edition
Reactive.programming.with.scala.and.akka.pdf Reactive Programming with Scala and Akka
Scala.for.the.Impatient.2nd.Edition.2016.12.pdf(带书签)
Scala.in.Depth(2012.5)].Joshua.D.Suereth
为Java,Scala,Scala.macro,Scala.js,Scala.native,Eclipse和Maven构建集成器。 安装 生产发布 开发发布 适用于Scala IDE 4.7的Scalor插件1.X 相似的插件 入门 设置 建立并研究 插件功能 Scala 新增量 使用...
响应式架构 消息模式Actor实现与Scala.Akka应用集成 响应式架构 消息模式Actor实现与Scala.Akka应用集成
Scala.for.the.Impatient.2nd.Edition.2016.12,新手福音