maven學習系列7----將依賴依賴檔案打包到jar中
阿新 • • 發佈:2019-02-08
在釋出專案的時候有可能會有這樣的要求,一個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