`
itang
  • 浏览: 71359 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

scala.sys.process简介及实战

阅读更多

 

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.zip

    Scala.js是Scala社区的一个重要里程碑,它允许开发者使用强大的Scala编程语言编写前端应用,然后通过编译转换为JavaScript代码,进而实现在浏览器环境中运行。这一技术极大地拓宽了Scala的应用领域,使得开发者能够...

    scala-js-ts-importer, Scala.js的打印机导入程序.zip

    scala-js-ts-importer, Scala.js的打印机导入程序 从打字类型定义到 Scala.js的导入程序这里工具读取为 TypeScript 编写的类型定义文件,并将它们重写为可以使用 Scala.js的. scala 文件。过程不精确 100 %,因此...

    Scala.uew UltraEdit关于Scala的wordfiles

    这个是UltraEdit编辑器中的关于Scala的高亮文件类型。

    大数据技术之Scala.docx

    马丁·奥德斯基是一个编译器及编程的狂热爱好者,希望发明一种语言,能够让写程序这样的基础工作变得高效、简单。因此,Scala语言的设计融合了Java语言的特点,并且加入了函数式编程语言的特点,推动了Java编程语言...

    Programming.in.Scala.pdf

    《Programming in Scala.pdf》是一本专注于Scala编程语言的书籍。Scala是一种现代的多范式编程语言,专为可扩展性而设计。该书旨在为读者提供深入理解Scala语言的教程。 ### 描述 描述中提及的内容表明,...

    移植到 Scala.js 的 简单HTML5 Canvas游戏_Scala_代码_下载

    1. **Scala.js**: Scala.js是Scala编程语言的一个编译器插件,它允许开发者使用Scala语法编写前端代码,并将其编译成可执行的JavaScript代码。这使得开发者可以利用Scala的强大特性和类型系统来开发Web应用,同时...

    响应式架构 消息模式Actor实现与Scala.Akka应用集成 高清扫描版

    响应式架构 消息模式Actor实现与Scala.Akka应用集成 高清扫描版

    scala-2.12.11.tgz

    Spark2及以上版本需要Scala2.12或更高版本作为其编译基础,因为这些版本的Spark和Scala之间的API进行了优化和调整,以提高性能和兼容性。 在安装Scala之前,确保你的系统已经安装了Java Development Kit (JDK)。JDK...

    scala-2.12.14.zip&scala-2.12.11.tgz Linux版本压缩包.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象编程和函数式编程的概念,被广泛应用于大数据处理和分布式计算领域,特别是在Apache Spark等框架中。标题提到的"scala-2.12.14.zip&scala-2.12.11.tgz"是Scala的...

    scala库 by maven依赖

    &lt;scala.version&gt;2.13.8&lt;/scala.version&gt; &lt;scalatest.version&gt;3.2.10&lt;/scalatest.version&gt; &lt;!-- Scala编译器和运行时 --&gt; &lt;groupId&gt;org.scala-lang &lt;artifactId&gt;scala-library ${scala.version} &lt;!-...

    linux上安装scala资源包 scala.zip

    以下将详细介绍如何在Linux上安装Scala资源包`scala.zip`以及进行Scala编程操作。 1. **下载Scala资源包** 首先,你需要从Scala的官方网站(https://www.scala-lang.org/download/)下载最新版本的Scala安装包。...

    scalor-maven-plugin:用于Java,Scala,Scala.macro,Scala.js,Scala.native,Eclipse和Maven的构建集成器

    为Java,Scala,Scala.macro,Scala.js,Scala.native,Eclipse和Maven构建集成器。 安装 生产发布 开发发布 适用于Scala IDE 4.7的Scalor插件1.X 相似的插件 入门 设置 建立并研究 插件功能 Scala 新增量 使用...

    dreampie-play-scala.zip

    导入IDEA,VCS-&gt;Checkout from Version Control-&gt;Github(如果没有在plugin里下载或启用) 然后输入项目地址 https://github.com/Dreampie/dreampie_scala.git 确定  2.导入Eclipse,Import-&gt;Git-&gt;Projects ...

    scalajs-vue, Vue.js的Scala.js 绑定和示例应用程序.zip

    scalajs-vue, Vue.js的Scala.js 绑定和示例应用程序 scalajs-vue用于 Vue.js的Scala.js-绑定和示例应用程序要作为图书馆使用,只要从https://jitpack.io/#fancellu/scalajs-vue 示例应用展示了使用 Scala.j

    scala-2.13.8 解压安装版

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala-2.13.8 解压安装版"提供了一个无需安装过程的便捷方式来使用Scala开发环境。以下是关于Scala-2.13.8版本的一些关键知识点: 1. ...

    scala-2.12.11.zip

    - Scala解释器(scala.bat) - 文档(包括API文档和用户指南) - 示例代码 - 可能还包括用于构建Scala项目的构建工具,如sbt(Scala Build Tool) 要开始使用Scala,开发者需要解压这个压缩包,将Scala的bin目录...

    scala-2.12.13.tgz

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念,为开发者提供了丰富的工具集。这个"scala-2.12.13.tgz"文件是Scala编程语言的一个版本,针对Linux操作系统提供的安装包。tgz(tar.gz)格式...

    Scala数据绑定框架Binding.scala.zip

    Binding.scala 是 Scala 上的数据绑定框架,既可以运行在 JVM 上,也可以通过 Scala.js 编译成 JavaScript 运行在 Node.js 或者浏览器中。Binding.scala 也是一套动态页面开发框架,使你可以直接在代码中内嵌 ...

    scala-2.10.2

    scala.sys - Interaction with other processes and the operating system. scala.util.matching - Pattern matching in text using regular expressions. scala.util.parsing.combinator - Composable combinators ...

Global site tag (gtag.js) - Google Analytics