Maven复习
Contents
快速升级
利用软链接方式来进行升级
软链接目录:~/maven/current
代表当前要使用的版本
具体某个版本的maven: ~/maven/maven3.0
具体某个版本的maven: ~/maven/maven3.1
当要切换时,将软链接指向某个具体的版本的maven即可。如:
ln -s ~/maven3.0 ~/maven/current
将环境变量,只需要指向~/maven/current
即可,这样子,在切换版本时,就不用修改环境变量了.
配置maven
将maven安装目录下的conf
目录,复制一份settings.xml
到~/.m2/settings.xml
中。然后在这里配置maven的环境。在使用IDE时,记得修改maven的配置,指向系统中的maven,而不要使用IDE自带的maven(还有IDE里maven的配置的东西 )
设置代理
<proxies>
<proxy>
<id>my-proxy</id> <!-- 代理的ID -->
<active>true</active><!-- 是否激活 -->
<protocol>http</protocol><!-- 代理所使用的协议 -->
<host>ip</host><!--这里填写代理服务器的IP地址-->
<port>port</port><!-- 这里填写代理服务器的端口 -->
<username>usrename</username><!-- 代理服务器认证的用户名 -->
<password>******</password><!-- 代理服务器认证的用户密码 -->
<nonProxyHosts>localhost|127.0.0.1</nonProxyHosts><!-- 不需要代理的地址,用|分隔,支持通配符* -->
</proxy>
</proxies>
将eclipse运行在JDK上,而不是默认的JRE上
eclipse.ini
文件
在 -vmargs 之前添加以下内容
-vm
/path/to/jdk/bin/javaw.exe(windows下)
/path/to/jdk/bin/java(*nix下)
Maven使用的环境变量
MAVEN_OPTS
这个是将JVM参数,传递给maven,因为maven本质上是Java命令。比如,将这个环境变量的参数值设置为: -Xms128m -Xmx512m
M2_HOME
这个环境变量,是指向maven的安装目录的。如~/maven/current
Maven的约定
代码位置
主体代码放在 src/main/java
中
测试代码放在 src/test/java
中
默认scope范围
如果不指定依赖的范围,默认就是 comiple
编译输出目录
target/classes/
默认的打包方式
jar
包输出目录为
target/
自定义源码目录
在build
元素下配置:
<sourceDirectory>src/java</sourceDirectory>
即可
超 pom.xml
它在maven安装目录下的M2_HOME/lib/maven-x.x.x-uber.jar
中的org/apache/maven/project/pom-4.0.0.xml
目录下.(Maven2)
M2_HOME/lib/maven-model-builder-x.x.x.jar
中的org/apache/maven/model/pom-4.0.0.xml
源码编译级别
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
Maven常用命令
mvn help:system
mvn clean compile
mvn clean test
mvn clean package
mvn clean install
mvn dependency:list
mvn dependency:tree
mvn dependency:analyze
查看插件的帮助
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
用于多模块构建
进入parent项目的根目录,执行以下命令
构建指定模块
mvn clean install -pl 模块1的路径(相对于parent的路径,注意是路径),模块2的路径(相对于parent的路径,注意是路径)
构建指定模块,以及这些模块所依赖的模块
mvn clean install -pl 模块1的路径(相对于parent的路径,注意是路径),模块2的路径(相对于parent的路径,注意是路径) -am
构建依赖于指定模块以及该模块本身
mvn clean install -pl 模块的路径(相对于parent的路径,注意是路径) -amd
指定从哪个模块开始构建
mvn clean install -rf 模块1的路径(相对于parent的路径,注意是路径)
忽略测试步骤
-Dmaven.test.skip=true
生成可执行的Jar包
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<transformers>
<transformer implementation = "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>这里填写你的Main类</mainClass>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
使用这个插件打包完时,会生成两个jar,一个是original
开头的,这个jar包是不可以执行的,另一个就是可执行的jar包。
Maven的坐标
groupId
所属的实际项目
artifactId
项目中的某个模块
version
模块的版本
packaging
模块的打包方式
classifier
定义输出的一些附属构件。
项目构件的文件名的规则一般是:artifactId-version[-classifier].packaging
Maven依赖范围
compile
编译范围。也是默认的依赖范围。对编译,测试,运行三种classpath都有效。
test
测试依赖范围。只对测试classpath有效。在编译主代码,或者运行项目的使用时,无法使用此依赖。如: JUnit
provided
已提供依赖范围。对编译和测试classpath有效,但运行时无效。比如:servlet-api,它是tomcat等容器提供的。
runtime
运行时依赖。对测试和运行有效,但编译主体代码时无效。如:JDBC驱动。
system
系统范围依赖。它和 provided 一样。但使用system依赖,必须通过 systemPath
元素,显式指定依赖文件的路径。这类依赖不是通过maven仓库,而是与本机系统绑定的,极可能是不可移植,应尽管避免使用。
import
导入依赖范围。不会对三种(编译,测试,运行)classpath产生实际影响。
依赖传递调解
原则:路径最近者优先、第一声明者优先
部署到远程仓库
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://127.0.0.1:8080/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://127.0.0.1:8080/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
如果远程仓库需要认证,则在~/.m2/settings.xml
里配置
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
镜像
在~/.m2/settings.xml
里配置
<mirrors>
<mirror>
<id>nexus-osc</id>
<mirrorOf>*</mirrorOf>
<name>Nexus osc</name>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
</mirrors>
Maven 搜索
clean生命周期
- pre-clean
- clean
- post-clean
default生命周期
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install
- deploy
site生命周期
- pre-site
- site
- post-site
- site-deploy
命令行与生命周期
mvn clean: pre-clean, clean阶段
mvn test: default生命周期的形状到test的所有阶段。
mvn clean install: pre-clean, clean以及到default生命周期的开头到install阶段
mvn clean deploy site-deploy: pre-clean, clean以及default生命周期的所有阶段,site生命周期的所有阶段。
为源码打包
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
聚合项目
创建一个新的空白的maven项目.在该pom.xml
文件上, 配置如下的内容即可:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.emacsist</groupId>
<artifactId>Go</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>../mvn</module>
<module>../mvn2</module>
</modules>
</project>
注意, <module>../mvn</module>
这是相对当前项目的其他模块的目录的路径.
继承
在子模块的pom.xml里配置:
<parent>
<groupId>com.mycompany.app</groupId> <!--父pom的groupId-->
<artifactId>my-app</artifactId> <!--父pom的artifactId-->
<version>1</version>
<relativePath>../parent/pom.xml</relativePath><!--父pom.xml的位置-->
</parent>
在集成时, 别忘记了, 将父模块,也放到聚合模块中.
可继承的元素
- groupId:项目组ID
- version:项目版本
- description:项目的描述信息
- organization:项目的组织信息
- inceptionYear:项目的创始年份
- url:项目的URL地址
- developers:项目的开发者信息
- contributors:项目的贡献者信息
- distributionManagement:项目的部署配置
- issueManagement:项目的缺陷跟踪系统信息
- ciManagement:项目的持续集成系统信息
- scm:项目的版本控制系统信息
- mailingLists:项目的邮件列表信息
- properties:算定义的Maven属性
- dependencies:项目的依赖配置
- dependencyManagement:项目的依赖管理配置
- repositoryies:项目的仓库配置
- build:包括项目的源码目录配置,输出目录配置。插件配置,插件配置。插件管理配置等
- reporting:包括项目的报告输出目录配置,报告插件配置竺。
dependencyManagement结合继承的作用
dependencyManagement 结合继承, 主要是为了统一依赖的版本号.这时,在父pom.xml里使用dependencyManagement
,而在子模块里,使用dependencies
,但子模块里,并不指定版本号.这样子,它就会使用父的dependencyManagement中指定的依赖的版本了.
Maven的Jetty插件使用
httpConnector 参数
前缀都是:-Djetty.http.xxx=value
端口
默认为 8080 端口
port
mvn -Djetty.http.port=9999 jetty:run
监听主机
host
指定connector名
name
最大空闲时间
idleTimeout
关闭socket时的延时设置
soLinger
使用
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.0.6.v20130930</version>
<configuration>
<!-- Jetty容器配置 -->
<httpConnector>
<!-- 监听的端口 -->
<port>8080</port>
</httpConnector>
<!-- 热部署,间隔多少秒重新扫描文件,默认为0,即不进行热部署 -->
<scanIntervalSeconds>1</scanIntervalSeconds>
<!-- web应用配置 -->
<webApp>
<contextPath>/</contextPath>
<!-- web.xml路径 -->
<descriptor>${project.basedir}/WebContent/WEB-INF/web.xml</descriptor>
<allowDuplicateFragmentNames>true</allowDuplicateFragmentNames>
</webApp>
<!-- 生成classes的目录 -->
<classesDirectory>${project.basedir}/target/classes</classesDirectory>
<webAppSourceDirectory>${project.basedir}/WebContent/</webAppSourceDirectory>
</configuration>
</plugin>
Maven中的属性 property
内置属性
${basedir},表示项目的根目录
${version},表示项目的版本
pom属性
${project.build.sourceDirectory}: 表示项目的主源码目录。默认为
src/main/java
${project.build.testSourceDirectory}: 项目的测试源码目录。默认为
src/test/java
${project.build.directory}: 项目构建输出目录,默认为
target/
${project.outputDirector}: 项目主代码编译输出目录,默认为
target/classes/
${project.testOutputDirectory}: 项目测试代码编译输出目录,默认为
target/test-classes/
${project.groupId}: 项目的groupId
${project.artifactId}: 项目的artifactId
${project.version}: 项目的version,与${version}等价
${project.build.finalName}: 项目打包输出文件名,默认为${project.artifactId}-${project.version}.
自定义属性
<properties>
<property>
<my.prop>hello world</my.prop>
</property>
</properties>
settings 属性
这个可以引用settings.xml
文件元素值。如:
${settings.localRepository}
Java系统属性
可以通过mvn help:system
查看所有该属性值.如:
${user.home}
环境变量属性
都是以env.
开头。如:${env.JAVA_HOME}
.
可以通过mvn help:system
查看。
为不同环境使用不同配置
<profiles>
<profile>
<!-- 开发环境 -->
<id>dev</id>
<activation>
<!-- 是否是默认 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
</profile>
<profile>
<!-- 生产环境 -->
<id>production</id>
<properties>
<profile.active>production</profile.active>
<profile.scope>provided</profile.scope>
</properties>
</profile>
</profiles>
一般资源过滤
还要注意,默认情况下,只有pom.xml
时使用这些属性时,才会被解析。如果是在其他文件里,也要使用该属性时,默认情况下,是不是解析其他配置文件的占位符的变量的。
要开启maven解析其他资源文件来使用pom.xml里定义的属性,还需要配置如下:
<build>
<resources>
<resource>
<!-- 资源目录 -->
<directory>src/main/resources</directory>
<!-- 是否解析占位符${} -->
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<testResources>
<resource>
<!-- 资源目录 -->
<directory>src/test/resources</directory>
<!-- 是否解析占位符${} -->
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</testResources>
</build>
然后在使用时,通过参数-P
来激某个profile,如:
开发环境:
mvn clean install -Pdev
生产环境:
mvn clean install -Pproductino
web 资源过滤
要配置 maven-war-plugin
插件才行
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
<webResources>
<webResource>
<directory>WebContent</directory>
<!-- 解析web资源 -->
<filtering>true</filtering>
<includes>
<include>**/*.css</include>
<include>**/*.js</include>
</includes>
</webResource>
</webResources>
</configuration>
</plugin>
激活 profile
命令行激活
mvn clean install -PprofileId1,profileId2
settings.xml 文件显式激活
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
系统属性激活
<profiles>
<profile>
<activation>
<property>
<name>actProp</name>
<value>x</value>
</property>
</activation>
</profile>
</profiles>
这表示,如果存在系统属性actProp
,并且其值为x
,则激活该profile。如果没有value,则表示只要存在actProp
属性,就激活。
系统属性,通过如下传递:
mvn clean install -DactProp=x
操作系统激活
<profiles>
<profile>
<activation>
<os>
<name>Windows XP</name>
<family>Windows></family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
</activation>
</profile>
</profiles>
文件存在与否激活
<profiles>
<profile>
<activation>
<file>
<missing>x.properties</missing>
<exists>y.properties</exists>
</file>
</activation>
</profile>
</profiles>
默认激活
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
经典的 pom.xml 配置例子
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>4.0.0</modelVersion>
<!-- 所属项目名 -->
<groupId>jetty-demo</groupId>
<!-- 模块名 -->
<artifactId>jetty-demo</artifactId>
<!-- 版本 -->
<version>1.0.0</version>
<!-- 打包方式 -->
<packaging>war</packaging>
<!-- 项目的url -->
<url>http://emacsist.github.io</url>
<!-- 开发者人员 -->
<developers>
<developer>
<id>emacsist</id>
<name>Zhiyong yang</name>
<email>emacsist@qq.com</email>
<roles>
<role>admin</role>
</roles>
</developer>
</developers>
<!-- SpringMVC 版本 -->
<properties>
<spring.version>4.0.1.RELEASE</spring.version>
<!— checkstyle配置文件 —>
<!— config/sun_checks.xml - Sun Microsystems Definition (default).
config/maven_checks.xml - Maven Development Definitions.
config/turbine_checks.xml - Turbine Development Definitions.
config/avalon_checks.xml - Avalon Development Definitions.
—>
<checkstyle.config.location>config/maven_checks.xml</checkstyle.config.location>
</properties>
<!-- 这里填写项目的git地址 -->
<scm>
<connection>scm:git:git.coding.net/emacsist/Jetty_Maven.git</connection>
<developerConnection>scm:git:git.coding.net/emacsist/Jetty_Maven.git</developerConnection>
<url>git://git.coding.net/emacsist/Jetty_Maven.git</url>
</scm>
<!-- 使用 mvn site 命令生成站点报告,生成后的文件在 target/site/ 目录下 -->
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<configuration>
<dependencyLocationsEnabled>false</dependencyLocationsEnabled>
</configuration>
</plugin>
<!-- 报告里生成java doc -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.3</version>
<configuration>
<show>public</show>
</configuration>
</plugin>
<!-- 报告里生成源码目录树 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>2.5</version>
</plugin>
<!— mvn checkstyle:checkstyle checkstyle —>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.9.1</version>
</plugin>
<!-- 注意,要先执行一下 mvn package 之后再执行 mvn findbugs:gui 检查bugs —>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<xmlOutput>true</xmlOutput>
<effort>Max</effort>
</configuration>
</plugin>
<!-- 源码分析报告PMD -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.5</version>
<configuration>
<!-- 默认情况下,如果没有什么问题的话,它会忽略PMD的报告,这里是无论如何都显示报告 -->
<skipEmptyReport>false</skipEmptyReport>
<!-- 将所有模块的分析,集成到一起 -->
<aggregate>true</aggregate>
</configuration>
</plugin>
<!-- 更改记录,这个要配置上面的 scm 配置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-changelog-plugin</artifactId>
<version>2.3</version>
</plugin>
</plugins>
</reporting>
<build>
<!-- 源码目录 -->
<sourceDirectory>src</sourceDirectory>
<plugins>
<!--mvn source:jar 打包源码的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- mvn site 站点插件 -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
</plugin>
<!-- mvn javadoc:javadoc 用于生成java doc -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.3</version>
<configuration>
<show>private</show>
<nohelp>true</nohelp>
</configuration>
</plugin>
<!-- mvn pmd:pmd 源码分析插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.5</version>
<configuration>
<!-- 默认情况下,如果没有什么问题的话,它会忽略PMD的报告,这里是无论如何都显示报告 -->
<skipEmptyReport>false</skipEmptyReport>
<!-- 将所有模块的分析,集成到一起 -->
<aggregate>true</aggregate>
</configuration>
</plugin>
<!-- mvn jetty:run Jetty 插件 -->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.0.6.v20130930</version>
<configuration>
<!-- Jetty容器配置 -->
<httpConnector>
<!-- 监听的端口 -->
<port>8080</port>
</httpConnector>
<!-- 热部署,间隔多少秒重新扫描文件,默认为0,即不进行热部署 -->
<scanIntervalSeconds>1</scanIntervalSeconds>
<!-- web应用配置 -->
<webApp>
<contextPath>/</contextPath>
<!-- web.xml路径 -->
<descriptor>${project.basedir}/WebContent/WEB-INF/web.xml</descriptor>
</webApp>
<!-- 生成classes的目录 -->
<classesDirectory>${project.basedir}/target/classes</classesDirectory>
<webAppSourceDirectory>${project.basedir}/WebContent/</webAppSourceDirectory>
</configuration>
</plugin>
<!-- mvn clean package 打包 war 的插件 -->
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
<webResources>
<webResource>
<directory>WebContent</directory>
<!-- 解析web资源 -->
<filtering>true</filtering>
<includes>
<include>**/*.css</include>
<include>**/*.js</include>
</includes>
</webResource>
</webResources>
</configuration>
</plugin>
<!-- 编译器插件 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring dependencies start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring dependencies end -->
</dependencies>
</project>
编写Maven插件
创建一个maven-plugin项目:它本身也是一个maven项目,不过,packaging 必须是
maven-plugin
.可以使用maven-archetype-plugin
快速创建一个Maven插件项目为插件编写目标。每个插件都必须包含一个或多个目标,Maven称为
Mojo
(与POJO对应)。编写插件时,必须提供一个或者多个继承自AbstractMojo
类。为目标提供配置点。
编写代码,实现目标行为
错误处理及日志。
测试插件
一个简单的项目
Maven 打包分离 jar
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 复制依赖的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.your.company.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>