zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    2015.2.27 UltraEdit中显示XML结构
    2015.1.31 DataGridView自动滚动到某行
    2015.1.15 利用函数实现将一行记录拆分成多行记录 (多年想要的效果)
    2015.1.15 利用Oracle函数返回表结果 重大技术进步!
    2015.1.15 利用Oracle函数插入表结构 Bulk collect into 不用循环,简洁高效
    2015.1.8 Left join 左连接
    2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
    delphi 遍历窗口
    delphi 访问 protected 属性 哈哈
    clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈
  • 原文地址:https://www.cnblogs.com/guangshan/p/4869558.html
Copyright © 2011-2022 走看看