maven中pom文件build节点讲解

港控/mmm° 2021-06-22 15:37 616阅读 0赞

在maven的pom.xml文件中build节点用来管理执行maven声明周期的。主要包含如下内容:

  1. <build>
  2. <finalName>test</finalName>
  3. <filters>
  4. <filter>${basedir}/filters/filter-${profile.active}.properties</filter>
  5. </filters>
  6. <resources>
  7. <resource>
  8. <directory>src/main/resources</directory>
  9. <filtering>true</filtering>
  10. <includes>
  11. <include>*.*</include>
  12. <include>**/*.properties</include>
  13. <include>**/*.xml</include>
  14. </includes>
  15. </resource>
  16. </resources>
  17. <plugins>
  18. <plugin>
  19. </plugin>
  20. </plugins>
  21. </build>

下面,我们重点讲解一些节点功能:

一、plugins节点介绍:

1、maven-compiler-plugin、maven-resources-plugin:

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-compiler-plugin</artifactId>
  4. <configuration>
  5. <source>1.7</source>
  6. <target>1.7</target>
  7. <encoding>UTF-8</encoding>
  8. </configuration>
  9. </plugin>
  10. <plugin>
  11. <groupId>org.apache.maven.plugins</groupId>
  12. <artifactId>maven-resources-plugin</artifactId>
  13. <version>2.3</version>
  14. <configuration>
  15. <encoding>UTF-8</encoding>
  16. </configuration>
  17. </plugin>

通常用来设置代码文件、资源文件的字符集等。

2、maven-dependency-plugin:

拷贝依赖包 mvn dependency:copy-dependencies,默认会拷到项目的 target\dependency 目录,可以配置如下:

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-dependency-plugin</artifactId>
  4. <executions>
  5. <execution>
  6. <phase>package</phase>
  7. <goals>
  8. <goal>copy-dependencies</goal>
  9. </goals>
  10. </execution>
  11. </executions>
  12. <configuration>
  13. <outputDirectory>${project.build.directory}/lib</outputDirectory>
  14. <excludeTransitive>false</excludeTransitive>
  15. <stripVersion>true</stripVersion>
  16. </configuration>
  17. </plugin>
  • outputDirectory ${project.build.directory}是maven变量,表示target目录。如果不写的话,将在根目录下创建 target\dependency 目录;
  • excludeTransitive 表示是否不包含间接依赖的包;
  • stripVersion 表示复制的jar文件去掉版本信息。(依赖的jar包都不带版本号了,例如:asm.jar,默认:asm-5.0.4.jar)

3、maven-jar-plugin:

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-jar-plugin</artifactId>
  4. <configuration>
  5. <excludes> <!--资源文件不打进jar包中-->
  6. <exclude>*.**</exclude>
  7. <exclude>*/*.xml</exclude>
  8. </excludes>
  9. <archive>
  10. <manifest>
  11. <addClasspath>true</addClasspath>
  12. <classpathPrefix>lib/</classpathPrefix>
  13. <useUniqueVersions>false</useUniqueVersions><!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
  14. <mainClass>XXX.XXX.Main</mainClass>
  15. </manifest>
  16. </archive>
  17. <outputDirectory>${project.build.directory}</outputDirectory>
  18. </configuration>
  19. </plugin>

4、maven-javadoc-plugin:

产生文档包插件

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-javadoc-plugin</artifactId>
  4. <version>2.10.4</version>
  5. <configuration>
  6. <aggregate>true</aggregate>
  7. </configuration>
  8. <executions>
  9. <execution>
  10. <phase>package</phase>
  11. <goals>
  12. <goal>jar</goal>
  13. </goals>
  14. </execution>
  15. </executions>
  16. </plugin>

5、maven-source-plugin:
通过 maven-source-plugin 生产源码包插件

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-source-plugin</artifactId>
  4. <version>2.4</version>
  5. <configuration>
  6. <attach>true</attach>
  7. </configuration>
  8. <executions>
  9. <execution>
  10. <phase>package</phase>
  11. <goals>
  12. <goal>jar-no-fork</goal>
  13. </goals>
  14. </execution>
  15. </executions>
  16. </plugin>

参考:https://www.cnblogs.com/binarylei/p/8628242.html

二、resources节点介绍

在开发maven项目时,通常把配置文件放到src/main/resources目录下。maven的resources节点是对配置文件的管理,将项目中的配置文件打包到jar包里,还是外面。

1、resources一般配置:

  1. <finalName>test</finalName>
  2. <filters>
  3. <filter>${basedir}/filters/filter-${profile.active}.properties</filter>
  4. </filters>
  5. <resources>
  6. <resource>
  7. <directory>src/main/resources</directory>
  8. <targetPath>${project.build.directory}/config</targetPath>
  9. <filtering>true</filtering>
  10. <includes>
  11. <include>**/*.conf</include>
  12. </includes>
  13. </resource>
  14. <resource>
  15. <directory>src/main/resources</directory>
  16. <filtering>true</filtering>
  17. <includes>
  18. <include>**/*.properties</include>
  19. <include>**/*.xml</include>
  20. </includes>
  21. </resource>
  22. </resources>

这里配置了两个resource,默认的targetPath是当前路径,也就是maven打包会将配置文件打进jar中。可以通过targetPath,将配置文件复制到其他目录。不过这里要注意,如果配置文件放到了其他路径,在打包时记得classpath要指定到具体位置。

2、filter开启替换:

  1. <build>
  2. <resources>
  3. <resource>
  4. <directory>src/main/resources</directory>
  5. <filtering>true</filtering>
  6. <includes>
  7. <include>context.xml</include>
  8. </includes>
  9. </resource>
  10. <resource>
  11. <directory>src/main/resources</directory>
  12. <filtering>false</filtering>
  13. <excludes>
  14. <exclude>context.xml</exclude>
  15. </excludes>
  16. </resource>
  17. </resources>
  18. </build>

配置中一共有两个resource,第一个resource配置是过滤src/main/resources目录下文件context.xml,若文件中有类似${key}这样的配置,就会根据maven的配置进行覆盖,让其使用真实值来填写,至于真实值如何来,后面会具体讲。

第二个resource配置是不过滤src/main/resources目录下除了context.xml的其他文件,也就不会用真实值来填写${key}这样的配置。

若是都存在的话,那就发生冲突了,这时会以为准。

也许有人会有疑问,若只需要过滤context.xml的话,那就只需要配置第一个resource就可以了吧。其实不然,若是只配置第一个resource,第二个不配置,那么当你运行maven打包操作后,你就会发现,在工程的classpath下只有context.xml文件了,其他配置文件都没有打过来。所以第二个resource是必不可少的,指明其他配置文件是不需要过滤的,但是同样需要打包到classpath下。

其实filtering为true的时候,这时只会把过滤的文件打到classpath下,filtering为false的时候,会把不需要过滤的文件打到classpath下。

还有一点需要说明,若都不配置,就是把directory下的所有配置文件都放到classpath下,若这时如下配置

  1. <resources>
  2. <resource>
  3. <directory>src/main/resources-dev</directory>
  4. </resource>
  5. <resource>
  6. <directory>src/main/resources</directory>
  7. </resource>
  8. </resources>

会以resources-dev下的相同文件为准,不一样的文件取并集。其实这样配合下面讲的profiles也可以实现各种不同环境的自动切换。前面讲到被过滤的文件会被真实值填写文件中的${key}位置,那这些真实值来自哪里呢?这些真实值其实都来自于profiles的配置里面,如下:

  1. <profiles>
  2. <profile>
  3. <id>dev</id>
  4. <activation>
  5. <activeByDefault>true</activeByDefault>
  6. </activation>
  7. <properties>
  8. <config>pathConfig</config>
  9. </properties>
  10. </profile>
  11. </profiles>

这段配置结合文章开头的配置,就会把context.xml文件中的${config}在打包过程中替换成pathConfig,而其他配置文件不受任何影响,利用这种特性也可以实现各种不同环境的自动切换,主要是在打包时指定使用哪个profile即可,命令如下:

  1. # 利用id=dev的profile配置打包
  2. man clean package -Pdev

利用以上配置时,若是配置信息比较多,可能导致需要配置很多项,看起来不够简洁,这时可以利用profile的另外一个节点属性filter,可以指定文件,并使用指定文件中的配置信息来填写过滤文件的内容。配置如下:

  1. <profile>
  2. <id>dev</id>
  3. <activation>
  4. <activeByDefault>true</activeByDefault>
  5. </activation>
  6. <build>
  7. <filters>
  8. <filter>config-dev.properties</filter>
  9. </filters>
  10. </build>
  11. </profile>

发表评论

表情:
评论列表 (有 0 条评论,616人围观)

还没有评论,来说两句吧...

相关阅读