• 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>
  • 相关阅读:
    JDK的KeyTool和KeyStore等加密相关
    关于分布式事务的随笔[待续]
    Netty实例几则
    Disruptor快速入门
    Java获取系统环境信息
    JDK的BIO, NIO, AIO
    四种常用IO模型
    JDK的多线程与并发库
    递归转换为迭代的一种通用方式
    二叉树的java实现
  • 原文地址:https://www.cnblogs.com/guangshan/p/4869558.html
Copyright © 2020-2023  润新知