
When you search for artifacts using http://repository.sonatype.org, the browser is querying the Nexus repository using a REST API. In this post, I’m going to show you some simple Ruby scripts which you can use to search the Maven repository ...
If you are looking for the easiest way to search for artifacts in the Central Maven Repository, go to http://repository.sonatype.org. Sonatype maintains a publi instance of Nexus that can be used to search for artifacts by GAV (groupId, artifactId...
A common question from Apache Maven users is “How do I search the central repository?” or “How do I find out what groupId or artifactId I should use for a specific dependency?” Use Sonatype’s Nexus installation at htt...
One of the users on the m2eclipse user list has some great feedback about a presentation he did at the Stockholm JUG on the best of breed Maven tooling which includes Nexus and m2eclipse. Apparently people are impressed with the Maven support insi...
Maven 3.0 uses a new standalone component that handles inheritance and interpolation of a model in any format. The model needn’t even be XML based. If you can translate your model into a list of property-value pairs, you can use this framewo...
There’s are lots of people who already know that Mark de Visser is the new CEO of Sonatype, but Zack wrote a nice bit about it today in his InfoWorld blog: http://weblog.infoworld.com/openresource/archives/2008/11/marketing_maven.html I am r...
Eclipse IDE是目前Java开发人群中使用得最广泛的IDE。Eclipse有一大堆的插件(请看http://www.eclipseplugincentral.com/),无数的组织在它之上开发他们自己的软件。显然,Eclipse无处不在。m2Eclipse项目在Eclipse IDE中提供了对Maven的支持,本章,我们将会研究它提供的特性,以帮助你在Eclipse IDE中使用Maven。
m2eclipse插件(http://m2eclipse.codehaus.org/)为Eclipse提供了Maven的集成。m2Eclipse同时也以挂钩的方式连接了Subclipse插件(http://subclipse.tigris.org/)和Mylyn插件(http://www.eclipse.org/mylyn/)的特性。Subclipse插件为m2eclipse提供了与Subversion仓库交互的能力,Mylyn插件为m2eclipse提供了与任务集中接口交互的能力,该接口能跟踪开发过程的上下文。m2clipse提供的一些特性包括:
创建和引入Maven项目
依赖管理和与Eclipse classpath的集成
自动下载和更新依赖
构件的Javadoc及源码解析
使用Maven Archetypes创建项目
浏览,搜索远程Maven仓库
通过自动更新依赖列表管理POM
从Maven POM具体化一个项目
从多个SCM仓库签出一个Maven项目
适配嵌套的多模块Maven项目至Eclipse IDE
与 Web Tools Project (WTP)集成
与 AspectJ Development Tools(AJDT) 集成
与 Subclipse 集成
与 Mylyn 集成
基于表单的 POM 编辑器
依赖图的图形化显示
依赖树和已解析依赖的 GUI 展现
在上述列表以外m2eclipse还有很多其它的特性,本章介绍一些更令人印象深刻的特性。让我们从安装e2eclipse插件开始。
要安装m2Eclipse插件,你需要符合一些先决条件。你需要运行Eclipse 3.2或更高版本,JDK 1.4或更高版本,你需要确认Eclipse是在JDK上运行而不是JRE。在你有了Eclipse和兼容的JDK之后,你需要安装两个Eclipse插件:Subclipse和Mylyn。
你可以在安装m2eclipse的时候安装这些前提条件的软件,只要为每个前提条件软件添加一个远程更新站点至Eclipse。要安装这些先决条件软件,找到Help → → 。选择这个菜单项会载入Install/Update对话框。选择“Search for new features to install”选项然后点击。你将会看到一个“Update sites to visit”的列表。点击,然后为每一个新的前提条件添加一个新的更新站点。为每个插件添加新的更新站点然后确认新站点被选择了。在你点击之后,Eclipse会让你选择插件组件以安装。选择你想要安装的组件,Eclipse会下载,安装及配置你的插件。
需要注意的是如果你正在使用Eclipse最新的版本Eclipse 3.4(Ganymede),安装插件的过程可能会有点不一样。在Ganymede中,你需要选择 → ,它会载入"Software Updates and Add-ons"对话框。在这个对话框中,选择“Available Software”面板然后点击,它会载入"Add Site" 对话框。输入更新站点的URL然后点击。在"Software Updates and Add-ons"对话框中会出现更新站点上可用的插件。你可以选择你想要安装的模块然后点击按钮。Eclilpse会解析所选插件的所有依赖,然后要求你同意插件的许可证。在Eclipse安装了新的插件之后,它会征求你的允许以重启。
要安装Subclipse,使用下面的Eclipse插件更新站点。
Subclipse 1.2: http://subclipse.tigris.org/update_1.2.x
想要了解其它版本的Subclipse,以及关于Subclipse插件更多的信息,请访问Subclipse项目的web站点:http://subclipse.tigris.org/。
要安装集成了JIRA支持的Mylyn,添加Mylyn Extras的Eclipse更新URL,如果你的组织使用Atlassian's JIRA来跟踪问题,你会需要这么做。使用下面的更新站点来安装Mylyn:
Mylyn (Eclipse 3.3): http://download.eclipse.org/tools/mylyn/update/e3.3
Mylyn (Eclipse 3.4): http://download.eclipse.org/tools/mylyn/update/e3.4
Mylyn Extras (JIRA 支持): http://download.eclipse.org/tools/mylyn/update/extras
想了解关于Mylyn项目的更多信息,访问Mylyn项目的web站点:http://www.eclipse.org/mylyn/。
如果你正在安装m2eclipse的0.9.4版本,你可能同时也想要安装Web Tools Platform (WTP) 和 AspectJ Development Tools (AJDT)。使用如下的eclipse更新URL以安装AJDT。
AJDT (Eclipse 3.3): http://download.eclipse.org/tools/ajdt/33/update
AJDT (Eclipse 3.4): http://download.eclipse.org/tools/ajdt/34/dev/update
想要了解更多的关于AJDT项目的信息,请访问AJDT项目的web站点http://www.eclipse.org/ajdt/。
要安装Web Tools Platform (WTP)。使用如下的eclipse更新URL,或者直接在Discovery站点中寻找Web Tool Project,该站点应该已经在你的Eclipse远程更新站点列表中了。
关于更多的Web Tools Platform的信息,请访问Web Tools Platform项目的web站点http://www.eclipse.org/webtools/。
一旦你已经安装好这些先决条件,你从如下的Eclipse更新URL安装m2eclipse插件:
m2eclipse 插件: http://m2eclipse.sonatype.org/update/
如果你想要安装最新的该插件的快照开发版本,你应该使用如下的开发更新URL而非之前的URL。
m2eclipse 插件 (开发快照): http://m2eclipse.sonatype.org/update-dev/
要安装m2eclipse,只需要添加一个正确的更新站点。至Help → → ,选择这个菜单项后会载入Install/Update对话框。选择"Search for new features to install"选项然后点击。你将会看到一个"Update sites to visit"列表。点击,然后添加m2eclipse的更新站点。确认这个新添加的站点被选中了。在你点击之后,Eclipse会要求你选择要安装的组件。你选好之后Eclipse会自动下载,安装,和配置m2eclipse。
如果你已经成功安装了这个插件,当你打开Window → 的时候,你应该能够在一个选项列表中看到一个Maven选项。
在我们开始查看m2eclipse的特征之前,首先让我们开启Maven的控制台。通过访问 → → 来打开控制台视图。然后点击控制台视图右手边的一个小箭头,然后选择Maven控制台,如下显示:
Maven控制台显示那些当在命令行运行Maven时出现在控制台的Maven输出。能看到Maven正在干什么,以及根据调试输出来诊断问题,都是很实用的。
在Maven中,我们使用archetype来创建项目。在Eclipse中,我们通过新建项目向导来创建项目。Eclipse中的新建项目向导为创建新项目提供了大量的模板。m2eclipse插件为这个向导增加如下的功能:
从SCM仓库签出一个Maven项目
使用Maven archetype创建一个Maven项目
创建一个Maven POM 文件
如 Figure 14.2, “使用m2eclipse向导来创建一个新项目” 所示,这三个选项对使用Maven的开发人员来说都很重要。让我们逐个看一下。
m2eclipse提供了直接从SCM仓库签出项目的能力。简单的输入项目的SCM信息,它就会为你签出项目至你所选择的位置,如Figure 14.3, “从Subversion签出一个新的项目”:
该对话框中还有其它的选项用来浏览Subversion仓库的修订版以指定某个特定的修订版,或者直接手工输入修订版本号。这些特性重用了Subclipse插件的一些特性以和Subversion仓库相互。除了Subversion,m2eclipse插件也支持下面的SCM提供者:
Bazaar
Clearcase
CVS
git
hg
Perforce
Starteam
Subversion
Synergy
Visual SourceSafe
m2eclipse提供了使用Maven Archetype创建一个Maven项目的能力。伴随着m2eclipse有许多可用的Maven Archetype,如Figure 14.4, “使用Maven Archetype创建一个Maven项目”:
Figure 14.4, “使用Maven Archetype创建一个Maven项目”中的archetype列表是由一个叫Nexus索引器生成的。Nexus是一个仓库管理器,将会在Chapter 16, 仓库管理器介绍。Nexus索引器是一个包含了整个Maven仓库索引的文件,m2eclipse使用它来罗列出所有Maven仓库中可用的archetype。到本章更新为止,m2eclipse大概在这个对话框中有90个archetype。其中比较突出的有:
标准的 Maven Archetypes 以创建
Maven插件
简单Web应用
简单项目
新的Maven Archetypes
Databinder
Archetype (数据驱动的 Wicket 应用程序) 位于
net.databinder
Apache Cocoon
Archetype 位于 org.apache.cocoon
Apache Directory
Server Archetype 位于
org.apache.directory.server
Apache
Geronimo Archetype 位于
org.apache.geronimo.buildsupport
Apache MyFaces
Archetype 位于 org.apache.myfaces.buildtools
Apache
Tapestry Archetype 位于
org.apache.tapestry
Apache Wicket
Archetype 位于 org.apache.wicket
AppFuse Archetype
位于 org.appfuse.archetypes
Codehaus Cargo
Archetype 位于 org.codehaus.cargo
Codehaus
Castor Archetype 位于
org.codehaus.castor
Groovy-based
Maven Plugin Archetype (不推荐使用)[3] 位于
org.codehaus.mojo.groovy
Jini Archetype
Mule
Archetype 位于 org.mule.tools
Objectweb
Fractal Archetype 位于
org.objectweb.fractal
Objectweb
Petals Archetype 位于
org.objectweb.petals
ops4j Archetype 位于 org.ops4j
Parancoe
Archetype 位于 org.parancoe
slf4j Archetype 位于 org.slf4j
Springframework
OSGI 和 Web Services Archetype 位于
org.springframework
Trails
Framework Archetype 位于
org.trailsframework
[3]这些只是由Nexus索引器目录罗列的archetype,如果你切换目录你会看到其它的archetype。虽然你看到的结果会有变化,但是以下额外的archetype能在Internal目录中得到:
Atlassian
Confluence 插件 Archetype 位于
com.atlassian.maven.archetypes
Apache Struts
Archetype 位于 org.apache.struts
Apache Shale Archetype 位于
org.apache.shale
一个目录是对于仓库索引的简单引用。你看以通过点击在catalog下拉菜单旁边的按钮来管理一组m2eclipse已经了解的目录。如果你有你自己的archetype需要加入到这个列表中,可以点击。
一旦你选择了一个archetype,Maven会从Maven仓库取得相应的artifact然后使用这个archetype创建一个新的Eclipse项目。
m2eclipse提供了创建一个Maven模块的能力。创建一个Maven模块和创建一个Maven项目几乎一样,它也会用Maven archetype创建一个新的Maven项目。然而,一个Maven模块是另一个Maven项目的子项目,后者通常被认为是父项目。
当创建一个新的Maven模块的时候你必须选择一个在Eclipse中存在的父项目。点击浏览按钮,会看到一个已存在的项目的列表,如Figure 14.6, “为一个新的Maven模块选择一个父项目”:
在该列表中选择了一个父项目之后,你回到了创建新Maven模块的窗口,父项目字段已被填充,如Figure 14.5, “创建一个Maven模块”所示。点击你将会看到来自Section 14.5.2, “用Maven Archetype创建一个Maven项目”的标准archetype列表,然后你可以选择用哪个archetype来创建Maven模块。
另外一个m2eclipse提供的重要特性是它能创建一个新的Maven POM文件。m2eclipse提供了一个向导,可以用来很轻松的为一个已经在Eclipse中的项目创建一个新的POM文件。这个POM创建向导如Figure 14.7, “创建一个新的POM”所示:
创建一个新的Maven POM大致就是选择一个项目,在m2eclipse提供的字段中输入Group Id,,Artifact Id,,Version,选择打包类型,以及提供一个名称。点击按钮开始添加依赖。
正如你能在Figure 14.8, “为新的POM添加依赖”看到的,POM中现在还没有依赖。点击按钮以向中央Maven仓库查询依赖,如Figure 14.9, “向中央仓库查询依赖”所示:
查询依赖只是简单的输入你需要的构件的groupId。Figure 14.9, “向中央仓库查询依赖”展示了对org.apache.commons的一个查询,其中commons-vfs已被展开以查看可用的版本。选中commons-vfs的1.1-SNAPSHOT版本然后点击,你会回到依赖选择界面,你可以查询更多的构件或者直接点击按钮以创建POM。当你搜索依赖的时候,m2eclipse正使用在Nexus仓库管理器中使用的同样的Nexus仓库索引。
现在你已经看到了m2eclipse创建新项目的特性,让我们看一下一组类似的将项目引入Eclipse的特性。
m2eclipse为导入Maven项目至Eclipse提供了三种选择,分别是:
导入一个已存在的Maven项目
从SCM签出一个Maven项目
具体化一个Maven项目
Figure 14.10, “导入一个Maven项目” 展示了m2eclipse提供的带有Maven选项的项目导入向导:
使用Eclipse中的命令File → ,然后在过滤字段中输入单词maven,就可以看到Figure 14.10, “导入一个Maven项目”的对话框。正如前面提到的,导入一个Maven项目至Eclipse有三种可用的方法:现存的Maven项目,从SCM签出一个项目,以及具体化Maven项目。
从Subversion导入一个Maven项目和前一节讨论的从Subversion创建一个Maven项目是等同的,因此再次讨论就显得冗余了。让我们往前走,看一下导入Maven项目至Eclipse的另外两个选项。
m2eclipse可以通过一个已存在的pom.xml导入一个Maven项目。通过指向Maven项目所在的目录,m2eclipse能探测到该项目中的所有POM,然后提供一个这些POM的层次列表,如Figure 14.11, “导入一个多模块的Maven项目”。
Figure 14.11, “导入一个多模块的Maven项目” 显示了被导入的项目的视图。注意该项目中所有的POM是分层的。这让你能够很简单的选择到你想要导入至Eclipse的POM(也就是你想要导入的项目)。当你选择了你想要导入的项目之后,m2eclipse会使用Maven导入并构建这个项目。
Maven还提供了“具体化”一个Maven项目的能力。具体化类似于从Subversion签出一个Maven项目的过程,但此时Subversion URL是从项目的根POM文件找到的,而不是手工的输入。如果一个POM文件有正确的元素来指定源代码仓库的位置,你就能仅仅通过这个POM文件来“具体化”Maven项目。使用这个特性,你可以浏览中央Maven仓库中的项目,然后将其具体化成Eclipse项目。如果你的项目依赖于一个第三方的开源库,而且你需要查看这个库的源码,具体化的特性就变得十分方便和实用。现在只需要实用m2eclipse魔术般的“具体化”特性将项目导入到Eclipse中,而不是去追查项目的web站点然后寻找如何将其从Subversion签出。
Figure 14.12, “Materializing a Maven Project” 展示了选择具体化Maven项目后的向导:
注意在这个对话框中Maven artifacts是空的。这是因为还没有添加项目。为了添加一个项目,你需要点击右边的按钮然后选择一个来自中央Maven仓库的依赖以添加。Figure 14.13, “选择一个构件以具体化”展示了如何添加一个项目:
当输入查询的时候,候选的依赖将会被在本地Maven仓库找到。花几秒钟对本地Maven仓库索引之后,候选依赖列表就会显示。选择一个要添加的依赖然后点击,这样它们就会被添加到列表中如Figure 14.14, “具体化Apache Camel”。
在添加一个依赖的时候,你有一个选项,让m2eclipse签出这个构件的所有项目。
m2eclipse修改了和菜单,以让你能够在Eclipse中运行Maven。Figure 14.15, “通过Run As..运行一个Eclipse构建”展示了一个m2eclipse项目的菜单。从这个菜单你可以运行一些常用的生命周期过程如clean,install,或者package。你也可以载入运行配置对话框窗口,然后使用参数及更多的选项来配置一个Maven构建。
如果你需要用更多的选项来配置一个Maven构建,你可以选择然后创建一个Maven构建。Figure 14.16, “配置一个Maven构建作为一个运行配置”展示了配置一个Maven构建的运行配置对话框。
运行配置对话框允许你指定多个目标和profile,它暴露了类似于“skip tests”和“update snapshots”的选项,并且允许你自定义从项目到JRE到环境变量的一切。你可以使用这个对话框来支持任何你希望在m2eclipse中启动的自定义Maven构建。
当项目在Eclipse中的时候,m2eclipse插件为使用Maven提供了一组特性。有很多特性使得在Eclipse中使用Maven变得十分容易,让我们仔细看一下。在前一节,我们具体了一个Maven项目并且选择了一个来自于Apache Camel的名为camel-core的子项目。我们将使用这个项目来演示这些特性。
通过在camel-core项目上右击,然后选择Maven菜单项,你能看到可用的Maven特性。Figure 14.17, “可用的Maven特性”展示了这些特性的一个快照。
注意在Figure 14.17, “可用的Maven特性”中camel-core项目可用的特性包括:
添加依赖和插件
更新依赖,快照和源代码文件夹
创建一个Maven模块
下载源代码
打开项目的URL如项目Web页面,问题追踪系统,源码控制,和持续集成工具
开启/关闭工作台解析器,嵌套Maven模块和依赖管理
这些特性都能帮你节省很多时间,让我们先简单的看一下。
让我们假设我们想要给camel-core
POM添加一个依赖或者一个插件。为了示范,我们会添加commons-lang作为一个依赖。(请注意添加依赖或者插件的功能完全一样,因此我们就用添加一个依赖作为示范。)
m2eclipse为给一个项目添加依赖提供了两种选项。第一种选项是通过手动的编辑POM文件的XML内容来添加一个依赖。这种手动编辑POM文件方式的缺点是你必须知道构件的信息,或者,你可以使用下一节讨论的特性来手工的定位仓库索引中的构件信息。好处是在你手工添加依赖并保存POM文件之后,项目的Maven依赖容器会自动更新以包含这个新的依赖。Figure 14.18, “手动给项目的POM添加一个依赖”展示了如何给camel-console
POM
添加对commons-lang的依赖,然后Maven依赖容器自动更新并包含了这个依赖。
手动添加依赖效果不错但是它比第二种方式需要更多的工作。在手动给POM添加依赖元素的时候,Eclipse工作台右下角的进程反映了这一动作,如Figure 14.19, “更新Maven依赖”:
第二种添加依赖的方式容易得多,因为你不需要知道构件的除groupId以外的信息。Figure 14.20, “搜索依赖”展示了这种功能:
通过简单的在搜索框中输入信息,m2eclipse会查询仓库索引,显式在本地Maven仓库中构件的版本。这种方式更好因为它能节省大量的时间。有了m2eclipse,你不再需要中央Maven仓库中搜寻一个构件版本。
m2eclipse使得在一个多模块的Maven项目中创建一系列的嵌套项目变得十分容易。如果你有一个父项目,而且你想给这个项目添加一个模块,只需要在项目上右击,打开Maven菜单,选择“New Maven Module Project”。m2eclipse会带你创建一个新项目,之后他会更新父项目的POM以包含子模块的引用。在m2eclipse出现之前,很难在Eclipse中使用Maven项目的层次特性。有了m2eclipse,父子项目关系的底层细节被集成到了开发环境中。
如果中央Maven仓库包含了某个特定项目的源码构件,你可以从仓库下载这份源码然后在Eclipse环境中使用它。当你正在Eclipse中调试一个复杂的问题的时候,没有什么能比在Eclipse调试器中的第三方依赖上右击然后研究源码来的更方便的了。选择该选项之后,m2eclipse会尝试着从Maven仓库下载源码构件。如果不能取得源码构件,你应该去问项目的维护者,让他上传适当的Maven源码至中央Maven仓库。
一个Maven POM包含一些开发者可能需要查阅的有很有价值的URL。它们包括项目的web页面,源代码仓库的URL,如Hudson之类的持续集成系统的URL,问题追踪系统的URL。如果这些URL在项目的POM中存在,m2eclipse就能在浏览器中打开这些项目页面。
你可以配置项目让它从workspace中解析依赖。这种配置改变了Maven定位依赖构件的方式。如果项目被配置成从workspace解析依赖构件,这些构件就不需要存在于你的本地仓库。假设项目a和项目b都在同一个Eclipse workspace中,项目a依赖于项目b。如果workspace依赖解析被关闭了,项目a的Maven构建只有在项目b的构件存在于本地仓库时才会成功。如果workspace依赖解析开启了,m2eclipse就通过eclipse workspace解析这个依赖。换句话说,当workspace依赖解析开启的时候,项目之间的相互关联不需要通过本地仓库安装。
你也可以关闭依赖管理。这种配置的效果是告诉m2eclipse停止管理你项目的classpath,也会从你项目中移除Maven依赖classpath容器。如果你这么做了,管理你项目的classpath就全靠你自己了。
m2eclipse也提供了一些工具使得使用Maven仓库变得容易一些。这些工具提供的功能包括:
搜索构件
搜索Java类
为Maven仓库编制索引
m2eclipse为Eclipse Navigation菜单添加几个项目,使搜索Maven构件和Java类变得容易。点击菜单就能使用这些选项,如Figure 14.21, “搜索构件和类”:
注意在Figure 14.21, “搜索构件和类”中在Eclipse 菜单下面可用的选项名为和。选项允许你在Maven仓库中搜索POM,如Figure 14.22, “搜索一个POM”:
选择一个构件然后点击,这个构件的POM在Eclipse被打开以备浏览或者编辑。当你需要快速看一下某个构件的POM的时候,该功能十分方便。
菜单中第二个m2eclipse选项名为。该特性允许你通过名称在远程仓库中搜索一个Java类。打开这个对话框,键入‘factorybean’你就能看到名字带有FactoryBean的很多类,如Figure 14.23, “在仓库中搜索类”:
这是一个很能节省时间的特性,有了它,手工在Maven仓库中搜索构件中的类成为了过去。如果你需要使用一个特定的类,就打开Eclipse,至菜单然后搜索类。m2eclipse会显示一个搜索结果构件的列表。
Maven索引视图允许你手动的浏览远程仓库的POM并在Eclipse中打开它们。要查看这个视图,打开View → → ,在搜索框中键入单词“maven”,你应该能看到一个名为Maven索引的视图,如Figure 14.24, “打开Maven索引视图”:
选择这个视图然后点击。你将会看到如Figure 14.25, “Maven索引视图”的Maven索引视图。
此外,Figure 14.26, “从索引视图定位一个POM”展示手动导航至Maven索引视图之后,定位一个 POM。
在找到apache-camel构件之后,双击它会将在Eclipse中打开,以浏览或编辑。
这些特性使得在Eclipse中操作远程仓库变得更快更方便。过去一些年你可能已经花了很多时间来手工的进行这些操作——通过浏览器访问仓库,下载构件然后使用grep程序查找类和POM——你会发现m2eclipse是一种受欢迎的更好的变化。
m2eclipse的最新版本有个基于表单的POM编辑器,能让你通过一个易用的GUI接口来编辑项目pom.xml的每一个部分。要打开POM编辑器,点击项目的pom.xml文件。如果你为pom.xml文件定制了编辑器,POM编辑器不是默认的编辑器,你可以在这个文件上右击然后选择“Open
With... / Maven POM Editor”。POM编辑器会显示Overview标签页如Figure 14.27, “idiom-core的POM编辑器的Overview标签页”。
一个针对Maven的常见的抱怨是,在十分复杂的多模块项目构件中,它让开发人员面对十分巨大的XML文档。虽然本书的作者相信这只是为类似Maven的工具有带来的弹性所付出的小小的代价,但图形化的POM编辑器这样的工具能让用户在不知道Maven POM背后的XML结构的情况下就能使用Maven。