发表于: 2017-09-12 22:59:34

1 850


任务进展

       今天准备小课堂并演示,主要讲了maven常用的打包插件使用以及打jar、war、可执行jar、zip与tar包的方法。常规的打jar包其包含的只有class文件和资源文件,打war包可以自定义资源配置,打出来需放在web容器中才能运行,常用的web容器有jetty、tomcat和resin。

       重点是生成可执行jar包,这个在任务8和9中需要用到,打出可执行jar包在服务器上运行。有三种方式:

       1)使用maven jar和dependency插件,基本配置为:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-jar-plugin</artifactId>
   <version>3.0.2</version>
   <configuration>
       <archive>
           <manifest>
               <!-- 告知 maven-jar-plugin添加一个 Class-Path元素到 MANIFEST.MF文件,以及在Class-Path元素中包括所有依赖项 -->
               <addClasspath>true</addClasspath>
               <!-- 所有的依赖项应该位于 lib文件夹 -->
               <classpathPrefix>lib/</classpathPrefix>
               <!-- 当用户使用 lib命令执行JAR文件时,使用该元素定义将要执行的类名 -->
               <mainClass>com.jnshu.MybatisDemo</mainClass>
           </manifest>
       </archive>
   </configuration>
</plugin>
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-dependency-plugin</artifactId>
   <version>3.0.1</version>
   <executions>
       <execution>
           <id>copy-dependencies</id>
           <phase>package</phase>
           <goals>
               <goal>copy-dependencies</goal>
           </goals>
           <configuration>
               <outputDirectory>${project.build.directory}/lib</outputDirectory>
           </configuration>
       </execution>
   </executions>
</plugin>

二者结合,执行mvn package可生成可执行的jar包。

       2)使用maven-shade-plugin,基本配置为:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>3.1.0</version>
   <executions>
       <execution>
           <phase>package</phase>
           <goals>
               <goal>shade</goal>
           </goals>
           <configuration>
               <transformers>
                   <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                       <mainClass>com.jnshu.MybatisDemo</mainClass>
                   </transformer>
                   <!--<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">-->
                       <!--<resource>META-INF/spring.handlers</resource>-->
                   <!--</transformer>-->
                   <!--<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">-->
                       <!--<resource>META-INF/spring.schemas</resource>-->
                   <!--</transformer>-->
               </transformers>
           </configuration>
       </execution>
   </executions>
</plugin>

上面注释掉的部分为spring框架的配置,如果你的项目使用了spring框架,则必须加上此配置,否则会运行报错,找不着spring约束。

       3)使用maven-assembly-plugin,基本配置为:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-assembly-plugin</artifactId>
   <version>3.1.0</version>
   <configuration>
       <archive>
           <manifest>
               <mainClass>com.jnshu.MybatisDemo</mainClass>
           </manifest>
       </archive>
       <descriptorRefs>
           <descriptorRef>jar-with-dependencies</descriptorRef>
       </descriptorRefs>
   </configuration>
</plugin>

以上配置打包时必须执行mvn package assembly:single命令,否则不能执行。可以将assembly:single配置到插件中:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-assembly-plugin</artifactId>
   <version>3.1.0</version>
   <configuration>
       <archive>
           <manifest>
               <mainClass>com.jnshu.MybatisDemo</mainClass>
           </manifest>
       </archive>
       <descriptorRefs>
           <descriptorRef>jar-with-dependencies</descriptorRef>
       </descriptorRefs>
   </configuration>
   <executions>
       <execution>
           <id>make-assembly</id>
           <phase>package</phase>
           <goals>
               <goal>single</goal>
           </goals>
       </execution>
   </executions>
</plugin>

如此便可直接运行mvn package打出可执行jar包。

       实际的软件项目常常会有更复杂的打包需求,例如我们可能需要为客户提供一份产品的分发包,这个包不仅仅包含项目的字节码文件,还得包含依赖以及相关脚本文件以方便客户解压后就能运行,此外分发包还得包含一些必要的文档。

       assembly插件支持各种打包文件格式,包括zip、tar.gz、tar.bz2等等,通过一个打包描述文件,能够帮助用户选择具体打包哪些文件集合、依赖、模块、和甚至本地仓库文件,每个项的具体打包路径用户也能自由控制。

基本示例:

<assembly>
   <id>bin</id>
   <formats>
       <format>zip</format>
   </formats>
   <dependencySets>
       <dependencySet>
           <useProjectArtifact>true</useProjectArtifact>
           <outputDirectory>lib</outputDirectory>
       </dependencySet>
   </dependencySets>
   <fileSets>
       <fileSet>
           <outputDirectory>/</outputDirectory>
           <includes>
               <include>README.MD</include>
           </includes>
       </fileSet>
       <fileSet>
           <directory>target/classes</directory>
           <outputDirectory>classes</outputDirectory>
       </fileSet>
       <fileSet>
           <directory>src/main/resources</directory>
           <outputDirectory>resources</outputDirectory>
       </fileSet>
       <fileSet>
           <directory>src/main/scripts</directory>
           <outputDirectory>/bin</outputDirectory>
           <includes>
               <include>jquery-3.2.0.js</include>
           </includes>
       </fileSet>
   </fileSets>
</assembly>

         assembly.xml文件的id对应了其最终生成文件的classifier。

         formats定义打包生成的文件格式。

         dependencySets用来定义选择依赖并定义最终打包到什么目录。

         fileSets允许用户通过文件或目录的粒度来控制打包。

        最后一点,assembly插件对包含spring框架的项目打可运行jar包会报错,我没有试过更多的写法,网上有讲到这个问题:说是assembly插件的bug,所以推荐使用shade插件打包spring框架的项目。链接:http://chenzhou123520.iteye.com/blog/1706242

遇到问题

       无

明日计划

       codereview,写学习总结

收获

       maven常用打包插件使用

进度

任务开始时间:2017.09.8

预计demo时间:2017.09.15

是否有延期风险:无

禅道:http://task.ptteng.com/zentao/project-task-260.html


返回列表 返回列表
评论

    分享到