对于maven, 很多人看似很熟悉,其实貌似根本不了解,本文旨在解决某些方面的疑惑。
当我在service模块引入公司某业务的一个接口,由于该接口依赖了公司写的各种东西和spring等第三方依赖,所以我一下子啥都不用显示依赖了,这叫传递性。而dependencymanagement的作用在于仍然让子模块显示写依赖,但依赖的版本和设置不用写了,简化了。关于jar包的传递依赖,你可以在idea的maven窗口中选定子模块右键show dependencies。
在idea环境中,有时你不得不执行reimport和clean,才能看到jar包引入。另外,请注意你写的version是仓库中确实存在的。
如果公司没有maven私服,完全依赖apache maven库,也许是够用的,碰到其他公司的接口需要你引入他们的jar包时,可以把jar包放在jvm/ext/lib下。
值得一提的是,在模块组织方面,你完全可以把紧密相关的几个系统的放在一起,各个系统的web模块公用一套common, do及dao模块,而不必为每个系统打开一个idea窗口。
pom里已经引入dependency,但很多时候我们需要reimport一下甚至很多下才能看到jar包被真正引入,如果module被ignore了,那么也很可能引入不了jar包。注意,只要dependency没变红,就是ok的。
本地install时,请把当前模块依赖的模块先install一下。
本地测试时,idea开启了自动indexing时,很有可能远程的包会覆盖本地的包,导致本地要重新install。
maven的传递性依赖会导致间接进入一些包而与显示引入的发生冲突,例如,某依赖间接引入了spring2.5.6,模块里显示依赖的是spring3.1.1,spring2.5.6里threadpooltaskexecutor没有submit(runnable)方法,spring3.1.1里有,程序运行时极有可能加载spring2.5.6的threadpooltaskexecutor.class而发生java.lang.nosuchmethoderror。
maven其他注意点:
由于历史原因,maven的核心插件之一——compiler插件默认只支持编译java 1.3,因此需要配置该插件使其支持java 5.
典型的maven配置示例:
父pom
<?xml version="1.0" encoding="utf-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelversion>4.0.0</modelversion>
<groupid>com.ixhong</groupid>
<artifactid>ixhong</artifactid>
<packaging>pom</packaging>
<version>1.0-snapshot</version>
<modules>
<module>ixhong-common</module>
<module>ixhong-admin-web</module>
<module>ixhong-domain</module>
<module>ixhong-dao</module>
<module>ixhong-manager</module>
<module>ixhong-fs-web</module>
<module>ixhong-support-web</module>
<module>ixhong-lender-web</module>
<module>ixhong-base</module>
<module>ixhong-tomcat-web</module>
</modules>
<properties>
<spring.version>3.2.11.release</spring.version>
<ibatis.version>3.2.7</ibatis.version>
<rootdir>${basedir}</rootdir>
</properties>
<dependencies>
<dependency>
<groupid>commons-lang</groupid>
<artifactid>commons-lang</artifactid>
<version>2.6</version>
</dependency>
<groupid>commons-collections</groupid>
<artifactid>commons-collections</artifactid>
<version>3.2.1</version>
<groupid>commons-codec</groupid>
<artifactid>commons-codec</artifactid>
<version>1.10</version>
<!-- -->
<groupid>log4j</groupid>
<artifactid>log4j</artifactid>
<version>1.2.12</version>
</dependencies>
<dependencymanagement>
<dependencies>
<dependency>
<groupid>javax.servlet</groupid>
<artifactid>javax.servlet-api</artifactid>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<groupid>redis.clients</groupid>
<artifactid>jedis</artifactid>
<version>2.8.0</version>
<groupid>org.apache.struts</groupid>
<artifactid>struts2-core</artifactid>
<version>2.2.3.1</version>
<groupid>org.apache.tomcat</groupid>
<artifactid>tomcat-catalina</artifactid>
<version>7.0.57</version>
<artifactid>tomcat-coyote</artifactid>
</dependencies>
</dependencymanagement>
<!--<scm>
<connection>scm:git:[email protected]:qwexyz/qwexyz.git</connection>
<url>scm:git:[email protected]:qwexyz/qwexyz.git</url>
<developerconnection>scm:git:[email protected]:qwexyz/qwexyz.git</developerconnection>
</scm>-->
<build>
<plugins>
<plugin>
<artifactid>maven-compiler-plugin</artifactid>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<artifactid>maven-resources-plugin</artifactid>
<version>2.6</version>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-release-plugin</artifactid>
<version>2.1</version>
</plugins>
</build>
</project>
web
<parent>
<artifactid>ixhong</artifactid>
<groupid>com.ixhong</groupid>
<version>1.0-snapshot</version>
</parent>
<artifactid>ixhong-lender-web</artifactid>
<packaging>war</packaging>
<name>ixhong-user-web</name>
<url>http://maven.apache.org</url>
<!-- 依赖包 -->
<groupid>com.ixhong</groupid>
<artifactid>ixhong-manager</artifactid>
<version>1.0-snapshot</version>
<artifactid>ixhong-common</artifactid>
<groupid>org.mybatis</groupid>
<artifactid>mybatis-spring</artifactid>
<version>1.2.2</version>
<groupid>org.springframework</groupid>
<artifactid>spring-context</artifactid>
<version>${spring.version}</version>
<artifactid>spring-context-support</artifactid>
<artifactid>spring-webmvc</artifactid>
<artifactid>spring-jdbc</artifactid>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>5.1.32</version>
<groupid>org.apache.velocity</groupid>
<artifactid>velocity</artifactid>
<version>1.7</version>
<groupid>javax.servlet</groupid>
<artifactid>javax.servlet-api</artifactid>
<version>3.0.1</version>
<scope>provided</scope>
<groupid>commons-dbcp</groupid>
<artifactid>commons-dbcp</artifactid>
<version>1.4</version>
<groupid>commons-fileupload</groupid>
<artifactid>commons-fileupload</artifactid>
<version>1.3.1</version>
<artifactid>velocity-tools</artifactid>
<version>2.0</version>
<exclusions>
<exclusion>
<groupid>org.apache.struts</groupid>
<artifactid>*</artifactid>
</exclusion>
</exclusions>
<groupid>org.apache.activemq</groupid>
<artifactid>activemq-client</artifactid>
<version>5.11.1</version>
<artifactid>spring-jms</artifactid>
<artifactid>spring-test</artifactid>
<scope>test</scope>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>4.8.2</version>
<finalname>root</finalname>
<outputdirectory>src/main/webapp/web-inf/classes</outputdirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<profiles>
<profile>
<id>development</id>
<activation>
<activebydefault>true</activebydefault>
</activation>
<build>
<filters>
<filter>../profile/development.properties</filter>
</filters>
</build>
</profile>
<id>test</id>
<filter>../profile/test.properties</filter>
<id>production</id>
<filter>../profile/production.properties</filter>
</profiles>
dao
<artifactid>ixhong-dao</artifactid>
<packaging>jar</packaging>
<name>ixhong-dao</name>
<finalname>ixhong-dao</finalname>
<artifactid>ixhong-domain</artifactid>
<artifactid>mybatis</artifactid>
<version>${ibatis.version}</version>
domain
<artifactid>ixhong-domain</artifactid>
<name>ixhong-domain</name>
<finalname>ixhong-domain</finalname>
<groupid>net.sf.json-lib</groupid>
<artifactid>json-lib</artifactid>
<version>2.4</version>
<classifier>jdk15</classifier>
maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构建形式存在,因此,maven核心的分发包只有不到3mb的大小,maven会在需要的时候下载并使用插件。一个插件可能会对应多个目标,一个目标就是一个功能,如maven-dependency-plugin有十多个目标,dependency:analyze,dependency:tree,dependency:list等。
可以使用jetty-maven-plugin启动web应用进行测试。
配置文件
settings.xml中的profile是pom.xml中的profile的简洁形式。它包含了激活(activation),仓库(repositories),插件仓库(pluginrepositories)和属性(properties)元素。profile元素仅包含这四个元素是因为他们涉及到整个的构建系统,而不是个别的pom配置。
如果settings中的profile被激活,那么它的值将重载pom或者profiles.xml中的任何相等id的profiles。
激活(activation)
activations是profile的关键,就像pom中的profiles,profile的能力在于它在特定情况下可以修改一些值。而这些情况是通过activation来指定的。
<settings xsi:schemalocation="http://maven.apache.org/settings/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" xmlns="http://maven.apache.org/settings/1.0.0"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance">
<profiles>
<profile>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-releases</name>
<url>http://maven.whatsmars.com/libs-releases</url>
</repository>
<snapshots />
<id>snapshots</id>
<name>libs-snapshots</name>
<url>http://maven.whatsmars.com/libs-snapshots</url>
</repositories>
<pluginrepositories>
<pluginrepository>
<name>plugins-releases</name>
<url>http://maven.whatsmars.com/plugins-releases</url>
</pluginrepository>
<name>plugins-snapshots</name>
<url>http://maven.whatsmars.com/plugins-snapshots</url>
</pluginrepositories>
<id>artifactory</id>
</profile>
</profiles>
<activeprofiles>
<activeprofile>artifactory</activeprofile>
</activeprofiles>
</settings>
mvn package-dskiptests 打包并且跳过测试
mvn clean install-pdev 激活dev下的profile,这样properties中的配置就会替换成实际值
maven可继承的pom元素
groupid :项目组 id ,项目坐标的核心元素;
version :项目版本,项目坐标的核心元素;
description :项目的描述信息;
organization :项目的组织信息;
inceptionyear :项目的创始年份;
url :项目的 url 地址
develoers :项目的开发者信息;
contributors :项目的贡献者信息;
distributionmanagerment :项目的部署信息;
issuemanagement :缺陷跟踪系统信息;
cimanagement :项目的持续继承信息;
scm :项目的版本控制信息;
mailinglistserv :项目的邮件列表信息;
properties :自定义的 maven 属性;
dependencies :项目的依赖配置;
dependencymanagement :醒目的依赖管理配置;
repositories :项目的仓库配置;
build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
reporting :包括项目的报告输出目录配置、报告插件配置等。
原文链接:[http://wely.iteye.com/blog/2270414]