通过 Maven 编译打包 Java + Scala 混合项目

举报
痩风 发表于 2020/08/04 14:57:15 2020/08/04
【摘要】 项目中需要对 Java + Scala 编写的 Maven 项目进行编译打包,由于依赖了部分外部 jar 包,也就是部分 jar 包没有在 pom.xml 中指定,导致编译失败。 那要如何编译 Java + Scala 混合项目呢?本文做个实践和分享。

1 - 问题描述

1.1 背景说明

项目中需要对 Java + Scala 编写的 Maven 项目进行编译打包,由于依赖了部分外部 jar 包,也就是部分 jar 包没有在 pom.xml 中指定,导致编译失败。

1.2 存在的问题

网络上能比较常见的打包 Scals 项目的方法,大多是引入了 org.scala-tools.maven-scala-plugin 插件(https://mvnrepository.com/artifact/org.scala-tools/maven-scala-plugin),其配置方式如下:

<plugin>
    <groupId>org.scala-tools</groupId>
    <artifactId>maven-scala-plugin</artifactId>
    <version>2.15.2</version>
    <configuration>
        <recompileMode>modified-only</recompileMode>
    </configuration>
    <executions>
        <execution>
            <id>main-scalac</id>
            <phase>process-resources</phase>
            <goals>
                <goal>add-source</goal>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

该插件从2011年起就没有更新过,官网地址也已失效,无法找到有效的支持文档。

2 - 问题解决

2.1 方法一:通过scope=system引入外部依赖

Maven 支持在 dependency 中引入系统依赖,其中 scope = system 与 scope = provided 的依赖范围一致:只在编译和测试范围内有效,运行时范围内无效。具体配置示例如下:

<dependency>
    <groupId>com.shoufeng.bigdata</groupId>
    <artifactId>spark-client</artifactId>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/spark-client.jar</systemPath>
</dependency>

将所有的外部 jar 包都通过这种方式引入,即可正常编译。但由于外部依赖包通常都会比较多,这种方式维护成本太高,所以不予考虑。

2.2 方法二:通过新插件指定外部依赖

经过搜索,找到了一款新插件:https://mvnrepository.com/artifact/net.alchim31.maven/scala-maven-plugin,pom.xml 中这样配置:

<plugin>
    <groupId>net.alchim31.maven</groupId>
    <artifactId>scala-maven-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
        <execution>
            <id>scala-compile-first</id>
            <phase>process-resources</phase>
            <goals>
                <goal>add-source</goal>
                <goal>compile</goal>
            </goals>
        </execution>
        <execution>
            <id>scala-test-compile</id>
            <phase>process-test-resources</phase>
            <goals>
                <goal>add-source</goal>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <args>
            <!-- 编译时使用 libs 目录下的 jar 包,通过 mvn scala:help 查看说明 -->
            <arg>-extdirs</arg>
            <arg>${project.basedir}/libs</arg>
        </args>
        <scalaVersion>2.11.8</scalaVersion>
    </configuration>
</plugin>

通过 -extdirs 参数,指定外部依赖的 jar 包。

其他参数的查看:在终端窗口中,通过命令 mvn scala:help 查看主要配置项参数,例如:

image.png

更详细的使用说明,请参考:http://davidb.github.io/scala-maven-plugin/example_java.html

编译、打包用法:

(1) 直接在 IDEA 的 Maven -> Project -> Lifecucle -> compile | package 进行编译或打包;

(2) 在终端窗口,通过如下命令进行编译打包:

mvn clean scala:compile compile package

说明:在 compile 前加 scala:compile,这是该插件提供的选项,表示:先编译 Scala,再编译 Java,最后打包。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。