Maven项目里的pom解析和nexus私服

  • Post author:
  • Post category:其他





一.什么是pom?





POM,即Project Object Model, 通过pom.xml文件配置Maven2,然后Maven2根据此配置执行。作用类似ant的build.xml文件,功能更强大。


该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。


快速查看:




<project>




<modelVersion>4.0.0</modelVersion>






<!– The Basics –>




<groupId>…</groupId>                                                                        <!–


项目组Id,项目组表的核心元素,通常使用和包名一样的策略





>




<artifactId>…</artifactId>                                                                     <!–




项目的通用名称




–>




<version>…</version>                                                                         <!–


项目版本,项目坐标的核心元素(AVG三坐标,还有一个artifactId,各项目不同



)–

>




<packaging>…</packaging>                                                              <!– 打包的机制 –>




<dependencies>…</dependencies>

<!–


依赖配置


–>





<parent>…</parent>                                                                            <!– 父对象–>




<dependencyManagement>…</dependencyManagement>

<!–


依赖配置管理


–>





<modules>…</modules>

<!– 模块 –>





<properties>…</properties>                                                              <!–


自定义maven属性




–>






<!– Build Settings –>




<build>…</build>                                                                                 <!–




其下有很多,包括项目的源码和资源目录设置、输出目录配置、插件配置和插件管理配置等


–>




<reporting>…</reporting>                                                                  <!–


包括项目的报告目录输出配置,报告插件配置等


–>






<!– More Project Information –>




<name>…</name>




<description>…</description>

<!–


项目描述


–>





<url>…</url>                                                                                         <!–


项目地址


–>




<inceptionYear>…</inceptionYear>                                                <!–


项目创始年份




–>




<licenses>…</licenses>

<!– 许可 –>





<organization>…</organization>

<!–


项目组织信息


–>





<developers>…</developers>

<!–


项目开发者信息


–>





<contributors>…</contributors>

<!–


项目贡献者信息


–>







<!– Environment Settings –>




<issueManagement>…</issueManagement>                              <!–


缺陷跟踪系统配置




–>




<ciManagement>…</ciManagement>                                             <!–


项目持续集成系统信息




–>




<mailingLists>…</mailingLists>                                                     <!–


项目邮件列表信息




–>




<scm>…</scm>                                                                                   <!–


版本管理配置信息




–>




<prerequisites>…</prerequisites>                                                  <!– 先决条件 –>




<repositories>…</repositories>                                                       <!–


maven仓库配置




–>




<pluginRepositories>…</pluginRepositories>                             <!– 插件仓库 –>




<distributionManagement>…</distributionManagement>          <!–


部署配置




–>




<profiles>…</profiles>                                                                       <!– 介绍表示–>




</project>




dependencyManagement和dependencies的区别是:dependencyManagement只是声明依赖可选,子项目对于某个依赖,如果不显式声明,那么实际不依赖,所以也不会引入该依赖(jar包)。看起来没什么用,但是可以统一管理依赖版本,减少冲突可能。一旦需要依赖改版本,只需要改一处。dependencies是完全的依赖继承,子项目只要继承该父pom,依赖就会被引入。




基本内容:




POM包括了所有的项目信息。




maven 相关:




pom定义的最小的maven2元素(即


modelVersion,

groupId,artifactId,version



),

groupId:artifactId:version是必须的字段(尽管在继承中groupId和version不需要明确指出)。这三个字段就像地址和邮戳,它标记了仓库中的特定位置,就像Maven projects的坐标系统一样





• groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如org.codehaus.mojo生成的相对路径为:/org/codehaus/mojo




• artifactId: 项目的通用名称




• version:项目的版本




• packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par



• classifier: 分类


POM关系:




主要为依赖,继承,合成




依赖关系:




<dependencies>




<dependency>




<groupId>junit</groupId>




<artifactId>junit</artifactId>




<version>4.0</version>




<type>jar</type>




<scope>test</scope>




<optional>true</optional>




</dependency>








</dependencies>




• groupId, artifactId, version:描述了依赖的项目唯一标志




可以通过以下方式进行安装:




•   使用以下的命令安装:


mvn install:install-file –Dfile=non-maven-proj.jar –DgroupId=some.group –DartifactId=non-maven-proj –Dversion=1




•   创建自己的库,并配置,使用deploy:deploy-file




•   设置此依赖范围为system,定义一个系统路径。不提倡。




•   type:相应的依赖产品包形式,如jar,war




•   scope:用于限制相应的依赖范围,包括以下的几种变量:




1) compile :默认范围,用于编译




2) provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath




3) runtime:在执行时,需要使用




4) test:用于test任务时使用




5) system:需要外在提供相应得元素。通过systemPath来取得




6) systemPath: 仅用于范围为system。提供相应的路径



7) optional: 标注可选,当项目自身也是依赖时。用于连续依赖时使用


独占性




外在告诉maven你只包括指定的项目,不包括相关的依赖。此因素主要用于解决版本冲突问题




<dependencies>




<dependency>




<groupId>org.apache.maven</groupId>




<artifactId>maven-embedder</artifactId>




<version>2.0</version>




<exclusions>




<exclusion>




<groupId>org.apache.maven</groupId>




<artifactId>maven-core</artifactId>




</exclusion>




</exclusions>




</dependency>




表示项目maven-embedder需要项目maven-core,但我们不想引用maven-core






继承关系




另一个强大的变化,maven带来的是项目继承。主要的设置:




定义父项目




<project>




<modelVersion>4.0.0</modelVersion>




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




<artifactId>my-parent</artifactId>




<version>2.0</version>




<packaging>pom</packaging>




</project>




packaging 类型,需要pom用于parent和合成多个项目。我们需要增加相应的值给父pom,用于子项目继承。主要的元素如下:




• 依赖型




• 开发者和合作者




• 插件列表




• 报表列表




• 插件执行使用相应的匹配ids




• 插件配置




• 子项目配置




<project>




<modelVersion>4.0.0</modelVersion>




<parent>




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




<artifactId>my-parent</artifactId>




<version>2.0</version>




<relativePath>../my-parent</relativePath>




</parent>




<artifactId>my-project</artifactId>




</project>




relativePath可以不需要,但是用于指明parent的目录,用于快速查询。






dependencyManagement:




用于父项目配置共同的依赖关系,主要配置依赖包相同因素,如版本,scope。






合成(或者多个模块)




一个项目有多个模块,也叫做多重模块,或者合成项目。




如下的定义:




<project>




<modelVersion>4.0.0</modelVersion>




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




<artifactId>my-parent</artifactId>




<version>2.0</version>




<modules>




<module>my-project1<module>




<module>my-project2<module>




</modules>




</project>






build 设置




主要用于编译设置,包括两个主要的元素,build和report




build




主要分为两部分,基本元素和扩展元素集合




注意:包括项目build和profile build




<project>




<!– “Project Build” contains more elements than just the BaseBuild set –>




<build>…</build>




<profiles>




<profile>




<!– “Profile Build” contains a subset of “Project Build”s elements –>




<build>…</build>




</profile>




</profiles>




</project>






基本元素




<build>




<defaultGoal>install</defaultGoal>                                       <!–

• defaultGoal: 定义默认的目标或者阶段。如install –>





<directory>${basedir}/target</directory>                               <!–

• directory: 编译输出的目录 –>





<finalName>${artifactId}-${version}</finalName>              <!–

• finalName: 生成最后的文件的样式 –>





<filters>




<filter>filters/filter1.properties</filter>

<!–


• filter: 定义过滤,用于替换相应的属性文件,使用maven定义的属性。设置所有placehold的值


–>





</filters>








</build>




资源(resources)




你项目中需要指定的资源。如spring配置文件,log4j.properties




<project>




<build>









<resources>                                                                                               <!–

• resources: resource的列表,用于包括所有的资源 –>





<resource>






<targetPath>META-INF/plexus</targetPath>                                   <!–

• targetPath: 指定目标路径,用于放置资源,用于build –>





<filtering>false</filtering>                                                                    <!–

• filtering: 是否替换资源中的属性placehold –>





<directory>${basedir}/src/main/plexus</directory>                        <!–

• directory: 资源所在的位置 –>





<includes>                                                                                              <!–

• includes: 样式,包括那些资源 –>





<include>configuration.xml</include>




</includes>




<excludes>                                                                                             <!–

• excludes: 排除的资源

–>




<exclude>**/*.properties</exclude>




</excludes>




</resource>




</resources>




<testResources>                                                                                      <!–

• testResources: 测试资源列表 —

>









</testResources>









</build>



</project>




插件




在build时,执行的插件,比较有用的部分,如使用jdk 5.0编译等等




<project>




<build>









<plugins>




<plugin>




<groupId>org.apache.maven.plugins</groupId>




<artifactId>maven-jar-plugin</artifactId>




<version>2.0</version>




<extensions>false</extensions>                                       <!–

• extensions: true or false,是否装载插件扩展。默认false

–>




<inherited>true</inherited>                                                 <!–

• inherited: true or false,是否此插件配置将会应用于poms,那些继承于此的项目

–>




<configuration>                                                                      <!–

• configuration: 指定插件配置

–>




<classifier>test</classifier>




</configuration>




<dependencies>…</dependencies>                                <!–

• dependencies: 插件需要依赖的包

–>




<executions>…</executions>                                             <!–

• executions: 用于配置execution目标,一个插件可以有多个目标。

–>




</plugin>




</plugins>




</build>



</project>




如下:




<plugin>




<artifactId>maven-antrun-plugin</artifactId>






<executions>




<execution>




<id>echodir</id>




<goals>




<goal>run</goal>




</goals>




<phase>verify</phase>




<inherited>false</inherited>




<configuration>




<tasks>




<echo>Build Dir: ${project.build.directory}</echo>




</tasks>




</configuration>




</execution>




</executions>




</plugin>




说明:




• id:规定execution 的唯一标志




• goals: 表示目标




• phase: 表示阶段,目标将会在什么阶段执行




• inherited: 和上面的元素一样,设置false maven将会拒绝执行继承给子插件




• configuration: 表示此执行的配置属性






插件管理




pluginManagement:插件管理以同样的方式包括插件元素,用于在特定的项目中配置。所有继承于此项目的子项目都能使用。主要定义插件的共同元素






扩展元素集合




主要包括以下的元素:




Directories




用于设置各种目录结构,如下:




<build>




<sourceDirectory>${basedir}/src/main/java</sourceDirectory>




<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>




<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>




<outputDirectory>${basedir}/target/classes</outputDirectory>




<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>









</build>






Extensions






表示需要扩展的插件,必须包括进相应的build路径。






<project>




<build>









<extensions>




<extension>




<groupId>org.apache.maven.wagon</groupId>




<artifactId>wagon-ftp</artifactId>




<version>1.0-alpha-3</version>




</extension>




</extensions>









</build>




</project>






Reporting




用于在site阶段输出报表。特定的maven 插件能输出相应的定制和配置报表。




<reporting>




<plugins>




<plugin>




<outputDirectory>${basedir}/target/site</outputDirectory>




<artifactId>maven-project-info-reports-plugin</artifactId>




<reportSets>




<reportSet></reportSet>




</reportSets>




</plugin>




</plugins>




</reporting>






Report Sets




用于配置不同的目标,应用于不同的报表




<reporting>




<plugins>




<plugin>









<reportSets>




<reportSet>




<id>sunlink</id>




<reports>




<report>javadoc</report>




</reports>




<inherited>true</inherited>




<configuration>




<links>




<link>http://java.sun.com/j2se/1.5.0/docs/api/</link>




</links>




</configuration>




</reportSet>




</reportSets>




</plugin>




</plugins>




</reporting>






更多的项目信息




name:项目除了artifactId外,可以定义多个名称




description: 项目描述




url: 项目url




inceptionYear:创始年份






Licenses




<licenses>




<license>




<name>Apache 2</name>




<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>




<distribution>repo</distribution>




<comments>A business-friendly OSS license</comments>




</license>




</licenses>






Organization




配置组织信息




<organization>




<name>Codehaus Mojo</name>




<url>http://mojo.codehaus.org</url>




</organization>






Developers




配置开发者信息




<developers>




<developer>




<id>eric</id>




<name>Eric</name>




<email>eredmond@codehaus.org</email>




<url>http://eric.propellors.net</url>




<organization>Codehaus</organization>




<organizationUrl>http://mojo.codehaus.org</organizationUrl>




<roles>




<role>architect</role>




<role>developer</role>




</roles>




<timezone>-6</timezone>




<properties>




<picUrl>http://tinyurl.com/prv4t</picUrl>




</properties>




</developer>




</developers>






Contributors




<contributors>




<contributor>




<name>Noelle</name>




<email>some.name@gmail.com</email>




<url>http://noellemarie.com</url>




<organization>Noelle Marie</organization>




<organizationUrl>http://noellemarie.com</organizationUrl>




<roles>




<role>tester</role>




</roles>




<timezone>-5</timezone>




<properties>




<gtalk>some.name@gmail.com</gtalk>




</properties>




</contributor>




</contributors>






环境设置






Issue Management




定义相关的bug跟踪系统,如bugzilla,testtrack,clearQuest等




<issueManagement>




<system>Bugzilla</system>




<url>http://127.0.0.1/bugzilla</url>




</issueManagement>




Continuous Integration Management




连续整合管理,基于triggers或者timings




<ciManagement>




<system>continuum</system>




<url>http://127.0.0.1:8080/continuum</url>




<notifiers>




<notifier>




<type>mail</type>




<sendOnError>true</sendOnError>




<sendOnFailure>true</sendOnFailure>




<sendOnSuccess>false</sendOnSuccess>




<sendOnWarning>false</sendOnWarning>




<configuration><address>continuum@127.0.0.1</address></configuration>




</notifier>




</notifiers>




</ciManagement>






Mailing Lists




<mailingLists>




<mailingList>




<name>User List</name>




<subscribe>user-subscribe@127.0.0.1</subscribe>




<unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>




<post>user@127.0.0.1</post>




<archive>http://127.0.0.1/user/</archive>




<otherArchives>




<otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>




</otherArchives>




</mailingList>




</mailingLists>






SCM




软件配置管理,如cvs 和svn




<scm>




<connection>scm:svn:http://127.0.0.1/svn/my-project</connection>




<developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>




<tag>HEAD</tag>




<url>http://127.0.0.1/websvn/my-project</url>




</scm>






以上即为pom文件的具体配置解释。








二.maven有他的私服 也就是nexus 作为maven的中央仓库






向maven中导入非官方的jar:mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id>




-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>






去下载nexus-oss-webapp-1.7.0-bundle.zip,然后解压缩到任意目录下(如E:\nexus)




下载地址:http://nexus.sonatype.org/downloads/




如果操作系统是windows-x86-32 则 进入目录




E:\nexus\nexus-oss-webapp-1.7.0\bin\jsw\windows-x86-32运行nexus.bat在浏览器中输入http://localhost:8081/nexus/index.html




即可进入登录页面 默认用户名密码是admin/admin123




接着说pox.xml文件




配置MAVEN使用NEXUS作为镜像仓库,首先找到${home.dir}/.m2/settings.xml




文件 如果没有.m2文件夹的话,说明你没有运行过MVN,请在命令行中输入MVN命




令,首次运行MAVEN后会自动创建.M2文件夹,然后进入MAVEN的安装路径下的




CONF文件夹,把默认settings.xml 拷贝到${home.dir}/.m2下。接着在此文件中填入以下信息:




<?xml version=”1.0″ encoding=”UTF-8″?>




<settings xmlns=”http://maven.apache.org/SETTINGS/1.0.0″




xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”




xsi:schemaLocation=”http://maven.apache.org/SETTINGS/1.0.0




http://maven.apache.org/xsd/settings-1.0.0.xsd”>




<mirrors>




<mirror>




<!–This sends everything else to /public –>




<id>nexus</id>




<mirrorOf>*</mirrorOf>




<url>http:// 主机ip:端口/nexus/content/groups/public</url>




</mirror>




</mirrors>




<profiles>




<profile>




<id>nexus</id>




<!–Enable snapshots for the built in central repo to direct –>




<!–all requests to nexus via the mirror –>




<repositories>




<repository>




<id>xinxin</id>




<url>http://主机ip:端口/nexus/content/groups/public</url>




<releases><enabled>true</enabled></releases>




<snapshots><enabled>true</enabled></snapshots>




</repository>




</repositories>




<pluginRepositories>




<pluginRepository>




<id>xinxin</id>




<url>http:// 主机ip:端口/nexus/content/groups/public</url>




<releases><enabled>true</enabled></releases>




<snapshots><enabled>true</enabled></snapshots>




</pluginRepository>




</pluginRepositories>




</profile>




</profiles>








<activeProfiles>




<!–make the profile active all the time –>




<activeProfile>nexus</activeProfile>




</activeProfiles>




</settings>






注意:Nexus默认是关闭远程索引下载的,主要是担心会造成对服务器的巨大负担。常用的需要开启的三个仓库分别是Maven Center,Apache Snapshots,Codehaus Snapshots;具体的开启方式(以Maven Center为例):




左侧窗口点击Repositories,右侧会将所有仓库信息显示出来,选中代理仓库Maven Center, 更改Configuration->Download Remote Indexes为true,保存配置后,右击代理仓库Maven Center然后选择ReIndex,如此即可触发Nexus下载远程的索引文件。








三.Nexus中配置自己的数据仓库,及仓库管理






添加一个新的仓库(以添加host仓库为例)




首先以管理员身份登录Nexus,左边导航栏Views/repositories点击Repositories,这样会在右边新窗口列出所有的已知仓库,。




然后点击新窗口左上角的Add按钮,下拉选项中我们选在Host Repositories,这样就打开了一个新增Host数据仓库页面,接下来要做的就是根据自己的需要按照提示填写配置信息,填写完成记得点击save按钮保存。




默认的Local Storage Location会保存在Nexus安装主目录下的\sonatype-work\nexus\storage路径下,如果需要改动,在Overridding Local Storage Location项输入相应的路径即可。因为我们maven中配置的公共仓库组是在public Repostitories组中,所以我们需要把新建的仓库添加至public Repostitories.具体操做如下:




在仓库列表中选中public Repostitories,Configuration –>Available Repositories下将新建仓库(我们这里的新建仓库名为test)拖拽至Ordered Group Repositories,点击save按钮保存配置。




这部操作的时候你可能会疑惑为什么看不到我刚添加的仓库呢,那是因为nexus没刷新,你可以点击刷新按钮刷新下就可以添加了。




给自己的仓库里面上传自己本地的jar包:




选中仓库,选择Artifact Upload。Artifact Upload下一共有两个模块:select GAV Defination source 和 select Artifact(s) for Upload,我们首先在select Artifact(s) for Upload 模块下点击select Artifact(s) for upload按钮上传构件,然后在select GAV Defination source模块填写相关构件配置参数Classifier是用来区分同一版本号的不同版本,如poi-3.0-FINAL.jar,FINAL就是它的Classifier.另外Nexus对构件命名校验很严格,一般规则是“构建名+版本号[+Classifier].构建类型” ,上传时的相关参数填写和Maven的pom.xml配置依赖稍微不匹配就可能导致取不到构件。这点一定要注意。




完成保存之后,一定要记得重建索引不然是不会被发现的。