Maven打tar包(Scala項目,Apache目錄結構)

1.場景需求

用Maven寫了個scala項目,項目裏有shell腳本。
1.須要把scala代碼打成一個jar包,調用shell腳原本執行jar包。
2.整個項目的目錄結構仿照Apache的項目那樣,bin和sbin存放shell腳本,conf存放配置文件,lib存放依賴包,logs存放日誌,外面還有個README.md文件。shell

2.Maven打tar包

1.使用maven的scala插件來解決scala代碼編譯問題

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>

2.使用assembly插件打tar包

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>

3.解決主類找不到問題

按照上面的配置,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>

3.運行

image.png
可見不管在<build>標籤中,plugin配置順序與執行順序無關,先編譯,再打jar包,最後assembly。
image.png
解壓進入目錄
image.png插件

完!scala

相關文章
相關標籤/搜索