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.运行
可见无论在<build>
标签中,plugin配置顺序与执行顺序无关,先编译,再打jar包,最后assembly。
解压进入目录
完!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。