用Maven写了个scala项目,项目里有shell脚本。
1.须要把scala代码打成一个jar包,调用shell脚原本执行jar包。
2.整个项目的目录结构仿照Apache的项目那样,bin和sbin存放shell脚本,conf存放配置文件,lib存放依赖包,logs存放日志,外面还有个README.md文件。shell
pom.xml中<build>
标签里添加scala插件apache
<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>
pom.xml中<build>
标签里添加assembly插件maven
<!-- 打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.xmlui
<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>
按照上面的配置,assembly打tar包会自动将scala代码打一个jar包,并把jar包复制到tar包中的lib目录下。可是这个jar包是没有主类的,没法执行。因此须要设置一下这个jar包的主类和依赖类路径。
在pom.xml的<build>
标签里添加jar插件spa
<!-- 打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>
可见不管在<build>
标签中,plugin配置顺序与执行顺序无关,先编译,再打jar包,最后assembly。
解压进入目录插件
完!scala