Maven打包jar项目

  默认情况下,使用maven打包的jar项目(执行maven install)不会包含其他包引用,要想打包为带其他项目引用的jar,需要加入插件

  要得到一个可以直接在命令行通过java命令运行的JAR文件,还要满足两个条件:
  1、JAR包中的/META-INF/MANIFEST.MF元数据文件必须包含Main-Class信息。

  2、项目的依赖包也要合并在打的jar包中,即项目所有的依赖都必须在Classpath中

  有多种插件可以完成这个任务:

  1、这种方式需要使用mvn package命令来执行

<plugin>  
<!--         打包为jar,goal为package -->
            <artifactId>maven-assembly-plugin</artifactId>  
            <configuration>  
                <appendAssemblyId>false</appendAssemblyId>  
                <descriptorRefs>  
                    <descriptorRef>jar-with-dependencies</descriptorRef>  
                </descriptorRefs>  
                <archive>  
                    <manifest>  
                        <mainClass>com.guangshan.framework.App</mainClass>  
                    </manifest>  
                </archive>  
            </configuration>  
            <executions>  
                <execution>  
                    <id>make-assembly</id>  
                    <phase>package</phase>  
                    <goals>  
                        <goal>assembly</goal>  
                    </goals>  
                </execution>  
            </executions>  
        </plugin>

  默认命令为mvn assembly:assembly,加了executions之后添加了一些其他命令

  2、maven-shade-plugin,它可以让用户配置Main-Class的值,然后在打包的时候将值填入/META-INF/MANIFEST.MF文件。关于项目的依赖,它很聪明地将依赖JAR文件全部解压后,再将得到的.class文件连同当前项目的.class文件一起合并到最终的CLI包中,这样,在执行CLI JAR文件的时候,所有需要的类就都在Classpath中了。

  同样是mvn package

 <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-shade-plugin</artifactId>
           <version>1.2.1</version>
           <executions>
                      <execution>
               <phase>package</phase>
               <goals>
                     <goal>shade</goal>
               </goals>
               <configuration>
                     <transformers>
                       <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>hello.SayHello</mainClass>
                      </transformer>
                     </transformers>
               </configuration>
                </execution>
           </executions>
        </plugin>

   3、稍微复杂一点

  默认情况下,maven的默认打包:

  对应于同样的package生命周期阶段,Maven为jar项目调用了maven-jar-plugin,为war项目调用了maven-war-plugin,换言之,packaging直接影响Maven的构建生命周期。了解这一点非常重要,特别是当你需要自定义打包行为的时候,你就必须知道去配置哪个插件。

  maven-war-plugin可以读取Eclipse项目的配置,所以直接打的包就包含了其他的包引用(Deployment Assembly设置里面)

  maven-jar-plugin则不会包含引用的包,所以需要使用插件把依赖包打进来。

 

  Web 工程的输出发布包没什么好说的,因为 <packaging>war</packaging>,所以 mvn package 出来的 WAR 包里就有站点运行的所有内容了,用到的依赖会在 WEB-INF/lib 目录下列着。

  而对于那些 <packaging>jar</packaging> 的工程,用 mvn package 只会生成一个 JAR 包,它所依赖的各个类库仍然分散在本地仓库中,而我们的发布包应该包含这些第三方依赖的。

  在pom.xml中添加jar和dependency插件

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>cc.unmi.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>pre-package</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>com.jcraft</groupId>
                                    <artifactId>jsch</artifactId>
                                    <version>0.1.50</version>
                                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                                    <overWrite>true</overWrite>
                                </artifactItem>
                                <artifactItem>
                                    <groupId>commons-cli</groupId>
                                    <artifactId>commons-cli</artifactId>
                                    <version>1.3-SNAPSHOT</version>
                                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                                    <overWrite>true</overWrite>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

 

posted @ 2015-10-11 17:04  光闪  阅读(5959)  评论(0编辑  收藏  举报