使用maven构建scala项目

构建及编译scala工程我使用过三种工具:sbt、gradle和maven。

感谢GFW,sbt的速度慢得让人心碎。即使使用诸如广谈公服等加速方案,也还是会遇到各种各样的问题(比如时不时的lock住)。所以pass。
gradle是最让人惊喜的一个方案,简洁便利上超过sbt,更远胜maven,执行速度也没短板。只有下载源码这问题让我头疼,但也是小问题。然而,关键是公司发布环境不支持gradle,所以一切休谈。
最后是maven。有人说比起gradle来,maven是老人脸上的皱纹。意思是maven的配置非常繁琐,显得过时了。比喻非常形象。但是老人的好处就是经验丰富,很多问题都能很快找到解决方案,虽然略嫌啰嗦但却让人放心。所以最终还是使用maven管理和构建生产环境中的scala项目。
介绍下如何使用maven构建scala工程。

编译

下面是一个示例pom文件:


 
    4.0.0
 
    org.chobit.scala
    scala-maven-build
    1.0-SNAPSHOT
    jar
 
    
        2.3.4
        2.13.1
        UTF-8
    
 
    
        
            org.scala-lang
            scala-compiler
            ${scala.version}
        
 
        
            junit
            junit
            4.12
            test
        
    
 
 
    
        
            
                org.scala-lang
                scala-compiler
                ${scala.version}
            
            
                org.scala-lang
                scala-reflect
                ${scala.version}
            
            
                org.scala-lang
                scala-library
                ${scala.version}
            
        
    
 
    
        src/main/scala
        src/test/scala
 
        
            
                org.scala-tools
                maven-scala-plugin
                2.15.2
                
                    
                        
                            compile
                            testCompile
                        
                    
                
            
        
 
        myApp
    
 

scala环境最重要的三个依赖:scala-compiler、scala-reflect和scala-library都可以通过scala-compiler及其间接依赖获取到。

一些依赖可能会间接引用不同版本的scala,所以在

<
dependencyManagement
>


中做了下scala版本的统一。



<
build
>


中使用了 maven-scala-plugin
插件来执行scala的编译,不然在测试执行时会提示“ 错误: 找不到或无法加载主类 chobit.MyDriver
”这样的错误。

打包

如果有打包需求的话建议使用assembly插件执行打包。assembly支持的打包方案非常丰富,算是同类产品里最好的。
看个打包的示例:
首先添加assembly插件

   
        org.apache.maven.plugins
        maven-assembly-plugin
        3.2.0
 
        
        
          
            src/main/assembly.xml
          
        
 
        
        
          
            make-assembly
            package
            
                single
            
          
        
    

这里的配置设置了两个重要信息:

  • 打包配置文件的具体位置:src/main/assembly.xml;
  • 在package阶段自动执行assembly插件;如果没有指明,就得执行

    mvn
    assembly
    :
    assembly


    命令来进行打包。

打包配置文件的详情:

 

 
    
    full
 
    
    
        zip
    
 
    
        
        
            
            /libs
            false
            
                
                org.chobit.wp:wordpress-client
            
        
    
 
    true
 
    
    
        
        
            
            /
            
            target
            
                *.jar
            
        
 
        
        
            /
            src/main/resources
            
                *.properties
                *.conf
            
        
 
        
        
            /shell
            shell
            
                *.sh
            
        
    

配置文件中的注释应该已经足够说明用法了。
这里的代码是从一个spark工程上copy来的,所以会有将工程打包成zip文件,又包含shell脚本这样的内容。

在windows主机上执行

mvn
clean
package


命令时,可能会遇到这样的错误:

[ERROR] OS=Windows and the assembly descriptor contains a *nix-specific root-relative reference (starting with slash): /
[ERROR] OS=Windows and the assembly descriptor contains a *nix-specific root-relative reference (starting with slash): /
[ERROR] OS=Windows and the assembly descriptor contains a *nix-specific root-relative reference (starting with slash): /shell

解决方案有两个:

  • 如果要把文件放在zip包下的根目录,可以直接将

    <
    outputDirectory
    >


    标签闭合,如:

    <
    outputDirectory
    /
    >

  • 如果要把文件放在zip包下的其他目录,可以使用相对路径,如:

    <
    outputDirectory
    >
    .
    /
    shell
    <
    /
    outputDirectory
    >

示例代码见: GitHub / Zhyea

参考文档