1.如何在打包后的MANIFEST.MF中申明Main-Class和Class-Path?在pom.xml文件中添加以下配置,若不添加此配置,则生成默认的MANIFEST.MF
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
<mainClass>com.broada.Startup</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
#没配置maven-jar-plugin
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: XX
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_121
#配置maven-jar-plugin
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: XX
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_121
Class-Path:lib/spring-tx-4.3.11.RELEASE.jar lib/dubbo-2.8.4.171113.jar lib/aopalliance-1.0.jar lib/netty-3.7.0.Final.jar
Main-Class: com.xx.Startup
2.将依赖包打包到指定目录
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy</goal> <!-- copy:拷贝指定依赖包到dependency(默认)或指定目录下,copy-dependencies: 拷贝依赖包-->
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!--<outputDirectory>${project.build.directory}/lib</outputDirectory>-->
</artifactItem>
</artifactItems>
</configuration>
<!-- 不设置该输出目录,则默认dependency-->
<!--<configuration>-->
<!--<outputDirectory>${project.build.directory}/lib</outputDirectory>-->
<!--</configuration>-->
</execution>
</executions>
</plugin>
goal:
- copy: 将指定的依赖包拷贝到指定的目录(默认为dependency)
- unpack: 将指定的依赖包解压后拷贝到指定目录
- copy-dependencies: 将项目所有依赖包拷贝到指定目录
- unpack-dependencies: 将项目所有依赖包解压后拷贝到指定目录
outputDirectory: 指定依赖包的输出目录,若不指定,默认为dependency
3.指定需要打包的资源文件
<!-- 不设置resources情况下,默认加载src/main/resources下面的资源文件和src/main/java下的class文件,若定义了resources,则默认不会加载resources下面的文件,需指定-->
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
- 若在pom.xml文件中的<build>中不指定<resources>,则打包默认加载src/main/resources下的所有资源文件以及src/main/java下的所有.class文件
- 若在<build>中指定了<resources>属性,则默认不会加载src/main/resources下面的资源文件,需单独指定
- 默认情况下打包只会加载src/main/java下的.class文件,若想加载该目录下的其它文件,可用<include>属性单独进行指定
- 若在<resource>中指定了src/main/java,则打包后会加载该目录下的所有文件,包括.java文件,可用<exclude>属性排除
4.maven-assembly-plugin插件打tar.gz包
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<!--
<configuration>
<archive>
<manifest>
<mainClass>com.xx.Startup</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
-->
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
<finalName>appName</finalName>
</configuration>
<executions>
<execution>
<id>build-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
descriptorRef是提供的默认打包方式,其包含bin、src、jar-with-dependencies、project,一般采用自行定义打包内容,下图是自定义的assembly.xml文件
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>V1.0</id>
<formats>
<format>tar.gz</format>
</formats>
<fileSets>
<fileSet>
<directory>src/main/resources/conf</directory>
<outputDirectory>./conf</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<directory>target/classes</directory>
<outputDirectory>./classes</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>./lib</outputDirectory>
<excludes>
<exclude>${groupId}:${artifactId}</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>
打包后默认包名为${artifactId}-${id}.tar.gz,artifactId为工程创建时的定义的值,id为assembly.xml中定义的值