打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Maven、Nexus、SVN、Hudson 以及团队异地开发那些事(1)

1      Maven

1.1  Maven是什么

maven起源于apache组织为了简化其JakartaTurbine项目的编译,而开发的一套项目管理工具。接触maven之前,maven对你的印象可能是:

1)        build工具?

2)        依赖管理工具?

3)        只是遵循了“Convention over Coding”原则,可以重用的ant脚本?

实际上,maven究竟是什么?答案是yes,but不仅仅是以上几个方面:

Maven是一个软件项目管理工具和理解工具。

Maven通过POM(ProjectObject Model)对一个项目的应该具有的信息进行了标准化;在POM的基础上,定义一套统一的项目编译和发布项目成果和信息的流程,并能让该项目成果在多个项目之间共享。

Maven的目标是什么:

1)        让每个项目的编译过程清晰并且一致;

2)        提供了一套统一的构建流程;

3)        提供了项目开发过程中信息发布的机制;

4)        遵循了一套软件工程的最佳实践,鼓励组件解耦与重用(源码重用只是最初级的重用,重用的级别越高,带来的收益越大)

1.2  Maven的配置

1)        Global settings:$M2_HOME/conf/settings.xml

2)        User Settings:LocalRepository位置下的的settings.xml

3)        User的Setting可以覆盖Global中的设置(就近原则)。

1.3  Maven初体验

Simple Maven  Project Demo

2种与maven交互的方式:mvnLifeCycle/mvn pluginId:goal

Maven Central Repository:http://central.maven.org/maven2/

Maven仓库的布局:

/<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packaging>

 

在哪里搜索artifact的GAV?

1)       http://search.maven.org central仓库的供查询版本;

2)       http://repository.apache.org

3)       http://www.artifact-repository.org

4)       http://mvnrepository.com

5)       http://www.mvnbrowser.com

6)       http://www.jarvana.com

1.4  Maven项目的标准布局

表1?1 Maven的标准布局

src/main/java

Application/Library sources

src/main/resources

Application/Library resources

src/main/filters

Resource filter files

src/main/assembly

Assembly descriptors

src/main/config

Configuration files

src/main/scripts

Application/Library scripts

src/main/webapp

Web application sources

src/test/java

Test sources

src/test/resources

Test resources

src/test/filters

Test resource filter files

src/site

Site

LICENSE.txt

Project's license

NOTICE.txt

Notices and attributions required by libraries that the project depends on

README.txt

Project's readme

1.5  Maven常用基本概念

1.5.1             Maven的LifeCycle

有序的阶段(phase)集合,maven内置定义了三种LifeCycle:(可以以“就诊流程”作为类比,其中的“护士分诊”、“医师检验”等=phase,整个“就诊流程”可以看成是一个就诊的LifeCycle):

1)        Default LifeCycle:

       <phases>

         <phase>validate</phase>

         <phase>initialize</phase>

         <phase>generate-sources</phase>

         <phase>process-sources</phase>

         <phase>generate-resources</phase>

         <phase>process-resources</phase>

         <phase>compile</phase>

         <phase>process-classes</phase>

         <phase>generate-test-sources</phase>

         <phase>process-test-sources</phase>

         <phase>generate-test-resources</phase>

         <phase>process-test-resources</phase>

         <phase>test-compile</phase>

         <phase>process-test-classes</phase>

         <phase>test</phase>

         <phase>prepare-package</phase>

         <phase>package</phase>

         <phase>pre-integration-test</phase>

         <phase>integration-test</phase>

         <phase>post-integration-test</phase>

         <phase>verify</phase>

         <phase>install</phase>

         <phase>deploy</phase>

       </phases>

2)        Clean LifeCycle:

       <phases>

         <phase>pre-clean</phase>

         <phase>clean</phase>

         <phase>post-clean</phase>

       </phases>

       <default-phases>

         <clean>

           org.apache.maven.plugins:maven-clean-plugin:2.5:clean

         </clean>

       </default-phases>

3)        Site LifeCycle:

       <phases>

         <phase>pre-site</phase>

         <phase>site</phase>

         <phase>post-site</phase>

         <phase>site-deploy</phase>

       </phases>

       <default-phases>

         <site>

           org.apache.maven.plugins:maven-site-plugin:3.3:site

         </site>

         <site-deploy>

           org.apache.maven.plugins:maven-site-plugin:3.3:deploy

         </site-deploy>

       </default-phases>

1.5.2             Maven的Plugin和Goal

plugin是一组相关的Goal的集合(可以以“医院各专业科室”作为类比,检验科负责化验血尿等体液、放射科进行CT、X光检验):


图1?1 Plugins与Goal的关系

Maven的LifeCycle与Goal之间的关系:

 

图1?2 LifeCycle的phase与某plugin绑定的示意图

当packaging不同时,maven default生命周期绑定到不同的plugins的不同的goal上面。当packaging为jar时,maven default lifeCycle与各个plugins默认的绑定关系:

图1?3 packaging为jar时default LifeCycle的phases及pahase绑定的plugin和goal(部分phase)

1.5.3             Maven的坐标

maven采用坐标来唯一定位一个组件,maven的坐标由以下几个部分组成。

1)        groupId:公司、组织、项目组等,一般为倒置的域名,例如com.shentong;

2)        artifactId: 在groupId下能唯一识别一个项目的标识符;

3)        version:该ArtifactId发布的一个版本,对于正在开发的非稳定版本的Artifact,约定以SNAPSHOT作为后缀(“-SNAPSHOT”作为后缀,注意前面的“-”,并且SNAPSHOT全部大写)。

4)        packaging:打包方式,有pom, jar,maven-plugin, ejb, war, ear, rar, par等

5)        classifier

主要有以下两种用途:

a)        附加到主要的artifact之上的附属组件,例如sources和javadoc;

b)        由一个pom生成的不同文件,例如针对不同的JDK生成的不同的版本,如artifactId-version-jdk14.jar/artifactId-version-jdk15.jar

经常使用的GAV是坐标的简称,即G=GroupId,A=ArtifactId,V=Version),在上传组件到nexus服务器上面时经常用到。

1.5.4             dependency Scope

依赖范围,主要用来控制2种情况:

1)        限制传递依赖;

2)        形成不同build类型(例如编译主代码、编译测试代码、运行测试代码)的不同的classpath。

 有如下6种scope:

1)        compile

默认的scope,该范围的依赖对所有的编译类型的classpath都有效,并且所有该依赖的依赖,也会作为该项目的compile类型的依赖;

2)        provided

与compile类似,只会添加到compile和test时的classpath,并且不具有传递性;典型的如servlet-api.jar,编译时仍然需要从maven仓库中下载,但是运行时由容器例如tomcat提供;

3)        runtime

表明在compile时不需要,只是在运行时需要。典型的如postgres JDBC驱动等通过反射调用的依赖;

4)        test

表明在主代码编译和执行时并不需要,只是在单元测试代码编译和运行时需要,例如单元测试框架JUnit;

5)        system

与provided类似,但是需要显示指定该依赖在本地文件系统中的位置,通过<systemPath>。system scope类型的依赖,maven在构建时不会从maven仓库中寻找,直接从指定的systemPath中寻找。典型如引用jre的tools.jar

6)        import

只适用于dependency的type为pom类型的,不常用。暂不介绍,使用到时可参照maven 的reference。

表1?2 直接依赖的scope和传递依赖的scope不同组合的实际scope效果

传递依赖

 

直接依赖

compile

provided

runtime

test

compile

compile

-

runtime

-

provided

provided

-

provided

-

runtime

runtime

-

runtime

-

test

test

-

test

-

1.5.5             Maven Repository

maven仓库分类:


图1?4 Maven仓库分类

1.5.5.1    本地仓库

在User setting配置文件中指定的<localRepository>节点的值所指向的位置。

1.5.5.2    远程仓库

“远程仓库”是相对“本地仓库”来说的,不是“本地”的,就都是远程,不管是局域网还是互联网上的,远程仓库主要有如下几种类型:

1)        maven的central仓库,在Super POM($M2_HOME\lib\maven-model-builder-x.x.jar\org\apache\maven\model\pom-4.0.0.xml)中定义;

2)        其他公共仓库:

a)        Java.net Maven的库;

b)        JBoss Maven库。

3)        私服:远程仓库的一种,采用maven仓库管理软件(例如nexus)在本地局域网搭建的maven仓库。

1.5.5.3    私服

图1?5 maven私服部署图

私服的作用:

1)        节省网络带宽:每个组件只会从Internet上下载一次(首次请求时下载),然后,就保存在私服的缓存中了,团队其他成员后续的请求,直接从私服下载;没有互联网连接的时候,只要组件已经被私服缓存,就能够不访问Internet从私服下载组件;

2)        加速maven的构建:对SNAPSHOT版本不停的检查更新,会耗费较多的Internet网络流量;

3)        可部署第三方组件至私服,避免重复下载,例如oracle的JDBC驱动,公司内部的组件,如oscar的JDBC驱动和集群的驱动;

4)        可部署团队开发的产品组件至私服,避免组件在团队成员之间不规范的传递,特别是SNAPSHOT版本的传递。

 如何配置项目使用其他仓库(非central仓库)?

1)        在pom.xml使用

<respositories>

         <respository>

                   <id></id>

<name></name>

<url></url>

<layout></layout>

         </respository>

</ respositories >

声明;

2)        需要验证的远程仓库,要在settings.xml文件中使用

<servers>

         <server>

                   <id></id>

                   <user></user>

                   <password></password>

</server>

</servers>

声明,并且保持id与pom.xml中声明的respository的id一致。

 

使用nexus私服来mirror central仓库,这样所有本应该从central仓库下载的组件,都直接从该mirror下载:

<mirrors>

         <mirror>

                   <!--Thissends everything else to /public -->

                   <id>nexus</id>

                   <mirrorOf>*</mirrorOf>

                   <url>http://192.168.1.231:8080/nexus/content/groups/public</url>

         </mirror>

</mirrors>

 

部署组件到仓库:在pom.xml文件中采用< distributionManagement >要部署的release和snapshot版本的组件分别到哪个仓库地址:

<distributionManagement>

         <snapshotRepository>

                   <id>nexus-snapshots</id>

                   <name>Server231snapshots</name>

                   url>http://192.168.1.231:8080/nexus/content/repositories/snapshots</url>

         </snapshotRepository>

         <repository>

                   <id>nexus-release</id>

                   <name>Server231releases</name>

                  <url>http://192.168.1.231:8080/nexus/content/repositories/releases</url>

         </repository>

</distributionManagement>

1.6  Maven常用命令和选项

1)        编译源文件:mvn compile

2)        打包:mvn package

3)        安装:mvn install

4)        部署:mvn deploy

5)        执行单元测试:mvn test

Dependency插件相关:

6)        mvn dependency:sources   下载所有dependency的源码包,当然该源码包在repository中必须存在(Central或者是Nexus上面)

7)        mvn dependency:resolve-Dclassifier=javadoc    下载所有dependency的docs包

……

 常用的option

1)        跳过单元测试,-DskipTests(省略了=true) 或者-Dmaven.test.skip=true

2)        –U 强制检查artifact的SNAPSHOT的最新版本

3)        –X输出调试信息

4)        –e 输出错误信息

5)        –P profilId使用profile

6)        定制组件的名字(想要与pom中的<name>不同时使用),例如-DfinalName=ABC,可以定制打包后文件的名字。

1.7  Maven的常用plugin

1)        maven-archetype-plugin:生成项目骨架,内置几百种archetype的骨架,帮你快速搭建标准项目结构;

2)        maven-assembly-plugin:定制特殊需求的打包需求,支持定义的assembly格式,并支持团队共享;

3)        maven-dependency-plugin:显示项目的实际依赖,进行依赖分析和优化;

4)         maven-help-plugin:help:system可以打印所有可用的环境变量和Java系统属性。help:effective-pom和help:effective-settings最为有用,它们分别打印项目的有效POM和有效settings。mvnhelp:active-profiles可以显示当前活跃的profile,有时候切换了build环境之后,build失败,可以通过以上help插件的goals来确认当前生效的设置是否是如你期望的设置。help:evaluate可以以交互的形式让用户检查当前maven系统中变量的值,例如查看${project.version}、自定义property的值,尤其时再在使用profile时,由于pom中各个profile中变化的部分采用property定义,查看pom无法直观获得property值,而help:evaluate则提供了一个交互式查看工具。

5)        maven-release-plugin:执行自动发布,重新checkout代码,或者在workingcopy中进行svn的tag/branch,指定release版本号,升级SNAPSHOT版本等;

6)        maven-resources-plugin:将resources文件进行变量替换,并拷贝到classpath目录下;

7)        maven-surefire-plugin:编译并执行单元测试;

参见:http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html


执行单个测试类的所有方法:

During development, you may run a singletest class repeatedly. To run this through Maven, set the test property to aspecific test case.

mvn -Dtest=TestCircle test

The value for the test parameter is thename of the test class (without the extension; we'll strip off the extension ifyou accidentally provide one).

可以使用通配符来执行多个单元测试类:

mvn -Dtest=TestCi*le test

And you may use multiple names/patterns,separated by commas:

mvn -Dtest=TestSquare,TestCi*le test

Running a set of methods in a Single TestClass

With version 2.7.3, you can run only ntests in a single Test Class.

NOTE : it's supported for junit 4.x andTestNG.

You must use the following syntax

mvn -Dtest=TestCircle#mytest test

You can use patterns too

mvn -Dtest=TestCircle#test* test

As of surefire 2.12.1, you can selectmultiple methods (JUnit4X only at this time, patches welcome)

mvn -Dtest=TestCircle#testOne+testTwo test

8)        build-helper-maven-plugin:显示plugin的online帮助

9)        exec-maven-plugin:执行可执行文件后者java代码;

mvn exec:java -Dexec.mainClass="com.some.package.Main”–Dexec:args=“args0 args1”

使用如下命令可以显示exec:java goal支持多少种参数:

mvn exec:help -Ddetail=true -Dgoal=java

10)    maven-tomcat-plugin:进行war的远程部署和卸载,运行war等,eclipse中maven化的web工程调试就要用到tomcat:run;(对应的还有轻量级jetty服务器的maven-jetty-plugin)

11)    maven-eclipse-plugin: 清理和生成eclipse的.project、.classpath文件;还可以生成myeclipse相关的项目文件。

12)    maven-shade-plugin:fat jar的包的工具,功能比maven-assembly-plugin弱,但是配置简单。

13)    maven-antrun-plugin:运行ant命令,适合与一些高度定制化的任务、尚没有对应的maven插件可以完成任务,例如与遗留系统的集成;常见的还有调用ant echo进行debug,输出一些属性的值。

14)    build-helper-maven-plugin:可以为一个project添加多个source目录(一个pom中只能有一个sourceDirectory节点,造成一个项目只能有一个主src目录的假象),配置方法如下:

<plugin>

                                     <groupId>org.codehaus.mojo</groupId>

                                     <artifactId>build-helper-maven-plugin</artifactId>

                                     <executions>

                                               <execution>

                                                        <phase>generate-sources</phase>

                                                        <goals>

                                                                 <goal>add-source</goal>

                                                        </goals>

                                                        <configuration>

                                                                 <sources>

                                                                           <source>src/plugin/parse-html/src/java</source>

                                                                          <source>src/plugin/parse-js/src/java</source>

                                                                 </sources>

                                                        </configuration>

                                               </execution>

                                     </executions>

                            </plugin>

所有的plugin列表以及reference文档,主要看plugin的配置、plugin常用的Goal、以及常用的参数:

1)        http://maven.apache.org/plugins/index.html

2)        http://mojo.codehaus.org/plugins.html

1.8  Maven进阶

1.8.1             Multi-Module Project和Maven的继承机制

项目复杂时,需要将项目拆分成多个子模块,能降低耦合,进行并行开发。maven通过<parent>和<module>来定义父子关系,parent的packaging定义成pom:

<project>

         <modelVersion>4.0.0</modelVersion>

         <groupId>com.geni_sage</groupId>

         <artifactId>gdme</artifactId>

         <packaging>pom</packaging>

 

         <modules>

                   <module>xxx</module>

                   <module>yyy</module>

</modules>

</project>

子类通过<parent>声明是谁的module:

<parent>

         <groupId>com.geni_sage</groupId>

         <artifactId>gdme</artifactId>

         <version>5.0-SNAPSHOT</version>

</parent>

parent的所有的属性、dependency、plugins都默认被其<module>继承(除非<module>显式定义同名的,并且配置不同的属性值)。parent和module的关系没有层级限制,可以定义多层。

1.8.2             Maven的属性

Maven有以下6类属性可以使用:

1)        POM属性

使用${属性表达式} (propertyexpressions)来引用的变量(可以想象是类似于XML中xpath技术的pom.xml节点引用)常用的有:

a)        ${project.build.sourceDirectory}:项目主源码文件的根目录,默认是src/main/java/;

b)        ${project.build.testSourceDirectory}:测试源码文件的根目录,默认是src/test/java/;

c)        ${project.build.directory}:项目构建输出目录,默认是target/;

d)        ${project.outputDirectory}:项目主代码编译成.class文件的默认的输出目录,target/classes;

e)        ${project.testOuputDirectory}:项目测试代码.class文件的输出目录,默认为target/test-classes/;

f)         ${project.groupId}:项目的groupId;

g)        ${project.artifactId}:项目的artifactId;

h)        ${project.version}:项目的version,与${version}等价;

i)          ${project.build.finalName}:项目打包输出的文件名字,默认为${project.artifactId}-${project.version}.

 

2)        内置属性(特殊变量):

project.basedir

当前project所在的路径

project.baseUri

也表示当前project所在路径,采用URI表示

maven.build.timestamp

表示系统开始构建的时间,可以通过定义

  <properties>

    <maven.build.timestamp.format>yyyyMMdd-HHmm</maven.build.timestamp.format>

  </properties>

来控制格式

3)        定义在pom中的properties:

  <properties>
    <spring-version>2.5.6</ spring-version >
  </properties>

在复杂项目(多模块项目中)使用properties能够保证统一引用一个版本的artifact。

4)        settings属性

与POM属性同理,使用以”settings.”开头的属性引用settings.xml文件中XML元素的值,常用的如${settings.localRepository},即本地maven仓库的地址。

5)        Java系统属性

所有的java系统属性,常用的如${user.home}指向了用户目录,使用mvnhelp:system可以查看所有的java系统属性。

6)        系统环境变量:

env.开头,可以直接引用环境变量,例如在使用<scope>system</scope>的时候,需要制定本地文件系统的文件路径,例如tomcat的lib目录中的servlet-api.jar,为了保证pom的可移植性,只需要引用${env.CATALINA_HOME}\lib\servlet-api.jar即可。

1.8.3             Maven的dependency优化

1)        传递依赖的冲突解决——“最短路径优先”和“同等路径长度下,先定义的优先”原则;

2)        在parent中定义的<dependency>会被左右的<module>默认继承,该机制可以用来控制所有<module>都会用到或者大部分用到的组件进行统一控制,避免重复,和重复带来的不一致;

3)        使用<dependencyManagement>声明的<dependency>可以避免<module>自己随意定义dependency的版本,<module>定义的时候只需要声明<groupId>和<artifactId>即可,不用定义<version>。注意与< dependency>定义的不同,在parent当中使用< dependency >不管子类需不需要,都会添加到<module>的依赖中,但是使用<dependencyManagement>声明的依赖,子类可以按需引用,默认不会添加到<module>的依赖中;

4)        使用<properties>元素定义需要进行全局统一控制的一些列相关的版本号或者在多个<module>中用到的组件的版本号,例如spring,多处用到使用<spring.version>2.5.6</spring.version>;

5)        使用变量引用,能引用maven内置变量的地方,尽量引用,减少重复,方便修改;

6)        使用<eclusions>截断传递依赖,避免将不必要的依赖引入到最终的组件打包中。

1.8.4             Maven的plugin优化

使用<plugins>和<pluginManagement>解决plugin继承和plugin按需继承的问题,原理同<dependencyManagement>和< dependency>的关系。

1.8.5             Maven的profile

profile目的是为了提高pom.xml的可移植性,针对不同的环境可以activate相应的环境的配置。

以一份代码,maven编译成功后,向京津两地的2个nexus服务器进行部署为例。

1.9  Maven与IDE

1.9.1             m2eclipse插件

需要注意的2个地方:

1)        使用自己下载最新版本的maven,而不要使用embedded maven

2)        2个配置的地方,installation和usersettings,保证effective setting是你预期的;

3)        切换新的workspace的时候,m2e又会默认使用embedded maven,需要重新设置。

常见问题:

1)        m2e插件安装subversion的connector(可直接从SCM中import mavenproject)

2)        由于m2e插件自己的问题,报错“xxx is missing”,使用命令行试试,命令行如果能成功,再使用update dependency。

1.9.2             maven-eclipse-plugin

如果非maven化之前,已经生成了.project、*.classpath, *.wtpmodules等与eclipse相关的项目文件,使用mvneclipse:clean先删除,后者手工删除,然后在通过命令行mvn eclipse:eclipse,自动生成这些文件,或者直接import exsiting maven project/import maven project from scm,都会自动生成这些文件(这也是不需要将这些文件提交到svn的原因)。

1.10    Maven  vs  ANT

从一个简单的例子看ant与maven的区别:

<project name="my-project"default="dist"basedir=".">

    <description>

        simple example build file

    </description>

  <!-- set globalproperties for this build -->

  <propertyname="src"location="src/main/java"/>

  <propertyname="build"location="target/classes"/>

  <propertyname="dist" location="target"/>

 

  <targetname="init">

    <!-- Createthe time stamp -->

    <tstamp/>

    <!-- Createthe build directory structure used by compile -->

    <mkdirdir="org.apache.maven.model.Build@6130fa43"/>

  </target>

 

  <targetname="compile"depends="init"

        description="compile the source " >

    <!-- Compilethe java code from ${src} into org.apache.maven.model.Build@6130fa43 -->

    <javacsrcdir="${src}"destdir="org.apache.maven.model.Build@6130fa43"/>

  </target>

 

  <targetname="dist"depends="compile"

        description="generate the distribution" >

    <!-- Createthe distribution directory -->

    <mkdirdir="${dist}/lib"/>

 

    <!-- Puteverything in org.apache.maven.model.Build@6130fa43 into theMyProject-${DSTAMP}.jar file -->

    <jarjarfile="${dist}/lib/MyProject-${DSTAMP}.jar"basedir="org.apache.maven.model.Build@6130fa43"/>

  </target>

 

  <targetname="clean"

        description="clean up" >

    <!-- Deletethe org.apache.maven.model.Build@6130fa43 and ${dist} directory trees -->

    <deletedir="org.apache.maven.model.Build@6130fa43"/>

    <deletedir="${dist}"/>

  </target>

</project>

ant clean/dist/compile分别执行清理、打包、编译。

同一个项目的pom文件:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sonatype.mavenbook</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
</project>

mvn install 会处理资源文件,编译源代码,运行单元测试,创建一个Jar包。

 

Ant 和 Maven 的区别是:

Apache Ant:

1)        Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码,哪里放置输出。随着时间的推移,非正式的约定出现了,但是它们还没有在产品中模式化。

2)        Ant 是过程式的,你必须明确的告诉 Ant 做什么,什么时候做。你必须告诉它去编译,然后复制,然后压缩。

3)        Ant 没有生命周期(LifeCycle),你必须定义目标和目标之间的依赖。你必须手工为每个目标附上一个任务序列。

Apache Maven:

1)        Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里。它把字节码放到 target/classes ,然后在 target 生成一个 JAR 文件。

2)        Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处理其它的事情。

3)        Maven 有一个生命周期,当你运行mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作

1.11    Maven给我们带来了什么

1)        显著降低了异地两地checkout代码的时间,未maven化之前,异地svn代码传输主要的时间耗费在jar包的传输上;

2)        为自动化构建(CI)提供了基础,为将开发人员进一步从保障性工作中解放出来,专注于算法和产品功能开发奠定了基础;

3)        提供了一套规范的编译和发布流程,并且将产品的组件在公司内部进行了集中式规范管理,无论是为以后多团队开发,或者是对外发布API开发包,都提供了一致的方案。

4)        为进一步理解和规范产品设计,执行模块重构和代码优化提供了基础。

1.12    FAQ

1)        能否使用自定义的项目布局?即目录结构与标准的不同?

可以,但是需要重新设置plugin使用自定义的文件位置。不推荐这样做。

2)        在maven的localRespository中偶尔会出现.lastUpdate文件,出现该文件的时候可能会造成mvn命令行编译通过,但是eclipse的m2e插件却编译不通过,why?

These filesindicate to Maven that it attempted to obtain the archive by download, but wasunsuccessful. In order to save bandwidth it will not attempt this againuntil a certain time period encoded in the file has elapsed. Thecommand line switch -U force maven to perform the update before the retryperiod. This may be necessary if you attempted to build while disconnectedfrom the network.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
maven in action(阅读记录)
Myeclipse搭建Maven开发环境
使用maven打包及发布源码
Maven中文手册
Maven入门教程(二)
docker-maven-plugin打包镜像并上传到私有仓库
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服