1

1.场景需求

用Maven写了个scala项目,项目里有shell脚本。
1.需要把scala代码打成一个jar包,调用shell脚本来执行jar包。
2.整个项目的目录结构仿照Apache的项目那样,bin和sbin存放shell脚本,conf存放配置文件,lib存放依赖包,logs存放日志,外面还有个README.md文件。

2.Maven打tar包

1.使用maven的scala插件来解决scala代码编译问题

pom.xml中<build>标签里添加scala插件

<plugin>
    <groupId>org.scala-tools</groupId>
    <artifactId>maven-scala-plugin</artifactId>
    <version>2.15.2</version>
    <executions>
        <execution>
            <id>scala-compile-first</id>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <includes>
                    <include>**/*.scala</include>
                </includes>
            </configuration>
        </execution>
    </executions>
</plugin>

2.使用assembly插件打tar包

pom.xml中<build>标签里添加assembly插件

<!-- 打tar包 -->
<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptors>
            <!-- 描述文件路径 -->
            <descriptor>assembly.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <!--名字任意 -->
            <id>make-tar-assembly</id>
            <!-- 绑定到package生命周期阶段上 -->
            <phase>package</phase>
            <goals>
                <!-- 只运行一次 -->
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

assembly插件的描述文件assembly.xml

<assembly>
    <!-- 打出的包名添加的内容 -->
    <id>release</id>
    <formats>
        <!-- 这里指明打tar.gz的压缩包 -->
        <format>tar.gz</format>
    </formats>
    <!-- tar包 -->
    <includeBaseDirectory>true</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <unpack>false</unpack>
            <scope>runtime</scope>
            <outputDirectory>lib</outputDirectory>
            <!-- lib中的依赖包是否包含自己写的代码打成的jar包 -->
            <useProjectArtifact>true</useProjectArtifact>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <!-- 想要复制的文件目录 -->
            <directory>bin</directory>
            <!-- 复制到tar包中的目录 -->
            <outputDirectory>bin</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>sbin</directory>
            <outputDirectory>sbin</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>logs</directory>
            <outputDirectory>logs</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>conf</directory>
            <outputDirectory>conf</outputDirectory>
        </fileSet>
    </fileSets>
    <files>
        <file>
            <!-- 想要复制的文件 -->
            <source>README.md</source>
            <!-- 复制到tar包中目录 -->
            <outputDirectory>.</outputDirectory>
        </file>
    </files>
</assembly>

3.解决主类找不到问题

按照上面的配置,assembly打tar包会自动将scala代码打一个jar包,并把jar包复制到tar包中的lib目录下。但是这个jar包是没有主类的,无法执行。所以需要设置一下这个jar包的主类和依赖类路径。
在pom.xml的<build>标签里添加jar插件

<!-- 打jar包 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <!-- 定义jar包中MANIFEST.MF文件 -->
            <manifest>
                <addClasspath>true</addClasspath>
                <!-- 依赖包路径前缀,这里本jar包与它依赖的jar包都放置在lib中,所以前缀就是当前目录,不填即可 -->
                <classpathPrefix/>
                <mainClass>GraphDBLoaderSparkRunner</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

3.运行

image.png
可见无论在<build>标签中,plugin配置顺序与执行顺序无关,先编译,再打jar包,最后assembly。
image.png
解压进入目录
image.png

完!


Wish大人
79 声望8 粉丝