sbt与maven 有什么不同

张映 发表于 2019-08-05

分类目录: hadoop/spark/scala

标签:, ,

sbt功能很强大,也很灵活,但是灵活的代价就是比较复杂。

1,sbt下载的包默认在~/.ivy2/目录下,maven下的包在~/.m2下面。sbt可以使用maven的包。

2,sbt可以增量编译,maven不行

3,sbt直接运行,会进入命令行模式下。交互方式,还是比较方便的

4,sbt产生多版本包时,打包会比较麻烦,需要解决冲突。而maven不需要,根据配置的版本号加载包

5,sbt命令根maven命令,基本上差不多,但有一些不同。例如:mvn install,sbt publishLocal

6,加载包的配置不同,本文重点

6.1,配置版本和组织

//sbt
organization := "com.demo"
name := "myscala"
version := "0.1"

//maven
<groupId>com.demo</groupId>
<artifactId>myscala</artifactId>
<version>0.1</version>

6.2,加入源

//sbt
resolvers += "Scala-Tools Maven2 Repository" at "http://scala-tools.org/repo-releases"

//本地maven源
resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"

//maven
<repositories>
    <repository>
        <id>scala-tools.org</id>
        <name>Scala-Tools Maven2 Repository</name>
        <url>http://scala-tools.org/repo-releases</url>
    </repository>
</repositories>

6.3,构建源

//sbt
scalaSource in Compile := baseDirectory.value / "src/main/scala"
unmanagedResourceDirectories in Compile += baseDirectory.value / "src/main/resources"
unmanagedResourceDirectories in Compile += baseDirectory.value / "src/main/conf"

//maven
<sourceDirectory>src/main/scala</sourceDirectory>
<resources>
    <resource>
        <directory>src/main/resource</directory>
    </resource>
    <resource>
        <directory>src/main/conf</directory>
    </resource>
</resources>

6.4,加载包,并排除不需要的包

//sbt
//方法1
libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.3.0" exclude("javax.servlet")
//方法2
libraryDependencies +=
 "org.apache.spark" % "spark-core_2.11" % "2.3.0" excludeAll(
 ExclusionRule(organization = "javax.servlet")
 )

//maven
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.3.0</version>
    <exclusions>
        <exclusion>
             <groupId>javax.servlet</groupId>
             <artifactId>*</artifactId>
        </exclusion>
     </exclusions>
</dependency>

6.5,打包

//sbt
isSnapshot := true
publishTo := {
 val nexus = "http://artifactory.xxxxxx.com/artifactory/"
 if (isSnapshot.value)
 Some("snapshots" at nexus + "snapshots")
 else
 Some("releases" at nexus + "releases")
}

credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")

//maven
<distributionManagement>
    <repository>
        <id>artifactory</id>
        <name>xxxxxx</name>
        <url>http://artifactory.xxxxxx.com/artifactory/xxxxxx/</url>
    </repository>
    <snapshotRepository>
        <id>artifactory</id>
        <name>xxxxxx</name>
        <url>http://artifactory.xxxxxxx.com/artifactory/xxxxxxx/</url>
    </snapshotRepository>
</distributionManagement>

6.6,添加包依赖

//sbt
//单个
libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.3.0" % "test"
//多个
libraryDependencies ++= Seq(
    "org.apache.spark" % "spark-core_2.11" % "2.3.0",
    "org.apache.spark" % "spark-sql_2.11" % "2.3.0",
    "com.alibaba" % "fastjson" % "1.2.49"
)

//maven
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.3.0</version>
    <scope>test</scope>
</dependency>


转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/hadoop/2167.html