maven学习系列7----将依赖依赖文件打包到jar中

来源:互联网 发布:js屏幕图片自动旋转 编辑:程序博客网 时间:2024/05/18 02:58

在发布项目的时候有可能会有这样的要求,一个jar包中即包含自研的代码,也包含依赖的库(例如log4j的jar包之后的),maven打包的时候有两种方法可以实现这种要求。

1,使用maven-assembly-plugin插件

pom.xml配置如下

[html] view plain copy
  1.        <build>  
  2. <plugins>  
  3.     <plugin>  
  4.         <artifactId>maven-compiler-plugin</artifactId>    
  5.         <configuration>    
  6.             <source>1.7</source>    
  7.             <target>1.7</target>    
  8.             <encoding>${project.build.sourceEncoding}</encoding>    
  9.         </configuration>    
  10.     </plugin>  
  11.        <plugin>  
  12.           <artifactId>maven-assembly-plugin</artifactId>  
  13.         <configuration>  
  14.           <descriptorRefs>  
  15.             <descriptorRef>jar-with-dependencies</descriptorRef>  
  16.           </descriptorRefs>  
  17.           <archive>    
  18.                       <manifest>    
  19.                           <mainClass>com.itsenlin.Helloworld</mainClass>  
  20.                       </manifest>  
  21.                  </archive>  
  22.         </configuration>  
  23.         <executions>  
  24.           <execution>  
  25.             <id>make-assembly</id> <!-- this is used for inheritance merges -->  
  26.             <phase>package</phase> <!-- bind to the packaging phase -->  
  27.             <goals>  
  28.               <goal>single</goal>  
  29.             </goals>  
  30.           </execution>  
  31.         </executions>  
  32.        </plugin>  
  33. </plugins>  
  34. 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
  1. <build>  
  2.     <plugins>  
  3.         <plugin>  
  4.             <artifactId>maven-compiler-plugin</artifactId>    
  5.             <configuration>    
  6.                 <source>1.7</source>    
  7.                 <target>1.7</target>    
  8.                 <encoding>${project.build.sourceEncoding}</encoding>    
  9.             </configuration>    
  10.         </plugin>  
  11.          <plugin>    
  12.             <artifactId>maven-jar-plugin</artifactId>   
  13.             <configuration>    
  14.                 <archive>    
  15.                     <manifest>    
  16.                         <!-- 告知 maven-jar-plugin添加一个 Class-Path元素到 MANIFEST.MF文件,以及在Class-Path元素中包括所有依赖项 -->    
  17.                         <addClasspath>true</addClasspath>    
  18.                         <!-- 所有的依赖项应该位于 lib文件夹  -->  
  19.                         <classpathPrefix>lib/</classpathPrefix>  </span>  
  20.                        <!--  当用户使用 lib命令执行JAR文件时,使用该元素定义将要执行的类名  -->  
  21.                         <mainClass>com.itsenlin.Helloworld</mainClass>  
  22.                     </manifest>  
  23.                 </archive>  
  24.             </configuration>    
  25.         </plugin>  
  26.           
  27.         <plugin>  
  28.             <artifactId>maven-dependency-plugin</artifactId>  
  29.             <executions>  
  30.                 <execution>  
  31.                     <id>copy-dependencies</id>  
  32.                     <phase>prepare-package</phase>  
  33.                     <goals>  
  34.                         <goal>copy-dependencies</goal>  
  35.                     </goals>  
  36.                     <configuration>  
  37.                         <!-- ${project.build.directory}为Maven内置变量,缺省为target -->   
  38.                         <outputDirectory>${project.build.directory}/classes/lib</outputDirectory></strong></span>  
  39.                         <!-- 表示是否不包含间接依赖的包  -->  
  40.                         <excludeTransitive>false</excludeTransitive>  
  41.                         <!-- 表示复制的jar文件去掉版本信息 -->   
  42.                         <stripVersion>true</stripVersion>  
  43.                     </configuration>  
  44.                 </execution>  
  45.             </executions>  
  46.         </plugin>  
  47.     </plugins>  
  48. </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
阅读全文
0 0