`

maven学习

 
阅读更多

刚从ANT转到MAVEN,使用了一小段时间,现在有时间多做些了解,拿起《maven in action》书读了一遍,比较基础,不过对maven也有了更多的一些了解,总结一些maven的小知识备用吧!不过要熟悉还是得多用,呵呵!

 

maven用户可以选择配置$M2_HOME/conf/setting.xml或者~/.m2/setting.xml.前者是全局范围的,整台机器上的所有用户都会直接受到该配置的影响,而后者是用户范围的,只有当前用户才会受到该配置的影响。推荐使用用户范围的setting.xml,主要原因是为了避免无意识地影响到系统中的其他用户。除此以外,还有个原因是便于maven升级。直接修改conf目录下的setting.xml会导致maven升级不便,每次升级到新版本的maven,都需要复制setting.xml文件,如果使用~/.m2目录下的setting.xml,就不会影响到maven安装文件,升级时就不需要触动setting.xml文件。

POM:project object model

就像make的makefile,ant中的build.xml一样,maven项目的核心是pom.xml.

mvn clean compile
mvn clean test    
mvn clean package  打包
mvn clean install 将打包好的jar安装到maven本地仓库中
以上的命令越往后的,执行的内容越多,会包含前面的动作,如test会先compile,后test.而install,则是先package,再install,而package本身也要先执行test,依次向上推。

maven的一大功能是管理项目依赖,为了能自动化地解析任何一个JAVA构件,maven就必须将它们唯一标识,这就依赖管理的底层基础-坐标。
maven定义了这样一组规则:世界上任何一个构件都可以使用maven坐标唯一标识,maven坐标的元素包括groupId,artifactId,version,packaging,classifier.只要提供了正确的坐标元素,maven就能找到对应的构件。
groupId定义当前maven项目隶属的实际项目。如springframework这一项目,其对应的maven项目会有很多,如spring-core,spring-context等等,但这些groupId都是org.springframework,只是artifactId不同。而之所以这么划分是由于maven中的模块的概念,因此,一个实际项目往往会被划分成许多模块,这许多模块就通过artifactId来标识。

关于依赖的一些实践:
1.排除依赖。传递性依赖会给项目隐式的引入很多依赖,这极大地简化了项目依赖的管理,但是有些时候这种特性也会带来问题。例如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目,这时就需要排除掉该SNAPSHOT,并且在当前项目中声明该类库的某个正式发布的版本。例子:
<dependencies>
  <dependency>
    <groupId>com.test.mvcbook</groupId>
    <artifactId>project-b</artifactId>
    <version>1.0.0</version>
    <exclusions>
      <exclusion>
         <groupId>com.test.mvcbook</groupId>
         <artifactId>project-c</artifactId>
      </exclusion>
    </exclusions>
  </dependency>

  <dependency>
    <groupId>com.test.mvcbook</groupId>
    <artifactId>project-c</artifactId>
    <version>1.1.0</version>
  </dependency>
</dependencies>
2.归类依赖。有很多关于spring framework的依赖,它们如org.springframework:spring-core:2.5.6,org.springframework:spring-beans:2.5.6,org.springframework:spring-context:2.5.6等,它们来自于同一项目的不同模块,这些依赖的版本是一样的,而且,可以预见,如果将来需要升级spring gramework,这些依赖的版本会一起升级。但修改的时候,可能会遗漏一些,就像在JAVA中,一些常量,我们可以定义一个全局可以访问的public static final的,而不是在每个使用的地方直接写出具体的值。这里maven就有了类似的归类属性:
<properties>
  <springframework.version>2.5.6</springframework.version>
<\properties>

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${springframework.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${springframework.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${springframework.version}</version>
  </dependency>
</dependencies>


jetty-maven-plugin插件来运行Web应用是非常方便的,因为它可以配置成能定期扫描Web应用的任何改变和自动部署Web应用。这就可以消除开发周期中编译和部署的步骤从而更加富有成效。你使用的IDE时对项目做的任何改变,都将直接自动导入到当前运行的web容器里,使您可以立即对其进行测试,立竿见影。
使用上要现在settings.xml里加上这个
<settings>
  <pluginGroups>
    <pluginGroup>org.mortbay.jetty</pluginGroup>
  </pluginGroups>
</settings>
然后在pom里配置插件使用:
<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <version>6.1.10</version>
    <configuration>
         <scanIntervalSeconds>10</scanIntervalSeconds>
         <stopKey>foo</stopKey>
         <stopPort>9999</stopPort>
    </configuration>
</plugin>
运行mvn jetty:run -Djetty.port=9999
如果不指定port的话,默认是8080,这样jetty就启动了

 

依赖包的pom注入,一般可以借助网页:http://search.maven.org/,还是挺好用的。

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics