快速升级

利用软链接方式来进行升级

软链接目录:~/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>

*表示镜像所有仓库。即对于远程仓库的请求,都会被该URL替代。

Maven 搜索

mvnrepository

OSChina

clean生命周期

  1. pre-clean
  2. clean
  3. post-clean

default生命周期

  1. validate
  2. initialize
  3. generate-sources
  4. process-sources
  5. generate-resources
  6. process-resources
  7. compile
  8. process-classes
  9. generate-test-sources
  10. process-test-sources
  11. generate-test-resources
  12. process-test-resources
  13. test-compile
  14. process-test-classes
  15. test
  16. prepare-package
  17. package
  18. pre-integration-test
  19. integration-test
  20. post-integration-test
  21. verify
  22. install
  23. deploy

site生命周期

  1. pre-site
  2. site
  3. post-site
  4. 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>

在集成时, 别忘记了, 将父模块,也放到聚合模块中.

可继承的元素

  1. groupId:项目组ID
  2. version:项目版本
  3. description:项目的描述信息
  4. organization:项目的组织信息
  5. inceptionYear:项目的创始年份
  6. url:项目的URL地址
  7. developers:项目的开发者信息
  8. contributors:项目的贡献者信息
  9. distributionManagement:项目的部署配置
  10. issueManagement:项目的缺陷跟踪系统信息
  11. ciManagement:项目的持续集成系统信息
  12. scm:项目的版本控制系统信息
  13. mailingLists:项目的邮件列表信息
  14. properties:算定义的Maven属性
  15. dependencies:项目的依赖配置
  16. dependencyManagement:项目的依赖管理配置
  17. repositoryies:项目的仓库配置
  18. build:包括项目的源码目录配置,输出目录配置。插件配置,插件配置。插件管理配置等
  19. 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

内置属性

  1. ${basedir},表示项目的根目录

  2. ${version},表示项目的版本

pom属性

  1. ${project.build.sourceDirectory}: 表示项目的主源码目录。默认为src/main/java

  2. ${project.build.testSourceDirectory}: 项目的测试源码目录。默认为src/test/java

  3. ${project.build.directory}: 项目构建输出目录,默认为target/

  4. ${project.outputDirector}: 项目主代码编译输出目录,默认为target/classes/

  5. ${project.testOutputDirectory}: 项目测试代码编译输出目录,默认为target/test-classes/

  6. ${project.groupId}: 项目的groupId

  7. ${project.artifactId}: 项目的artifactId

  8. ${project.version}: 项目的version,与${version}等价

  9. ${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插件

  1. 创建一个maven-plugin项目:它本身也是一个maven项目,不过,packaging 必须是maven-plugin.可以使用maven-archetype-plugin快速创建一个Maven插件项目

  2. 为插件编写目标。每个插件都必须包含一个或多个目标,Maven称为Mojo(与POJO对应)。编写插件时,必须提供一个或者多个继承自AbstractMojo类。

  3. 为目标提供配置点。

  4. 编写代码,实现目标行为

  5. 错误处理及日志。

  6. 测试插件

一个简单的项目

Jetty-demo

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>