在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然,不就是 mvn clean install 么?事实上比较好的集成命令会稍微复杂些,下面是一些总结:spring
不要忘了clean: clean可以保证上一次构建的输出不会影响到本次构建。
使用deploy而不是install: 构建的SNAPSHOT输出应当被自动部署到私有Maven仓库供他人使用,这一点在前面已经详细论述。
使用-U参数: 该参数能强制让Maven检查全部SNAPSHOT依赖更新,确保集成基于最新的状态,若是没有该参数,Maven默认以天为单位检查更新,而持续集成的频率应该比这高不少。
使用-e参数:若是构建出现异常,该参数能让Maven打印完整的stack trace,以方便分析错误缘由。
使用-Dmaven.repo.local参数:若是持续集成服务器有不少任务,每一个任务都会使用本地仓库,下载依赖至本地仓库,为了不这种多线程使用本地仓库可能会引发的冲突,可使用-Dmaven.repo.local=/home/juven/ci/foo-repo/这样的参数为每一个任务分配本地仓库。
使用-B参数:该参数表示让Maven使用批处理模式构建项目,可以避免一些须要人工参与交互而形成的挂起状态。shell
综上,持续集成服务器上的集成命令应该为 mvn clean deploy -B -e -U -Dmaven.repo.local=xxx 。此外,按期清理持续集成服务器的本地Maven仓库也是个很好的习惯,这样能够避免浪费磁盘资源,几乎全部的持续集成服务器软件都支持本地的脚本任务,你能够写一行简单的shell或bat脚本,而后配置以天为单位自动清理仓库。须要注意的是,这么作的前提是你有私有Maven仓库,不然每次都从Internet下载全部依赖会是一场噩梦。apache
项目开发须要有多个环境,通常为开发,测试,预发,正式4个环境,经过maven能够实现按不一样环境进行打包部署,命令为: json
mvn package -P dev服务器
其中“dev“为环境的变量id, 能够本身定义, 我定义的名称为:dev,qa,pre,prod , 具体在pom.xml中的配置以下:多线程
<build> <finalName>es-provider</finalName> <resources> <resource> <targetPath>${project.build.directory}/classes</targetPath> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/*.xml</include> <include>**/*.properties</include> <include>**/*.json</include> </includes> </resource> <!-- 结合com.alibaba.dubbo.container.Main --> <resource> <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath> <directory>src/main/resources/context</directory> <filtering>true</filtering> <includes> <include>applicationContext.xml</include> </includes> </resource> </resources> <plugins> <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <configuration> <classesDirectory>target/classes/</classesDirectory> <archive> <manifest> <mainClass>com.alibaba.dubbo.container.Main</mainClass> <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 --> <useUniqueVersions>false</useUniqueVersions> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> <manifestEntries> <Class-Path>.</Class-Path> </manifestEntries> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <type>jar</type> <includeTypes>jar</includeTypes> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> <profiles> <profile> <id>dev</id> <build> <resources> <resource> <directory>src/main/resources-env/dev</directory> <excludes> <exclude>src/main/resources-env/prod</exclude> <exclude>src/main/resources-env/beta-a</exclude> <exclude>src/main/resources-env/pre</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> </profile> <profile> <id>beta-a</id> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <resources> <resource> <directory>src/main/resources-env/beta-a</directory> <excludes> <exclude>src/main/resources-env/prod</exclude> <exclude>src/main/resources-env/dev</exclude> <exclude>src/main/resources-env/pre</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> </profile> <profile> <id>pre</id> <build> <resources> <resource> <directory>src/main/resources-env/pre</directory> <excludes> <exclude>src/main/resources-env/dev</exclude> <exclude>src/main/resources-env/beta-a</exclude> <exclude>src/main/resources-env/prod</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> </profile> <profile> <id>prod</id> <build> <resources> <resource> <directory>src/main/resources-env/prod</directory> <excludes> <exclude>src/main/resources-env/dev</exclude> <exclude>src/main/resources-env/beta-a</exclude> <exclude>src/main/resources-env/pre</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> </profile> </profiles>
1.profiles定义了各个环境的变量idapp
2.filters中定义了变量配置文件的地址,其中地址中的环境变量就是上面profile中定义的值maven
3.resources中是定义哪些目录下的文件会被配置文件中定义的变量替换,通常咱们会把项目的配置文件放在src/main/resources下,像db,bean等,里面用到的变量在打包时就会根据filter中的变量配置替换成固定值ide