maven学习系列7----将依赖依赖文件打包到jar中
2017-07-04 20:57
169 查看
在发布项目的时候有可能会有这样的要求,一个jar包中即包含自研的代码,也包含依赖的库(例如log4j的jar包之后的),maven打包的时候有两种方法可以实现这种要求。
[html]
view plain
copy
<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>
lt;/build>
说明:
1,assembly插件功能强大,不仅可以打jar包还可以打zip、war各种包。
2,打的jar包名会以-with-dependencies结尾
3,这种方式打的jar包中,是将依赖包的classes文件与本项目的classes文件放在一起打成jar包的,如下图所示(com目录是项目代码的classes文件,org目录是引入了org.apache.log4j构件的classes目录,如果依赖其他构件也有可能有其他的classes文件的目录)
![](http://img.blog.csdn.net/20160515224435326?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[html]
view plain
copy
<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包解压之后如下图所示
![](http://img.blog.csdn.net/20160515224450091?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3,这种方式目前测试中发现一个不太好的地方,就是会把scope为test的包也拷贝到jar包中,虽然对功能无影响,但是会增加整个jar包的大小,并且增加了无用的jar包,如下图中的junit,目前还没找到原因,找到原因之后再增加相关内容(有知道的兄弟也可告知一下,谢谢:))。
![](http://img.blog.csdn.net/20160515224500435?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.NET/laiahu/article/details/7105277
1,使用maven-assembly-plugin插件
pom.xml配置如下[html]
view plain
copy
<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>
lt;/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配置如下:[html]
view plain
copy
<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#Resourceshttp://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.NET/laiahu/article/details/7105277
相关文章推荐
- maven学习系列7----将依赖依赖文件打包到jar中
- 使用maven的maven-assembly-plugin将jar包依赖打包到一个jar文件中
- Android 将被依赖的库项目打包成aar(非jar)文件
- maven学习系列8----将resources目录下的文件打包到jar包外
- Maven打包Spring boot,把依赖和配置文件及前端代码提取到jar文件外
- maven工程打包成runnable的jar包,拷贝资源文件和依赖jar包
- idea 打包包含依赖的JAR文件
- Maven打包Spring boot,把依赖和配置文件及前端代码提取到jar文件外
- 打包aar不包含依赖jar文件
- Android工程依赖:android中打包含有Activity以及资源文件的jar包在工程中调用
- Eclipse Maven工程 打包jar文件(包含依赖jar) 打包过程与执行说明
- Maven系列(八)assembly打包-程序和依赖jar包分开化+多环境
- Maven打包可执行的jar文件(包含所有依赖和不存在spring无法解析schema)
- 使用maven的maven-assembly-plugin将jar包依赖打包到一个jar文件
- ant编译打包可运行的jar文件,并包含所依赖的第三方jar包
- Android工程依赖:android中打包含有Activity以及资源文件的jar包在工程中调用
- Android工程依赖:android中打包带有Activity以及资源文件的jar包在工程中调用
- 【Ant】Ant实例(1)一个Java文件依赖于某jar包,需要打包部署
- 【Maven jar】打包单个或多个文件,有依赖jar包的将架包一起打包成一个jar包供别的项目引用
- java<jar<exe<setup.java项目打包为安装文件。不依赖jre。