美文网首页
从一份配置清单详解Maven配置

从一份配置清单详解Maven配置

作者: superxcp | 来源:发表于2019-05-17 16:38 被阅读0次
maven.png

一.概述:

这是一份我们maven项目使用的详细配置,今天我们以这份配置文件详细介绍下maven的使用方法。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <parent>
        <groupId>cn.kaka</groupId>
        <artifactId>kaka_cms_parent</artifactId>
        <version>1.0.0</version>
        <relativePath>../kaka_cms_parent/pom.xml</relativePath>
    </parent>

    <groupId>cn.kaka</groupId>
    <artifactId>kaka_cms_admin</artifactId>
    <modelVersion>4.0.0</modelVersion>
    <packaging>war</packaging>

    <properties>
        <!-- 项目编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--JDK 版本 -->
        <project.jdk.version>1.8</project.jdk.version>
        <!-- kaka cms service -->
        <kaka_cms_service.version>1.0.0</kaka_cms_service.version>
        <jetty.version>9.2.8.v20150217</jetty.version>
        <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
        <project.name>kaka_cms_admin</project.name>
    </properties>
    <dependencies>
        <!-- kaka cms service -->
        <dependency>
            <groupId>cn.kaka</groupId>
            <artifactId>kaka_cms_service</artifactId>
            <version>${kaka_cms_service.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.2.14.RELEASE</version>
        </dependency>

        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <!-- poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>
        <!-- commons fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- commons io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.kaka.nps</groupId>
            <artifactId>kaka-nps-sdk</artifactId>
            <version>1.5.1</version>
        </dependency>

        <dependency>
            <groupId>inner-passport</groupId>
            <artifactId>inner-passport</artifactId>
            <version>1.0.1</version>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commons-logging.version}</version>
        </dependency>

        <dependency>
            <groupId>httpcore</groupId>
            <artifactId>httpcore</artifactId>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>com.kaka.stat</groupId>
            <artifactId>stat-open-api-sdk</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        ......

    </dependencies>

    <build>
        <finalName>${project.name}_${maven.build.timestamp}</finalName>
        <filters>
            <filter>src/main/filters/filter-${env}.properties</filter>
        </filters>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.txt</include>
                    <include>**/*.ftl</include>
                    <include>**/*.js</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/java</directory>
                <includes>
                    <include>**/*.json</include>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xsd</include>
                    <include>**/*.js</include>
                </includes>
            </testResource>
            <testResource>
                <directory>src/test/resources</directory>
            </testResource>
        </testResources>
        <extensions>
            <extension>
                <groupId>org.apache.maven.wagon</groupId>
                <artifactId>wagon-ssh</artifactId>
                <version>2.8</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>${project.jdk.version}</source>
                    <target>${project.jdk.version}</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId> 
                <version>2.3</version>
                <configuration>
                    <webResources>
                        <resource>
                            <directory>src/main/webapp/WEB-INF</directory>

                            <filtering>true</filtering> 
                            <targetPath>WEB-INF</targetPath>                    
                        </resource>
                    </webResources>                 
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>${jetty.version}</version>
                <configuration>
                    <!--<scanIntervalSecond>10</scanIntervalSecond>-->
                    <webApp>
                        <contextPath>/</contextPath>
                    </webApp>
                    <stopKey>exit</stopKey>
                    <stopPort>9998</stopPort>
                    <httpConnector>
                        <port>9089</port>
                    </httpConnector>
                    <!--<encoding>UTF-8</encoding>-->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>wagon-maven-plugin</artifactId>
                <version>1.0</version>
                <configuration>
                    <fromFile>target/${project.name}_${maven.build.timestamp}.war</fromFile>
                    <url>scp://devftp:ztemt123@192.168.4.250/data/kaka_cms/${env}/</url>
                    <commands>
                        <command> echo ${project.name}_${maven.build.timestamp}.war >> /data/kaka_cms/${env}/cms_admin_${env}.log</command>
                    </commands>
                    <displayCommandOutputs>true</displayCommandOutputs>
                </configuration>
            </plugin>

            <!--maven 使用surefure进行测试 可以执行testng或junit脚本-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <suiteXmlFiles>
                        <suiteXmlFile>testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>test</id>
            <properties>
                <env>test</env>
            </properties>
        </profile>
        <profile>
            <id>product</id>
            <properties>
                <env>product</env>
            </properties>
        </profile>
    </profiles>
</project>

1.本项目信息

    <groupId>cn.kaka</groupId>
    <artifactId>kaka_cms_admin</artifactId>
    <modelVersion>4.0.0</modelVersion>
    <packaging>war</packaging>

首先,这个项目是卡卡公司(公司名不便透露,暂时以kaka为公司名代替)的项目,项目名kaka_cms_admin,是一个后台项目,版本号4.0.0,如果别的项目想依赖使用admin这个项目,dependency标签里面的三个信息必须跟这个信息相同,否则引用不到。最后打成的包是war包,可以运行为web项目的包。

2.maven pom文件之间的关系

    <parent>
        <groupId>cn.kaka</groupId>
        <artifactId>kaka_cms_parent</artifactId>
        <version>1.0.0</version>
        <relativePath>../kaka_cms_parent/pom.xml</relativePath>
    </parent>

maven管理的每个项目都是被当做对象看待的,maven项目之间的关系有依赖、继承和聚合三种关系。

  • 依赖关系:很简单也很好理解,比如A项目依赖于B项目,只要在A项目的pom文件中引入B项目的pom配置即可;
  • 继承关系:父项目依赖的jar包在子项目中都可以直接使用,比如A项目是B项目的父项目,B项目的pom文件中应该有<parent>标签,里面有父项目的3个信息(groupId、artifactId、version),类似上面图片代码所示,其中<relative>标签表明加载父项目的jar包时,先从该标签指定的地址中加载jar包,加载不到去maven本地路径查找加载,再加载不到去中央仓库查找加载。
  • 聚合关系:与继承关系很相似,甚至可以说也是一种继承关系,相同的地方是子项目pom文件中也有<parent>标签,可以继承父项目的jar包,不相同的地方是父项目(kaka_cms_parent)中也保存了子项目的信息,以<module>标签标注,如下图所示,表明父项目(kaka_cms_parent)中聚合了kaka_jee_framework、kaka_cms_admin、kaka_cms_api、kaka_cms_service、kaka_cms_task这五个项目。
    <modules>
        <module>../kaka_jee_framework</module>
        <module>../kaka_cms_admin</module>
        <module>../kaka_cms_api</module>
        <module>../kaka_cms_service</module>
        <module>../kaka_cms_task</module>
    </modules>

3. property属性

    <properties>
        <!-- 项目编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--JDK 版本 -->
        <kaka_cms_service.version>1.0.0</kaka_cms_service.version>
        ......
    </properties>

property是自己命名的属性,就像是java中我们自己命名变量一样,如果想在pom文件中使用该属性,使用${kaka_cms_service.version}这种引用方式。设计这种变量的意义在于,如果很多子项目引用了父项目的jar包,要改下引用jar包的版本(例如修改jdk版本),只要改这个属性的变量值就ok了,不用所有项目中的值都改一遍。引用如下:

       <dependency>
            <groupId>cn.kaka</groupId>
            <artifactId>kaka_cms_service</artifactId>
            <version>${kaka_cms_service.version}</version>
        </dependency>

4. <profile>属性

    <profiles>
        <profile>
            <id>test</id>
            <properties>
                <env>test</env>
            </properties>
        </profile>
        <profile>
            <id>product</id>
            <properties>
                <env>product</env>
            </properties>
        </profile>
    </profiles>

定义了各个环境的变量id,我们这里有test环境和product环境。

5. <build>属性

  • (1)<finalName>:打包成的文件名,我们这个项目最后打包成的名字是kaka_cms_admin_201905150841
<finalName>${project.name}_${maven.build.timestamp}</finalName>
  • (2)<filter>定义了变量配置文件的地址,其中地址中的环境变量就是上面profile中定义的值。
<filter>src/main/filters/filter-${env}.properties</filter>
  • (3)定义了哪些目录(src/main/java)下的文件会被配置文件中定义的变量替换,项目的配置文件一般在src/main/resource中,里面用到的变量在打包时就会根据filter中的变量配置替换成固定值。
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.txt</include>
                    <include>**/*.ftl</include>
                    <include>**/*.js</include>
                </includes>
            </resource>
  • (4)与<resource>相同,只不过是测试时使用的配置文件。
  • (5)<extension>是一系列build过程中要使用的产品,会包含在running bulid‘s classpath里面。他们可以开启extensions,也可以通过提供条件来激活plugins,简单来讲,extensions是在build过程被激活的产品 。
<build>
    <extensions>
        <extension>
            <groupId>org.apache.maven.wagon</groupId>
            <artifactId>wagon-ssh</artifactId>
            <version>2.8</version>
        </extension>
    </extensions>
    <plugins>
        <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>wagon-maven-plugin</artifactId>
                <version>1.0</version>
                <configuration>
                    <fromFile>target/${project.name}_${maven.build.timestamp}.war</fromFile>
                    <url>scp://user:password@192.168.4.250/data/kaka_cms/${env}/</url>
                    <commands>
                        <command> echo ${project.name}_${maven.build.timestamp}.war >> /data/kaka_cms/${env}/cms_admin_${env}.log</command>
                    </commands>
                    <displayCommandOutputs>true</displayCommandOutputs>
                </configuration>
            </plugin>
    </plugins>
</build>

wagon程序开发完成后部署到线上linux机器,可能需要经历打包。将包文件传到服务器,ssh连上服务器,桥命令启动程序等一系列繁琐的步骤,实际上这些步骤都可以通过maven的一个插件wagon-maven-plugin来自动完成。其中:
<fromFile>target/{project.name}_{maven.build.timestamp}.war</fromFile>是要上传到服务器的文件;
<url>scp://user:password@192.168.4.250/data/kaka_cms/${env}/</url>配置服务器的用户、密码、地址以及文件上传的目录。
配置完成后,运营命令:

mvn clean install -Dmaven.test.skip=true -P test wagon:upload-single wagon:sshexec

解释下命令:
-Dmaven.test.skip=true --- 不执行测试用例,也不编译测试用例类;
-P test ---测试环境(P是profile的意思);
wagon:upload-single --- 上传单文件;
wagon:sshexec --- 运行command命令;
(我们这里会把war文件的名字上传到一个log文件中,机器定时检测该log文件,如果有新包更新,就会去这个/data/kaka_cms/${env}/文件中取包进行发布)

后记:由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!

相关文章

网友评论

      本文标题:从一份配置清单详解Maven配置

      本文链接:https://www.haomeiwen.com/subject/urnmaqtx.html