1. 程式人生 > >使用maven-assembly-plugin外掛,將maven管理的遠端和本地依賴jar包打入可執行jar包

使用maven-assembly-plugin外掛,將maven管理的遠端和本地依賴jar包打入可執行jar包

最近在修改一個小工具,原來的做法是把依賴包都下載到本地目錄,打包時候使用fatjar打包整個專案依賴;現在修改為maven管理依賴包,使用maven-assembly-plugin外掛打包;如果依賴包全部是遠端預設的依賴配置,這樣沒有問題;但裡面有些是自己實現的本地依賴,這個時候打包就有問題了;因為本地依賴包scope配置為system,而預設的配置為runtime,所以本地依賴包沒有打進去

處理方案:使用自定義配置替代maven-assembly-plugin的預設配置

預設配置:

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>主程式入口方法</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>.</Class-Path>
                        </manifestEntries>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

這裡我們主要修改如下配置:

                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>

將這一段去掉,新增自定義配置檔案 assembly.xml

修改配置如下:

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>主程式入口方法</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>.</Class-Path>
                        </manifestEntries>
                    </archive>
                    <!-- 將這一段註釋掉 -->
                    <!--<descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>-->
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <!-- 增加配置 -->
                        <configuration>
                            <!-- assembly.xml檔案路徑 -->
                            <descriptors>
                                <descriptor>src/assembly/assembly.xml</descriptor>
                            </descriptors>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
assembly.xml 檔案配置如下:
<assembly>
    <id>jar-with-dependencies</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <!-- 預設的配置 -->
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
        <!-- 增加scope型別為system的配置 -->
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>true</unpack>
            <scope>system</scope>
        </dependencySet>
    </dependencySets>
</assembly>

可以看到,主要增加了scope型別為system的配置;這樣在打包的時候,就會把本地jar也打包進去

當然預設的配置也是可以使用的,這個時候可以把本地依賴上傳到maven倉庫;然後將dependency中路徑和scope配置去掉;這樣就可以使用預設配置進行打包,可以實現以上同樣效果

本文參考連結: