工作笔记-Maven依赖:POM Reference

POM文件

POM, Project Object Model, 项目对象模型,是Maven项目的XML表示,一个pom.xml文件可以几乎完成所有maven项目的配置。POM标签分为三大类,项目基础及依赖、项目构建、环境及资源文件。这三大类是比较普遍和重要的配置归类,除这三大类之外还有一些辅助配置,项目中接触的较少。

按照顺序把三大类的配置完成了, 一个Maven项目大致上就能配置得很全面了。

Basics: 项目基础及依赖

每一个Maven项目都有一个独一无二的坐标,由三个标签组成,分别是<groupId>、<artifactId>、<version>,比如:

<groupId>cn.jim</groupId>	
<artifactId>Netbar</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>NetBar</name>
<description>Netbar project</description>

这三个标签最终组成cn.jim.Netbar:1.0.0-SNAPSHOT。

<groupId>项目组或者开发团队,或者软件组, 一个groupId可以被多个artifact共享。

<artifactId>项目Id,每一个artifactId在groupId内是唯一的。

<version>版本号,有些项目除了version以外还需要借助<classifier>、<scope>等标签来定位。

<name>标签不是给机器看的,是给人看的,便于阅读。

<description>标签同理,有的人看了<name>还不是太懂,帮助阅读的。

<packaging>标签,指定了maven项目最终打包的文件类型,如果不定义这个标签,默认就是jar。可以选择的标签值有:jar, war, pom, maven-plugin, ejb, ear, rat .

以上这些标签定义的是项目基础

Maven的核心三大功能就是依赖、继承和聚合。<dependency>标签就是用于Maven依赖功能的配置,通过<dependency>配置的依赖,Maven会自动从本地或远程仓库找到对应的版本并且安装到打包的项目中,不用人工到处找jar包了。

<dependencies>
    <!-- netty -->
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.0.42.Final</version>
    </dependency>
    <!-- netty end -->
    <!-- spring mvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.2.4.RELEASE</version>
    </dependency>
</dependencies>

在多个依赖之间,有时候会发生jar包冲突的情况,不同的依赖引用了同一个jar包,但是引用的版本不同,Maven在打包时不知道使用哪一个版本,所以产生了报错。在这种情况下可以使用<exclusion>标签来排除指定的jar包。

<dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-embedder</artifactId>
      <version>2.0</version>
      <exclusions>
        <exclusion>
          <groupId>org.apache.maven</groupId>
          <artifactId>maven-core</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    ...
  </dependencies>

Build:项目构建

<build>标签下配置的是与项目构建相关的。

1. 基础配置

以下标签应该在<build>标签的范围内,属于<build>基础配置:

<defaultGoal> 默认执行的打包指令,比如install, package等

<directory> 打包文件的生成目录,默认为${basedir}/target

<finalName> 打包生成的文件名称,默认是${artifactId}-${version}

<filters> *.properties属性配置文件的存放地址,Maven默认的地址是${basedir}/src/main/filters/

<sourceDirectory> ,<scriptSourceDirectory>,<testSourceDirectory>,<outPutDirectory>,<testOutputDirectory>

*Directory的地址,使用默认的就好。

以上标签配置举例:

<build>
  <defaultGoal>install</defaultGoal>
  <directory>${basedir}/target</directory>
  <finalName>${artifactId}-${version}</finalName>
  <filters>
    <filter>filters/filter1.properties</filter>
  </filters>
  ...
  <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
  <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
  <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
  <outputDirectory>${basedir}/target/classes</outputDirectory>
  <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
</build>

事实上这些标签都有默认配置,了解其意义就好,有特殊需求时才需要显示配置。

2. <resources>标签

配置资源文件,资源文件不是源代码,一般不需要编译。

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.**</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>

以上示例resources的目录是src/main/resources(实际上也是默认的resources目录),可以使用include指定要加载的资源文件,同理也可以使用exclude标签,include和exclude同时对同一个文件使用时,只有exclude生效。<filtering>为true时可以使用.properties中的键值对来替换Pom文件中的${}值。

3. <plugins>标签

<plugin>定义maven构建过程中使用的插件。

maven在构建过程中需要使用插件,有几个常用的插件,是maven自带的

maven-resources-plugin 处理源资源文件和测试资源文件 resources,testResources 

maven-compiler-plugin 编译源文件和测试源文件 compile,testCompile 

maven-surefire-plugin 执行测试文件 test 

maven-jar-plugin 创建 jar jar 

maven-war-plugin 创建war

maven自带的插件有默认版本,如果不是有特殊需要,不需要显示定义和配置。此外如果还需要maven以外的插件,则需要在<build>标签范围内配置。

<build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <extensions>false</extensions>
        <inherited>true</inherited>
        <configuration>
          <classifier>test</classifier>
        </configuration>
        <dependencies>...</dependencies>
        <executions>...</executions>
      </plugin>
    </plugins>
  </build>

环境配置

此类下有几个重要的标签。

1. <repositories>

 <repositories>
    <repository>
      <releases>
        <enabled>false</enabled>
        <updatePolicy>always</updatePolicy>
        <checksumPolicy>warn</checksumPolicy>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>never</updatePolicy>
        <checksumPolicy>fail</checksumPolicy>
      </snapshots>
      <id>codehausSnapshots</id>
      <name>Codehaus Snapshots</name>
      <url>http://snapshots.maven.codehaus.org/maven2</url>
      <layout>default</layout>
    </repository>
  </repositories>
  <pluginRepositories>
    ...
  </pluginRepositories>
  ...
</project>

maven构建时搜索依赖库的顺序是:1. 本地代码仓 2. 远程代码仓 3.maven中央仓。 <repositories>可以配置远程代码仓。<snapshots>和<releases>分别配置的是测试版本和发布版本,如果<enabled>为true,就可以该repository里搜索并安装jar版本,反之不可以。<updataPolicy>是远程代码库到本地的更新频率,有四个级别always, daily (default), interval:X (where X is an integer in minutes) , never. 

2. <distrubutionManagement>

发布配置,maven deploy指令,可以发布jar包到配置的地址仓库。如果不单独配置<snapshotRepository>,测试版本也会默认使用<repository>中的配置。

<distributionManagement>
    <repository>
      <uniqueVersion>false</uniqueVersion>
      <id>corp1</id>
      <name>Corporate Repository</name>
      <url>scp://repo/maven2</url>
      <layout>default</layout>
    </repository>
    <snapshotRepository>
      <uniqueVersion>true</uniqueVersion>
      <id>propSnap</id>
      <name>Propellors Snapshots</name>
      <url>sftp://propellers.net/maven</url>
      <layout>legacy</layout>
    </snapshotRepository>
    ...
  </distributionManagement>
  ...
</project>

3. <profiles>

我们希望在不同的机器、服务器上使用不同的构建配置,可以通过profiles来实现。

   <profiles>
        <profile>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <id>dev</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/profiles/dev</directory>
                        <includes>
                            <include>dataSource.xml</include>
                            <include>logback.xml</include>
                            <include>system.properties</include>
                        </includes>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>prod</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/profiles/prod</directory>
                        <includes>
                            <include>dataSource.xml</include>
                            <include>logback.xml</include>
                            <include>system.properties</include>
                        </includes>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>

开发和生产通过不同的profile可以使用不同的<build>配置,这些<build>配置是基于profile的,和之前的基本配置不冲突。

总结

完成一个POM的配置:

1. 基础配置<groupId><artifactId><version>等。

2. 依赖配置<dependencies><dependency>。

3. <build>标签构建基础配置(可默认)。

4. <build>标签resource配置。

5. <build>标签plugin配置。

6. <repositories>版本仓库配置。

7. <distributionManagement>版本发布配置。

8. <profiles>配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值