1. 程式人生 > >maven學習系列7----將依賴依賴檔案打包到jar中

maven學習系列7----將依賴依賴檔案打包到jar中

在釋出專案的時候有可能會有這樣的要求,一個jar包中即包含自研的程式碼,也包含依賴的庫(例如log4j的jar包之後的),maven打包的時候有兩種方法可以實現這種要求。

1,使用maven-assembly-plugin外掛

pom.xml配置如下

         <build>
		<plugins>
			<plugin>
			    <artifactId>maven-compiler-plugin</artifactId>  
			    <configuration>  
			        <source>1.7</source>  
			        <target>1.7</target>  
			        <encoding>${project.build.sourceEncoding}</encoding>  
			    </configuration>  
			</plugin>
	        <plugin>
	           <artifactId>maven-assembly-plugin</artifactId>
		        <configuration>
		          <descriptorRefs>
		            <descriptorRef>jar-with-dependencies</descriptorRef>
		          </descriptorRefs>
		          <archive>  
                        <manifest>  
                            <mainClass>com.itsenlin.Helloworld</mainClass>
                        </manifest>
                   </archive>
		        </configuration>
		        <executions>
		          <execution>
		            <id>make-assembly</id> <!-- this is used for inheritance merges -->
		            <phase>package</phase> <!-- bind to the packaging phase -->
		            <goals>
		              <goal>single</goal>
		            </goals>
		          </execution>
		        </executions>
	        </plugin>
		</plugins>
	</build>

說明:
  • 1,assembly外掛功能強大,不僅可以打jar包還可以打zip、war各種包。
  • 2,打的jar包名會以-with-dependencies結尾
  • 3,這種方式打的jar包中,是將依賴包的classes檔案與本專案的classes檔案放在一起打成jar包的,如下圖所示(com目錄是專案程式碼的classes檔案,org目錄是引入了org.apache.log4j構件的classes目錄,如果依賴其他構件也有可能有其他的classes檔案的目錄)

                

2,將依賴的jar包拷貝到target/classes目錄下

因為maven預設是將target/classes目錄下所有檔案打成jar包,所以我們可以配置在編譯的時候將依賴的構件拷貝到target/classes目錄下,注意這種方法需要配置classpath。pom.xml配置如下:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>  
            <configuration>  
                <source>1.7</source>  
                <target>1.7</target>  
                <encoding>${project.build.sourceEncoding}</encoding>  
            </configuration>  
        </plugin>
         <plugin>  
            <artifactId>maven-jar-plugin</artifactId> 
            <configuration>  
                <archive>  
                    <manifest>  
                        <!-- 告知 maven-jar-plugin新增一個 Class-Path元素到 MANIFEST.MF檔案,以及在Class-Path元素中包括所有依賴項 -->  
                        <addClasspath>true</addClasspath>  
                        <!-- 所有的依賴項應該位於 lib資料夾  -->
                        <classpathPrefix>lib/</classpathPrefix>  </span>
                       <!--  當用戶使用 lib命令執行JAR檔案時,使用該元素定義將要執行的類名  -->
                        <mainClass>com.itsenlin.Helloworld</mainClass>
                    </manifest>
                </archive>
            </configuration>  
        </plugin>
        
        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!-- ${project.build.directory}為Maven內建變數,預設為target --> 
                        <outputDirectory>${project.build.directory}/classes/lib</outputDirectory></strong></span>
                        <!-- 表示是否不包含間接依賴的包  -->
                        <excludeTransitive>false</excludeTransitive>
                        <!-- 表示複製的jar檔案去掉版本資訊 --> 
                        <stripVersion>true</stripVersion>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
說明:
  • 1,這種方法與不把依賴打到jar包內的配置區別就是拷貝依賴包的位置有變化,見上面紅色部分
  • 2,jar包解壓之後如下圖所示

               

  • 3,這種方式目前測試中發現一個不太好的地方,就是會把scope為test的包也拷貝到jar包中,雖然對功能無影響,但是會增加整個jar包的大小,並且增加了無用的jar包,如下圖中的junit,目前還沒找到原因,找到原因之後再增加相關內容(有知道的兄弟也可告知一下,謝謝:))。

                  

參考:

http://maven.apache.org/plugins/maven-assembly-plugin/usage.html#Resources

http://blog.csdn.net/laiahu/article/details/7105277