默认情况下,使用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>