《Maven进阶》1.maven 项目生命周期与构建原理

21 篇文章 0 订阅
订阅专栏

maven是一个非常经典的和通用的项目管理工具,虽然现在热炒gradle将作为下一代 项目管理工具来取代maven,但是 由于maven强大和健全的功能,maven还有很强的生命力。

      本文将介绍maven对于项目生命周期的设计以及原理。

读完本文,你将了解到:

一、maven对项目生命周期的抽象--三大项目生命周期

二、maven对项目默认生命周期的抽象

三、maven指令与生命周期阶段的关系

四、maven生命周期各个阶段的行为与maven默认行为

五、maven项目的目录结构

六、maven为生命周期阶段绑定特定行为动作的机制即插件原理

 

一、 maven对项目生命周期的抽象--三大项目生命周期

 

maven从项目的三个不同的角度,定义了单套生命周期,三套生命周期是相互独立的,它们之间不会相互影响。

默认构建生命周期(Default Lifeclyle): 该生命周期表示这项目的构建过程,定义了一个项目的构建要经过的不同的阶段。

清理生命周期(Clean Lifecycle): 该生命周期负责清理项目中的多余信息,保持项目资源和代码的整洁性。一般拿来清空directory(即一般的target)目录下的文件。

站点管理生命周期(Site Lifecycle) :向我们创建一个项目时,我们有时候需要提供一个站点,来介绍这个项目的信息,如项目介绍,项目进度状态、项目组成成员,版本控制信息,项目javadoc索引信息等等。站点管理生命周期定义了站点管理过程的各个阶段。

 

             本文只介绍maven项目默认的生命周期,其他两个生命周期将另起博文介绍。

 

 

二、 maven对项目默认生命周期的抽象

 

 

 

 

 

 

如何查看maven对默认生命周期的定义?

    maven将其架构和结构的组织放置到了components.xml 配置文件中,该配置文件的路径是:

           apache-maven-${version}\lib\maven-core-${version}.jar\META-INFO\plexus\conponents.xml文件中。其中,我们可以看到关于default生命周期XML节点配置信息:

 
  1. <component>

  2. <role>org.apache.maven.lifecycle.Lifecycle</role>

  3. <implementation>org.apache.maven.lifecycle.Lifecycle</implementation>

  4. <role-hint>default</role-hint>

  5. <configuration>

  6. <id>default</id>

  7.  
  8. <phases>

  9. <phase>validate</phase>

  10. <phase>initialize</phase>

  11. <phase>generate-sources</phase>

  12. <phase>process-sources</phase>

  13. <phase>generate-resources</phase>

  14. <phase>process-resources</phase>

  15. <phase>compile</phase>

  16. <phase>process-classes</phase>

  17. <phase>generate-test-sources</phase>

  18. <phase>process-test-sources</phase>

  19. <phase>generate-test-resources</phase>

  20. <phase>process-test-resources</phase>

  21. <phase>test-compile</phase>

  22. <phase>process-test-classes</phase>

  23. <phase>test</phase>

  24. <phase>prepare-package</phase>

  25. <phase>package</phase>

  26. <phase>pre-integration-test</phase>

  27. <phase>integration-test</phase>

  28. <phase>post-integration-test</phase>

  29. <phase>verify</phase>

  30. <phase>install</phase>

  31. <phase>deploy</phase>

  32. </phases>

  33.  
  34. </configuration>

  35. </component>


 

maven根据一个项目的生命周期的每个阶段,将一个项目的生命周期抽象成了如上图所示的23个阶段。而每一个阶段应该干什么事情由用户决定。换句话说,maven为每一个阶段设计了接口,你可以为每一阶段自己定义一个接口,进而实现对应阶段应该有的行为。关于如何为某个生命周期阶段绑定自定义的行为,我将在后面的章节介绍。

 

 

 

三、 maven指令与生命周期阶段的关系

 

 

 

 

 

 

四、maven生命周期各个阶段的行为与maven默认行为

使用过maven的读者会经常使用这些maven指令:
 
  1. mvn compile //让当前项目经历生命周期中的1-->7 阶段 :完成编译主源代码编译

  2. mvn package //让当前项目经历生命周期中的1-->17阶段 :完成打包

  3. mvn install //让当前项目经历生命周期中的1-->22阶段 :完成包安装到本地仓库

  4. mvn deploy //让当前生命经历生命周期中的1-->23阶段 :完成包部署到中心库中


在经历这些生命周期的阶段中,每个阶段会理论上会有相应的处理操作。但是,在实际的项目开发过程中, 并不是所有的生命周期阶段都是必须的。
然而,在实际的开发过程中,往往我们的项目的一些生命周期的阶段不需要相应的行为,我们只需要关心其中某些重要的生命周期阶段而已。下面,请看一下日常开发中,我们需要关注的生命周期阶段,即广大开发人员对项目周期阶段处理的约定:
1).应该将resource资源文件准备好,放到指定的target目录下----process-resources 阶段;
2).将java源文件编译成.class文件,然后将class 文件放置到对应的target目录下----compile阶段;
3).将test类型的resource移动到指定的 target目录下------process-test-resource阶段;
4).将test类型的java 源文件编译成class文件,然后放置到指定的target目录下------test-compile阶段;
5).运行test测试用例-------test阶段;
6).将compile阶段编译的class文件和resource资源打包成jar包或war包--------package阶段;
7).将生成的包安装到本地仓库中------install阶段
8).将生成的包部署到远程仓库中-----deploy阶段

 

           由上面的约定可以看出,在大多数情况下,大家关心的项目生命周期阶段仅仅是上面的8个而已。跟上面maven对生命周期阶段23个的抽象相比,这就少的很多了。

        基于类似的约定,maven默认地为一些不同类型的maven项目生命周期的阶段实现了默认的行为。

        maven 在设计上将生命周期阶段的抽象对应阶段应该执行的行为实现分离开,maven这些实现放到了插件中,这些插件本质上是实现了maven留在各个生命周期阶段的接口。关于插件的问题,我将另外写一篇博文介绍。

如下图所示,maven针对不同打包类型的maven项目的生命周期阶段绑定了对应的默认行为:

如上图所示,对于不同的打包格式的项目而言,maven为特定类型的包格式项目在不同的生命周期阶段的默认行为。

而对于我们经常使用的jar和war包格式的项目而言,maven总共为其规定了以下几个生命周期阶段的默认行为:

 

 

 

 

 

五、 maven项目的目录结构

well,每个项目工程,都有非常繁琐的目录结构,每个目录都有不同的作用。请记住这一点,目录的划分是根据需要来的,每个目录有其特定的功能。目录本质上就是一个文件或文件夹路径而已。那么,我们换一个思路考虑:一个项目的文件结构需要组织什么信息呢?让我们来看一下功能的划分:

如上图所示,你会看到maven项目里不同功能类型的目录定义以及maven默认的目录的路径。

如何修改默认的目录配置

在maven项目工程对应project的 pom.xml中,在<project>--><build>节点下,你可以指定自己的目录路径信息:

 
  1. <build>

  2. <!-- 目录信息维护,用户可以指定自己的目录路径 -->

  3. <sourceDirectory>E:\intellis\maven-principle\phase-echo\src\main\java</sourceDirectory>

  4. <scriptSourceDirectory>E:\intellis\maven-principle\phase-echo\src\main\scripts</scriptSourceDirectory>

  5. <testSourceDirectory>E:\intellis\maven-principle\phase-echo\src\test\java</testSourceDirectory>

  6. <outputDirectory>E:\intellis\maven-principle\phase-echo\target\classes</outputDirectory>

  7. <testOutputDirectory>E:\intellis\maven-principle\phase-echo\target\test-classes</testOutputDirectory>

  8.  
  9. <!-- 注意,对resource而言,可以有很多个resource路径的配置,你只需要指定对应的路径是resource即可 -->

  10. <resources>

  11. <resource>

  12. <directory>E:\intellis\maven-principle\phase-echo\src\main\resources</directory>

  13. </resource>

  14. </resources>

  15.  
  16. <!-- 注意,对resource而言,可以有很多个resource路径的配置,你只需要指定对应的路径是resource即可 -->

  17. <testResources>

  18. <testResource>

  19. <directory>E:\intellis\maven-principle\phase-echo\src\test\resources</directory>

  20. </testResource>

  21. </testResources>

  22.  
  23. <directory>E:\intellis\maven-principle\phase-echo\target</directory>

  24.  
  25. </build>

请注意:对于maven管理项目工程的生命周期的操作上, 都发生在上述的几种目录中。换句话说,实质上,maven的项目管理的整个过程,就是围绕着对上述几种文件目录中内容的操作。

 

六、maven为生命周期阶段绑定特定行为动作的机制(即插件原理)

 

为maven生命周期的某些阶段绑定特定行为或动作,简单点就是调用一段代码而已,maven将需要执行的逻辑抽象成了一个接口,接口为 Mojo。Mojo是 Maven Old plain Java Object的简写,表示的意思是Mojo是maven的一个简单的对象。如下图所示:

maven通过为某一个项目的生命周期阶段绑定若干个Mojo,然后依次执行Mojo.execute()方法,从而实现特定生命周期应该执行的动作。

举例:比如,对于生命周期阶段process-resources,maven默认地为其绑定了一个Mojo:  org.apache.maven.plugin.resources.ResourcesMojo。

当需要经历process-resources阶段时,maven将会创建一个ResourcesMojo 实例instance,然后调用instance.execute()方法。

 

 
  1. @Mojo( name = "resources", defaultPhase = LifecyclePhase.PROCESS_RESOURCES, threadSafe = true )

  2. public class ResourcesMojo

  3. extends AbstractMojo

  4. implements Contextualizable

  5. {

  6. /**

  7. 下面若干个attribute ,maven 读取pom.xml内的配置信息,这里的attribute对应着pom.xml里的配置,如果在这里声明了,maven在创建Mojo 实例

  8. instance的时候,会将这些值注入到instance内,供Mojo instance使用

  9. */

  10.  /**

  11. * The character encoding scheme to be applied when filtering resources.

  12. */

  13. @Parameter( property = "encoding", defaultValue = "${project.build.sourceEncoding}" )

  14. protected String encoding;

  15.  
  16. /**

  17. * The output directory into which to copy the resources.

  18. */

  19. @Parameter( defaultValue = "${project.build.outputDirectory}", required = true )

  20. private File outputDirectory;

  21.  
  22. /**

  23. * The list of resources we want to transfer.

  24. */

  25. @Parameter( defaultValue = "${project.resources}", required = true, readonly = true )

  26. private List<Resource> resources;

  27.  
  28. /**

  29. *

  30. */

  31. @Parameter( defaultValue = "${project}", required = true, readonly = true )

  32. protected MavenProject project;

  33.  
  34. /**

  35. * The list of additional filter properties files to be used along with System and project

  36. * properties, which would be used for the filtering.

  37. * <br/>

  38. * See also: {@link ResourcesMojo#filters}.

  39. *

  40. * @since 2.4

  41. */

  42. @Parameter( defaultValue = "${project.build.filters}", readonly = true )

  43. protected List<String> buildFilters;

  44.  
  45. /**

  46. * The list of extra filter properties files to be used along with System properties,

  47. * project properties, and filter properties files specified in the POM build/filters section,

  48. * which should be used for the filtering during the current mojo execution.

  49. * <br/>

  50. * Normally, these will be configured from a plugin's execution section, to provide a different

  51. * set of filters for a particular execution. For instance, starting in Maven 2.2.0, you have the

  52. * option of configuring executions with the id's <code>default-resources</code> and

  53. * <code>default-testResources</code> to supply different configurations for the two

  54. * different types of resources. By supplying <code>extraFilters</code> configurations, you

  55. * can separate which filters are used for which type of resource.

  56. */

  57. @Parameter

  58. protected List<String> filters;

  59.  
  60. /**

  61. * If false, don't use the filters specified in the build/filters section of the POM when

  62. * processing resources in this mojo execution.

  63. * <br/>

  64. * See also: {@link ResourcesMojo#buildFilters} and {@link ResourcesMojo#filters}

  65. *

  66. * @since 2.4

  67. */

  68. @Parameter( defaultValue = "true" )

  69. protected boolean useBuildFilters;

  70.  
  71. /**

  72. *

  73. */

  74. @Component( role = MavenResourcesFiltering.class, hint = "default" )

  75. protected MavenResourcesFiltering mavenResourcesFiltering;

  76.  
  77. /**

  78. *

  79. */

  80. @Parameter( defaultValue = "${session}", required = true, readonly = true )

  81. protected MavenSession session;

  82.  
  83. /**

  84. * Expression preceded with the String won't be interpolated

  85. * \${foo} will be replaced with ${foo}

  86. *

  87. * @since 2.3

  88. */

  89. @Parameter( property = "maven.resources.escapeString" )

  90. protected String escapeString;

  91.  
  92. /**

  93. * Overwrite existing files even if the destination files are newer.

  94. *

  95. * @since 2.3

  96. */

  97. @Parameter( property = "maven.resources.overwrite", defaultValue = "false" )

  98. private boolean overwrite;

  99.  
  100. /**

  101. * Copy any empty directories included in the Resources.

  102. *

  103. * @since 2.3

  104. */

  105. @Parameter( property = "maven.resources.includeEmptyDirs", defaultValue = "false" )

  106. protected boolean includeEmptyDirs;

  107.  
  108. /**

  109. * Additional file extensions to not apply filtering (already defined are : jpg, jpeg, gif, bmp, png)

  110. *

  111. * @since 2.3

  112. */

  113. @Parameter

  114. protected List<String> nonFilteredFileExtensions;

  115.  
  116. /**

  117. * Whether to escape backslashes and colons in windows-style paths.

  118. *

  119. * @since 2.4

  120. */

  121. @Parameter( property = "maven.resources.escapeWindowsPaths", defaultValue = "true" )

  122. protected boolean escapeWindowsPaths;

  123.  
  124. /**

  125. * <p>

  126. * Set of delimiters for expressions to filter within the resources. These delimiters are specified in the

  127. * form 'beginToken*endToken'. If no '*' is given, the delimiter is assumed to be the same for start and end.

  128. * </p><p>

  129. * So, the default filtering delimiters might be specified as:

  130. * </p>

  131. * <pre>

  132. * <delimiters>

  133. * <delimiter>${*}</delimiter>

  134. * <delimiter>@</delimiter>

  135. * </delimiters>

  136. * </pre>

  137. * <p>

  138. * Since the '@' delimiter is the same on both ends, we don't need to specify '@*@' (though we can).

  139. * </p>

  140. *

  141. * @since 2.4

  142. */

  143. @Parameter

  144. protected List<String> delimiters;

  145.  
  146. /**

  147. * @since 2.4

  148. */

  149. @Parameter( defaultValue = "true" )

  150. protected boolean useDefaultDelimiters;

  151.  
  152. /**

  153. * <p>

  154. * List of plexus components hint which implements {@link MavenResourcesFiltering#filterResources(MavenResourcesExecution)}.

  155. * They will be executed after the resources copying/filtering.

  156. * </p>

  157. *

  158. * @since 2.4

  159. */

  160. @Parameter

  161. private List<String> mavenFilteringHints;

  162.  
  163. /**

  164. * @since 2.4

  165. */

  166. private PlexusContainer plexusContainer;

  167.  
  168. /**

  169. * @since 2.4

  170. */

  171. private List<MavenResourcesFiltering> mavenFilteringComponents = new ArrayList<MavenResourcesFiltering>();

  172.  
  173. /**

  174. * stop searching endToken at the end of line

  175. *

  176. * @since 2.5

  177. */

  178. @Parameter( property = "maven.resources.supportMultiLineFiltering", defaultValue = "false" )

  179. private boolean supportMultiLineFiltering;

  180.  
  181. public void contextualize( Context context )

  182. throws ContextException

  183. {

  184. plexusContainer = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );

  185. }

  186.  
  187. public void execute()

  188. throws MojoExecutionException

  189. {

  190. try

  191. {

  192.  
  193. if ( StringUtils.isEmpty( encoding ) && isFilteringEnabled( getResources() ) )

  194. {

  195. getLog().warn( "File encoding has not been set, using platform encoding " + ReaderFactory.FILE_ENCODING

  196. + ", i.e. build is platform dependent!" );

  197. }

  198. //获取资源文件过滤器配置

  199. List filters = getCombinedFiltersList();

  200. //根据现有配置信息创建Resources处理器对象实例

  201. MavenResourcesExecution mavenResourcesExecution =

  202. new MavenResourcesExecution( getResources(), getOutputDirectory(), project, encoding, filters,

  203. Collections.<String>emptyList(), session );

  204. //windows路径处理

  205. mavenResourcesExecution.setEscapeWindowsPaths( escapeWindowsPaths );

  206.  
  207. // never include project build filters in this call, since we've already accounted for the POM build filters

  208. // above, in getCombinedFiltersList().

  209. mavenResourcesExecution.setInjectProjectBuildFilters( false );

  210.  
  211. mavenResourcesExecution.setEscapeString( escapeString );

  212. mavenResourcesExecution.setOverwrite( overwrite );

  213. mavenResourcesExecution.setIncludeEmptyDirs( includeEmptyDirs );

  214. mavenResourcesExecution.setSupportMultiLineFiltering( supportMultiLineFiltering );

  215.  
  216. // if these are NOT set, just use the defaults, which are '${*}' and '@'.

  217. if ( delimiters != null && !delimiters.isEmpty() )

  218. {

  219. LinkedHashSet<String> delims = new LinkedHashSet<String>();

  220. if ( useDefaultDelimiters )

  221. {

  222. delims.addAll( mavenResourcesExecution.getDelimiters() );

  223. }

  224.  
  225. for ( String delim : delimiters )

  226. {

  227. if ( delim == null )

  228. {

  229. // FIXME: ${filter:*} could also trigger this condition. Need a better long-term solution.

  230. delims.add( "${*}" );

  231. }

  232. else

  233. {

  234. delims.add( delim );

  235. }

  236. }

  237.  
  238. mavenResourcesExecution.setDelimiters( delims );

  239. }

  240.  
  241. if ( nonFilteredFileExtensions != null )

  242. {

  243. mavenResourcesExecution.setNonFilteredFileExtensions( nonFilteredFileExtensions );

  244. }

  245. mavenResourcesFiltering.filterResources( mavenResourcesExecution );

  246. //执行Resource文件拷贝

  247. executeUserFilterComponents( mavenResourcesExecution );

  248. }

  249. catch ( MavenFilteringException e )

  250. {

  251. throw new MojoExecutionException( e.getMessage(), e );

  252. }

  253. }

  254.  
  255. /**

  256. * @since 2.5

  257. */

  258. protected void executeUserFilterComponents( MavenResourcesExecution mavenResourcesExecution )

  259. throws MojoExecutionException, MavenFilteringException

  260. {

  261.  
  262. if ( mavenFilteringHints != null )

  263. {

  264. for ( Iterator ite = mavenFilteringHints.iterator(); ite.hasNext(); )

  265. {

  266. String hint = (String) ite.next();

  267. try

  268. {

  269. mavenFilteringComponents.add(

  270. (MavenResourcesFiltering) plexusContainer.lookup( MavenResourcesFiltering.class.getName(),

  271. hint ) );

  272. }

  273. catch ( ComponentLookupException e )

  274. {

  275. throw new MojoExecutionException( e.getMessage(), e );

  276. }

  277. }

  278. }

  279. else

  280. {

  281. getLog().debug( "no use filter components" );

  282. }

  283.  
  284. if ( mavenFilteringComponents != null && !mavenFilteringComponents.isEmpty() )

  285. {

  286. getLog().debug( "execute user filters" );

  287. for ( MavenResourcesFiltering filter : mavenFilteringComponents )

  288. {

  289. filter.filterResources( mavenResourcesExecution );

  290. }

  291. }

  292. }

  293.  
  294. protected List<String> getCombinedFiltersList()

  295. {

  296. if ( filters == null || filters.isEmpty() )

  297. {

  298. return useBuildFilters ? buildFilters : null;

  299. }

  300. else

  301. {

  302. List<String> result = new ArrayList<String>();

  303.  
  304. if ( useBuildFilters && buildFilters != null && !buildFilters.isEmpty() )

  305. {

  306. result.addAll( buildFilters );

  307. }

  308.  
  309. result.addAll( filters );

  310.  
  311. return result;

  312. }

  313. }

  314.  
  315. /**

  316. * Determines whether filtering has been enabled for any resource.

  317. *

  318. * @param resources The set of resources to check for filtering, may be <code>null</code>.

  319. * @return <code>true</code> if at least one resource uses filtering, <code>false</code> otherwise.

  320. */

  321. private boolean isFilteringEnabled( Collection<Resource> resources )

  322. {

  323. if ( resources != null )

  324. {

  325. for ( Resource resource : resources )

  326. {

  327. if ( resource.isFiltering() )

  328. {

  329. return true;

  330. }

  331. }

  332. }

  333. return false;

  334. }

  335. }

 

上面只是介绍了Maven生命周期阶段绑定执行代码的基本模式,由于maven的生命周期众多,并且每个生命周期内有可能绑定多个Mojo,如果使用上述的模式简单关联的话,会显得结构组织很乱。

maven会根据Mojo功能的划分,将具有相似功能的Mojo放到一个插件中。并且某一个特定的Mojo能实现的功能称为 goal,即目标,表明该Mojo能实现什么目标。

 

例如,我们项目生命周期有两个阶段:compile 和 test-compile,这两阶段都是需要将java源代码编译成class文件中,相对应地,compile和test-compiler分别被绑定到了org.apache.maven.plugin.compiler.CompilerMojo 和org.apache.maven.plugin.compiler.TestCompilerMojo上:

 

如何查看maven各个生命周期阶段和插件的绑定情况

maven默认实现上,会为各个常用的生命周期根据约定绑定特定的插件目标。maven将这些配置放置到了:

apache-maven-${version}\lib\maven-core-${version}.jar\META-INFO\plexus\default-binds.xml文件中,针对不同打包类型的项目,其默认绑定情况也会不一样,我们先看一下常用的jar包类型和war包类型的项目默认绑定情况:

 

 

 
  1. <!-- jar包格式的项目生命周期各个阶段默认绑定情况 -->

  2. <component>

  3. <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>

  4. <role-hint>jar</role-hint>

  5. <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>

  6. <configuration>

  7. <lifecycles>

  8. <lifecycle>

  9. <id>default</id>

  10. <!-- START SNIPPET: jar-lifecycle -->

  11. <phases>

  12. <!-- 插件绑定的格式: <plugin-groupid>:<plugin-artifactid>:<version>:goal -->

  13. <process-resources>

  14. org.apache.maven.plugins:maven-resources-plugin:2.6:resources

  15. </process-resources>

  16. <compile>

  17. org.apache.maven.plugins:maven-compiler-plugin:3.1:compile

  18. </compile>

  19. <process-test-resources>

  20. org.apache.maven.plugins:maven-resources-plugin:2.6:testResources

  21. </process-test-resources>

  22. <test-compile>

  23. org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile

  24. </test-compile>

  25. <test>

  26. org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test

  27. </test>

  28. <package>

  29. org.apache.maven.plugins:maven-jar-plugin:2.4:jar

  30. </package>

  31. <install>

  32. org.apache.maven.plugins:maven-install-plugin:2.4:install

  33. </install>

  34. <deploy>

  35. org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy

  36. </deploy>

  37. </phases>

  38. <!-- END SNIPPET: jar-lifecycle -->

  39. </lifecycle>

  40. </lifecycles>

  41. </configuration>

  42. </component>

  43.  
  44. <!-- war包格式的项目生命周期各个阶段默认绑定情况 -->

  45. <component>

  46. <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>

  47. <role-hint>war</role-hint>

  48. <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>

  49. <configuration>

  50. <lifecycles>

  51. <lifecycle>

  52. <id>default</id>

  53. <!-- START SNIPPET: war-lifecycle -->

  54. <phases>

  55. <process-resources>

  56. org.apache.maven.plugins:maven-resources-plugin:2.6:resources

  57. </process-resources>

  58. <compile>

  59. org.apache.maven.plugins:maven-compiler-plugin:3.1:compile

  60. </compile>

  61. <process-test-resources>

  62. org.apache.maven.plugins:maven-resources-plugin:2.6:testResources

  63. </process-test-resources>

  64. <test-compile>

  65. org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile

  66. </test-compile>

  67. <test>

  68. org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test

  69. </test>

  70. <package>

  71. org.apache.maven.plugins:maven-war-plugin:2.2:war

  72. </package>

  73. <install>

  74. org.apache.maven.plugins:maven-install-plugin:2.4:install

  75. </install>

  76. <deploy>

  77. org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy

  78. </deploy>

  79. </phases>

  80. <!-- END SNIPPET: war-lifecycle -->

  81. </lifecycle>

  82. </lifecycles>

  83. </configuration>

  84. </component>


如果你想查看当前maven有多少插件,每个插件都干了什么,你可以访问 maven plugin主页了解 : http://maven.apache.org/plugins/index.html

 

 

 

 

 

 

写在最后

本文旨在向读者介绍maven默认生命周期的工作机制,以及maven在项目构建过程中的基本原理和机制。

本文介绍的比较宽泛,还没有深入到maven插件底层,随后一篇博文将会详细介绍插件,解析插件的工作原理,分析当前maven默认定义的插件,并最终自己定义插件完成特定功能,敬请关注!

由于本人技术有限,如果本人有任何错误和纰漏,请读者慷慨指出,共同学习,共同进步!

 

2016.1.15

 

 

maven笔记】构建生命周期&插件:目标
opi
11-13 366
1.概念关系 生命周期(LifeCircle)由段(phase)组成,段之间存在先序关系,段可以理解为构建过程中的一个步骤,如编译就是一个段。 生命周期maven根据项目构建中常用步骤抽象出了3个内置的生命周期clean、default、site,clean用于清理构建产生的数据,default用于项目部署,site用于生成项目文档。 maven设计为了更灵活,每个段可以有不同的...
maven~多个plugin相同phase的执行顺序
深蓝旭的博客
06-09 714
对于maven项目构建时,我们会使用到插件,对构建过程行一些控制,加工,加密,重写,依赖打包等工作,一般我们打包时会把phase定为package,意思是说,当行package动作后,处理你的插件。 多个相同phase的顺序 当我们有多个plugin,并且相同phase时,有时需要考虑到顺序问题,因为你的plugin可能会有某个其它plugin的结果的依赖,所以我们需要控制 <plugins> <plugin> <artifactId>maven-sh.
Maven三种打包方式,看看你都掌握了没?
欢迎来到我的博客
07-13 1万+
Maven可以使用mvn package指令对项目行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in xxx.jar"(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。1 方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包。使用maven-jar-plugin和maven-dependency-plugin插件打包。
maven之插件打包详解
上善若泪
05-20 4644
文章目录1 assmebly1.1 assmebly简介1.2 assmebly配置1.2.1 maven中配置1.2.2 maven标签1.2.2.1 configuration标签说明1.2.3 assembly.xml配置1.2.4 assembly标签1.2.4.1 id标签1.2.4.2 formats标签1.2.4.3 includeBaseDirectory标签1.2.4.4 dependencySets标签1.2.4.5 fileSets标签1.2.4.6 files标签 1 assmebl
Maven笔记.md
12-15
maven高级, 作用:1.管理jar包 自动下载 2. 一键编译/打包等
新建Maven项目时出错:org.apache.maven.archiver.MavenArchiver.getManifest
02-25
org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration) 解决方案: 第一种方式 war项目 <groupId>org.apache....
Maven 生命周期.pdf
06-22
附件详细的阐述了Maven生命周期概念的理解,对于在开发过程中熟练的使用Maven大有脾益
使用MyEclipse构建多模块Maven项目说明.doc
12-02
1.创建Maven项目构建多模块的Maven项目第一步需创建Maven父级项目,该项目负责聚合所有模块的内容,并行编译、打包和发布工作。以下是创建Maven项目的具体步骤: 1.1. Maven环境配置配置M2_HOME和MAVEN_HOME,如下...
Maven构建生命周期详细介绍
08-28
主要介绍了Maven构建生命周期详细介绍,小编觉得还是挺不错的,这里分享给大家,需要的朋友可以参考下。
apache-maven-3.5.4.zip
04-24
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目构建,报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,...
Maven项目构建与管理
02-25
Maven项目构建过程如上图所示,主要构建命令有几种:mvnvalidate验证,验证项目是正确的并且所有的信息是可用的;mvnclean清理,清理项目缓存输出,一般是target文件夹被删除;mvncompile编译,将java源文件编译成....
apache-maven-3.8.8.zip
08-04
apache-maven-3.8.8.zip压缩包内容: apache-maven-3.8.8-bin.tar.gz apache-maven-3.8.8-bin.zip apache-maven-3.8.8-src.tar.gz apache-maven-3.8.8-src.zip
maven_repository .zip
10-16
有时在你的构建过程中,需要将第三方jar包添加到本地仓库中,因为它并存在于像Maven中央仓库或其它的公共仓库中。为了让Maven能够正确获取到jar包,第三方jar包必须放置到本地仓库的正确位置上。Maven已经提供了...
apache-maven-3.8.6.zip
08-15
apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-maven-3.8.6-bin.zip apache-...
Maven中的几个重要概念(二):lifecycle, phase and goal
我的学习成长日记
09-22 4万+
原文:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html 当我们在使用Maven做一些工作,如打包,编译,运行测试等等任务时,我们已经使用到了Maven中的几个重要概念: lifecycle, phase and goal。 例如,如果我们使用ant打包,我们需要清晰的在脚本中告
Google Maven Replacer Plugin插件详解
成长的足迹
12-28 5775
Maven项目构建过程中,对于Maven标准预定义变量,或者<properties>中定义的变量,都可以被实际的值替换。 但是,如果要在构建的过程中替换文件中的任何指定字符串(这里成为tokens),就需要使用Google为Maven提供的replacer插件。 Google的replacer插件原名为maven-replacer-plugin,2012年以后,为了遵循Mave...
Maven原理、流程、scope作用域、生命周期项目之间的关系,依赖,继承,聚合
weixin_45290168的博客
09-20 393
1.maven的概念: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期(phase)中插件(plugin)目标(goal)的逻辑。 2.maven的优点: 简化了项目依赖管理:jar包管理,防止了冲突 便于与持续集成工具(jenkins)整合 便于项目升级,无论是项目
maven的5种打包方式,终有一款适合你1
热门推荐
健康平安的活着的专栏
08-07 4万+
1.用于生成META-INF/MANIFEST.MF文件的部分内容,com.xxg.Main指定MANIFEST.MF中的Main-Class,true会在MANIFEST.MF加上Class-Path项并配置依赖包,lib/指定依赖包所在目录。2.maven-dependency-plugin插件。
maven项目生命周期
最新发布
09-06
Maven项目生命周期是指Maven构建项目时所定义的一系列段和行为。Maven生命周期分为三个独立的生命周期:clean、default和site。每个生命周期又包含了一些段,这些段的顺序是有序的,后面的段依赖于前面...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • docker nginx实现一个主机部署多个站点 4984
  • 使用 jsDelivr CDN 加速 Github 仓库的图片,以作为博客的图床 3528
  • ubuntu中卸载没有安装完全的软件包 3339
  • UsernamePasswordAuthenticationToken 2285
  • webstorm实时预览 2248

分类专栏

  • 小微电商在线工具搭建 5篇
  • GitHub 2篇
  • Agile 1篇
  • 安全框架 1篇
  • 阿里云ECS服务器搭建 6篇
  • Java培训 21篇
  • 云服务器搭建 18篇
  • docker服务搭建 8篇
  • docker命令 3篇
  • mysql数据备份 2篇
  • docker基础知识 2篇
  • Mac 3篇
  • nginx服务 2篇
  • mysql 4篇
  • ubuntu 8篇
  • virtualbox 1篇
  • wordpress 3篇
  • 比目云 1篇
  • 微信小程序 1篇
  • 网络规划 2篇
  • Java对象 2篇
  • Java 2篇
  • API 1篇

最新评论

  • 网站开发流程(开发环境/测试环境---生产环境)

    xufangfanglemon: 下一篇有么,想了解一下哈表情包

  • 使用 jsDelivr CDN 加速 Github 仓库的图片,以作为博客的图床

    圈圈气泡: 谢谢推荐

  • 使用 jsDelivr CDN 加速 Github 仓库的图片,以作为博客的图床

    圈圈气泡: 一般都是电商网站,前期省费用使用的,目的就是让更多人更快的看到,看场景吧

  • 使用 jsDelivr CDN 加速 Github 仓库的图片,以作为博客的图床

    自由程序猿: 博主试试用PicX,免下载免安装,太好用了。 https://github.com/XPoet/picx

  • ubuntu中卸载没有安装完全的软件包

    qq_34939727: 最后一个慎用

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • webstorm实时预览
  • <button>和<input type=“button“> 的区别
  • LinkedList简介
2021年1篇
2020年9篇
2019年11篇
2018年44篇
2017年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

哆哆女性网网站建设的小知识开个咖啡店要多少钱录音棚设计有哪些广告设计网站淄博seo公司姓姚的男生起名网站的设计思想南阳网站优化公司学周易入门看什么书什么是品牌推广营销网站seo外包巢湖市网站建设公司给孩子起名里面有木和金梦幻甬城破解版游戏下载拉萨网站制作青岛推广营销公司旺道营销助手seo软件网站建设制作专业的公司电子商务网站建设实训总结找大师起名大全广告营销推广有限公司微梦网站建设古代起名字参考书籍给西瓜起名字设计/素材网站南京seo优化公司艺术签名破解版猪宝宝起名用的字怎样制作网站链接幸福的花园淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化