史上最全的 pom.xml 文件详解:史上最全的 pom.xml 文件详解_雨雾清影的博客-CSDN博客_pom.xml 

参考:Maven的pom.xml文件详解------Build Settings_tomato__的博客-CSDN博客_pom中build

  1. dependencies和dependencyManagement以及plugins和pluginManagement的区别

    1. dependencies和dependencyManagement区别
      dependencies:子POM会完全继承父POM中声明的dependencies,如果子POM中没有声明某个依赖项,但是父POM中声明了该依赖项,就会直接从父POM中继承该依赖项,如果子POM也声明另外相同依赖包,那么子POM会覆盖父POM中依赖声明。dependencyManagement:只是声明依赖,并不实现引入,除非子POM显示声明需要用该依赖项。如果不在子POM中声明依赖,是不会从父POM中继承依赖的;只有在子POM中声明了该依赖项,并且没有指定具体版本,才会从父POM中继承该项,并且version和scope都读取自父POM;另外如果子POM中指定了版本号,那么会使用子POM中指定的jar版本。
      总结:dependencyManagement其实只是一个管理jar的作用,是管理jar的版本,其他的什么作用都没有,只是定义找到该jar的三维坐标,并不是真正的去执行下载的jar的功能。

    2. plugins和pluginManagement的区别
      plugins :就是直接引入一个plugin,而且可以绑定到Maven相关的生命周期上。pluginManagement:是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManagement声明可以被继承。一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且你在父POM中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定版本,同时也方便统一管理;而在父POM中的pluginManagement并不会介入到Maven的生命周期。

说明:

  1. maven – 为什么pom.xml的modelVersion是必要的,并且始终设置为4.0.0?
    <modelVersion>4.0.0</modelVersion>
    它总是设置为4.0.0在Maven 2和3,因为,目前,没有其他模型。
    Notice that modelVersion contains 4.0.0 . That is currently the only supported POM version for Maven 2 and is always required
    但如果有另一个版本的模型,它不一定需要总是设置为4.0.0。 POM必须遵守一个模型。让我们说Maven 4提出了4.1版本。如果你写你的pom符合4.1,它不会与Maven 3和模型4.0.0兼容。
    它被定义为强制性的,可能强制实施特定的XML模型,以便在定义新模型的情况下。

  2. 指定打包后的名字

        <build>
            <!-- 如果没有,会生成默认的名字 -->
            <finalName>iiot-ident-provider</finalName>
        </build>


plugins 插件:

1.maven-compiler-plugin 插件

maven是个项目管理工具,如果我们不告诉它我们的代码要使用什么样的jdk版本编译的话,它就会用maven-compiler-plugin默认的jdk版本来进行处理,这样就容易出现版本不匹配,以至于可能导致编译不通过的问题。
maven的默认编译使用的jdk版本貌似很低,使用maven-compiler-plugin插件可以指定项目源码的jdk版本,编译后的jdk版本,以及编码。
详解:Maven中配置maven-compiler-plugin 插件 - 楼兰胡杨 - 博客园

<plugin>                                                                                                                                      
    <!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->                                                                           
    <groupId>org.apache.maven.plugins</groupId>                                                                                               
    <artifactId>maven-compiler-plugin</artifactId>                                                                                            
    <version>3.1</version>                                                                                                                    
    <configuration>                                                                                                                           
        <!-- 一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中不能使用低版本jdk中不支持的语法),会存在target不同于source的情况 -->                    
        <source>1.8</source> <!-- 源代码使用的JDK版本 -->                                                                                             
        <target>1.8</target> <!-- 需要生成的目标class文件的编译版本 -->                                                                                     
        <encoding>UTF-8</encoding><!-- 字符集编码 -->
        <skipTests>true</skipTests><!-- 跳过测试 -->                                                                             
        <verbose>true</verbose>
        <showWarnings>true</showWarnings>                                                                                                               
        <fork>true</fork><!-- 要使compilerVersion标签生效,还需要将fork设为true,用于明确表示编译版本配置的可用 -->                                                        
        <executable><!-- path-to-javac --></executable><!-- 使用指定的javac命令,例如:<executable>${JAVA_1_4_HOME}/bin/javac</executable> -->           
        <compilerVersion>1.3</compilerVersion><!-- 指定插件将使用的编译器的版本 -->                                                                         
        <meminitial>128m</meminitial><!-- 编译器使用的初始内存 -->                                                                                      
        <maxmem>512m</maxmem><!-- 编译器使用的最大内存 -->                                                                                              
        <compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument><!-- 这个选项用来传递编译器自身不包含但是却支持的参数选项 -->               
    </configuration>                                                                                                                          
</plugin> 

一般如此就行:

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

2.spring-boot-maven-plugin

Spring Boot的Maven插件(Spring Boot Maven plugin)能够以Maven的方式为应用提供Spring Boot的支持,即为Spring Boot应用提供了执行Maven操作的可能。
Spring Boot Maven plugin能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用。
Spring Boot Maven plugin的最新版本为2017.6.8发布的1.5.4.RELEASE,要求Java 8, Maven 3.2及以后。

  <build>
      <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
              <version>2.0.1.RELEASE</version>
              <!--没有下面的部分,打包完成后运行可能会报错没有主清单属性-->
              <executions>
                  <execution>
                      <goals>
                          <goal>repackage</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
      </plugins>
  </build>

注意:可以指定启动类:spring-boot-maven-plugin插件的作用 - 贾树丙 - 博客园

1.作用:springboot默认使用spring-boot-maven-plugin 来打包,这个插件会将项目所有的依赖打入项目jar 包里面。
spring-boot-maven-plugin插件的作用:

2.Spring Boot Maven plugin的5个Goals

  1. spring-boot:repackage,默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin
  2. spring-boot:run,运行Spring Boot应用
  3. spring-boot:start,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
  4. spring-boot:stop,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
  5. spring-boot:build-info,生成Actuator使用的构建信息文件build-info.properties

3.mvn package spring-boot:repackage说明
Spring Boot Maven plugin的最主要goal就是repackage,其在Maven的package生命周期阶段,能够将mvn package生成的软件包,再次打包为可执行的软件包,并将mvn package生成的软件包重命名为*.original。
基于上述配置,对一个生成Jar软件包的项目执行如下命令:

mvn package spring-boot:repackage  

可以看到生成的两个jar文件,一个是*.jar,另一个是*.jar.original。

 

在执行上述命令的过程中,Maven首先在package阶段打包生成*.jar文件;然后执行spring-boot:repackage重新打包,查找Manifest文件中配置的Main-Class属性,如下所示:

Manifest-Version: 1.0  
Implementation-Title: gs-consuming-rest  
Implementation-Version: 0.1.0  
Archiver-Version: Plexus Archiver  
Built-By: exihaxi  
Implementation-Vendor-Id: org.springframework  
Spring-Boot-Version: 1.5.3.RELEASE  
Implementation-Vendor: Pivotal Software, Inc.  
Main-Class: org.springframework.boot.loader.JarLauncher  
Start-Class: com.ericsson.ramltest.MyApplication  
Spring-Boot-Classes: BOOT-INF/classes/  
Spring-Boot-Lib: BOOT-INF/lib/  
Created-By: Apache Maven 3.5.0  
Build-Jdk: 1.8.0_131  

注意,其中的Main-Class属性值为org.springframework.boot.loader.JarLauncher;

Start-Class属性值为com.ericsson.ramltest.MyApplication。

其中com.ericsson.ramltest.MyApplication类中定义了main()方法,是程序的入口。

通常,Spring Boot Maven plugin会在打包过程中自动为Manifest文件设置Main-Class属性,事实上该属性究竟作用几何,还可以受Spring Boot Maven plugin的配置属性layout控制的,示例如下

注意,其中的Main-Class属性值为org.springframework.boot.loader.JarLauncher;

Start-Class属性值为com.ericsson.ramltest.MyApplication。

其中com.ericsson.ramltest.MyApplication类中定义了main()方法,是程序的入口。

通常,Spring Boot Maven plugin会在打包过程中自动为Manifest文件设置Main-Class属性,事实上该属性究竟作用几何,还可以受Spring Boot Maven plugin的配置属性layout控制的,示例如下

<plugin>  
  <groupId>org.springframework.boot</groupId>  
  <artifactId>spring-boot-maven-plugin</artifactId>  
  <version>1.5.4.RELEASE</version>  
  <configuration>  
    <mainClass>${start-class}</mainClass>  
    <layout>ZIP</layout>  
  </configuration>  
  <executions>  
    <execution>  
      <goals>  
        <goal>repackage</goal>  
      </goals>  
    </execution>  
  </executions>  
</plugin> 

注意,这里的layout属性值为ZIP。layout属性的值可以如下:

  1. JAR,即通常的可执行jar,Main-Class: org.springframework.boot.loader.JarLauncher
  2. WAR,即通常的可执行war,需要的servlet容器依赖位于WEB-INF/lib-provided,Main-Class: org.springframework.boot.loader.warLauncher
  3. ZIP,即DIR,类似于JAR
    1. MODULE,将所有的依赖库打包(scope为provided的除外),但是不打包Spring Boot的任何Launcher
    2. NONE,将所有的依赖库打包,但是不打包Spring Boot的任何Launcher
    3. Main-Class: org.springframework.boot.loader.PropertiesLaunche

4.integration-test阶段中的Spring Boot Maven plugin的start/stop

<properties>  
  <it.skip>false</it.skip>  
</properties>  
<build>  
  <plugins>  
    <plugin>  
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-failsafe-plugin</artifactId>  
      <configuration>  
        <skip>${it.skip}</skip>  
      </configuration>  
    </plugin>  
    <plugin>  
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-maven-plugin</artifactId>  
      <version>1.5.4.RELEASE</version>  
      <executions>  
        <execution>  
          <id>pre-integration-test</id>  
          <goals>  
            <goal>start</goal>  
          </goals>  
          <configuration>  
            <skip>${it.skip}</skip>  
          </configuration>  
        </execution>  
        <execution>  
          <id>post-integration-test</id>  
          <goals>  
            <goal>stop</goal>  
          </goals>  
          <configuration>  
            <skip>${it.skip}</skip>  
          </configuration>  
        </execution>  
      </executions>  
    </plugin>  
  </plugins>  
</build>  

注意,it.skip变量用作是否跳过integration-test的标志位。

maven-failsafe-plugin用作integration-test的主要执行目标。

spring-boot-maven-plugin用以为integration-test提供支持。

执行integration-test的Maven命令如下:

mvn verify

或者

mvn verify -Dit.skip=false

参考链接:68. Spring Boot Maven Plugin

Spring Boot Maven Plugin Documentation

Spring Boot Maven Plugin – Spring Boot

Build Tool Plugins

3.maven-dependency-plugin插件

之前介绍了使用spring-boot-maven-plugin插件打jar包,会把所有的依赖文件都导入,然后变成了一个可执行的jar包。这样的不好的地方就是,我实际上并不需要把依赖的jar包也打入到生成的jar包里面去,仅仅需要把当前项目的代码打包。生成的jar包只要能引用到它所依赖的jar包,并且可以执行就好了。

作用:这个maven-dependency-plugin依赖的作用就是自动拷贝jar包到target目录(和eclipse  打包 runnable jar file的第三种方式类似 JAVA-打包成jar包_yigg的博客-CSDN博客_java打包成jar包

参考:Maven项目打Jar包,如何添加依赖 - 贾树丙 - 博客园

4.maven-resources-plugin

作用:拷贝资源文件 到指定的resource目录

			<!-- 4.maven-resources-plugin 插件:拷贝资源文件 到指定的resource目录-->
			<!-- 此插件适用于资源文件找不到的情况的可以使用,一般可不使用 -->
			<plugin>
			    <artifactId>maven-resources-plugin</artifactId>
			    <executions>
			        <execution>
			            <id>copy-dependencies</id>
			            <phase>package</phase>
			            <goals>
			                <goal>copy-resources</goal>
			            </goals>
			            <configuration>
			                <!-- 资源文件输出目录 -->
			               <outputDirectory>${project.build.directory}/resources</outputDirectory>
			                <resources>
			                    <resource>
			                        <directory>src/main/resources</directory>
			                        <filtering>true</filtering>
			                        <!--包含的文件-->
			                        <includes>
			                            <include>*/**</include>
			                        </includes>
			                    </resource>
			                </resources>
			            </configuration>
			        </execution>
			    </executions>
			</plugin>

5.maven-war-plugin插件

作用:Maven打war包时,排除和包含指定文件或目录

参考:maven-war-plugin:Maven打war包时,排除和包含指定文件或目录_琦彦的博客-CSDN博客_packagingexcludes正则表达式

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <archiveClasses>false</archiveClasses>
                    <packagingIncludes>
                        WEB-INF/lib/common-core-1.0.0.jar,
                        WEB-INF/lib/common-util-1.0.0.jar,
                        WEB-INF/lib/service-api-1.0.0.jar,
                        WEB-INF/lib/iiot-redis-1.0.0.jar,
                        WEB-INF/lib/iiot-amq-1.0.0.jar,
                        WEB-INF/lib/iiot-oss-1.0.0.jar,
                        WEB-INF/lib/iiot-entity-1.0.0.jar,
                        WEB-INF/classes/cn/**,
                        WEB-INF/classes/mapping/**,
                        WEB-INF/classes/*.properties,
                        WEB-INF/classes/*.conf,
                        WEB-INF/jsp/**,
                        static/**
                    </packagingIncludes>
                    <archive>
		              <manifest>
		                <mainClass>cn.rntd.IdentApp</mainClass>
		              </manifest>
		            </archive>
                </configuration>
            </plugin>

resources

作用:指定目录为资源目录

        <!-- 如果没报错,可忽略此配置 -->
        <resources>
            <!--注册webapp目录为资源目录-->
            <resource>
                <directory>src/main/webapp</directory>
                <targetPath>META-INF/resources</targetPath>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>

maven中的可选依赖<optional>true</optional>

maven中的可选依赖<optional>true</optional>_明快de玄米61的博客-CSDN博客_<optional>true</optional>

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐