maven中pom文件build节点讲解
在maven的pom.xml文件中build节点用来管理执行maven声明周期的。主要包含如下内容:
<build>
<finalName>test</finalName>
<filters>
<filter>${basedir}/filters/filter-${profile.active}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>*.*</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
</plugin>
</plugins>
</build>
下面,我们重点讲解一些节点功能:
一、plugins节点介绍:
1、maven-compiler-plugin、maven-resources-plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
通常用来设置代码文件、资源文件的字符集等。
2、maven-dependency-plugin:
拷贝依赖包 mvn dependency:copy-dependencies,默认会拷到项目的 target\dependency 目录,可以配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
</configuration>
</plugin>
- outputDirectory ${project.build.directory}是maven变量,表示target目录。如果不写的话,将在根目录下创建 target\dependency 目录;
- excludeTransitive 表示是否不包含间接依赖的包;
- stripVersion 表示复制的jar文件去掉版本信息。(依赖的jar包都不带版本号了,例如:asm.jar,默认:asm-5.0.4.jar)
3、maven-jar-plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<excludes> <!--资源文件不打进jar包中-->
<exclude>*.**</exclude>
<exclude>*/*.xml</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions><!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
<mainClass>XXX.XXX.Main</mainClass>
</manifest>
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
4、maven-javadoc-plugin:
产生文档包插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.4</version>
<configuration>
<aggregate>true</aggregate>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
5、maven-source-plugin:
通过 maven-source-plugin 生产源码包插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
参考:https://www.cnblogs.com/binarylei/p/8628242.html
二、resources节点介绍
在开发maven项目时,通常把配置文件放到src/main/resources目录下。maven的resources节点是对配置文件的管理,将项目中的配置文件打包到jar包里,还是外面。
1、resources一般配置:
<finalName>test</finalName>
<filters>
<filter>${basedir}/filters/filter-${profile.active}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}/config</targetPath>
<filtering>true</filtering>
<includes>
<include>**/*.conf</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
这里配置了两个resource,默认的targetPath是当前路径,也就是maven打包会将配置文件打进jar中。可以通过targetPath,将配置文件复制到其他目录。不过这里要注意,如果配置文件放到了其他路径,在打包时记得classpath要指定到具体位置。
2、filter开启替换:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>context.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>context.xml</exclude>
</excludes>
</resource>
</resources>
</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下。
还有一点需要说明,若
<resources>
<resource>
<directory>src/main/resources-dev</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
会以resources-dev下的相同文件为准,不一样的文件取并集。其实这样配合下面讲的profiles也可以实现各种不同环境的自动切换。前面讲到被过滤的文件会被真实值填写文件中的${key}位置,那这些真实值来自哪里呢?这些真实值其实都来自于profiles的配置里面,如下:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<config>pathConfig</config>
</properties>
</profile>
</profiles>
这段配置结合文章开头的配置,就会把context.xml文件中的${config}在打包过程中替换成pathConfig,而其他配置文件不受任何影响,利用这种特性也可以实现各种不同环境的自动切换,主要是在打包时指定使用哪个profile即可,命令如下:
# 利用id=dev的profile配置打包
man clean package -Pdev
利用以上配置时,若是配置信息比较多,可能导致
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>config-dev.properties</filter>
</filters>
</build>
</profile>
还没有评论,来说两句吧...