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远程更新站点列表中了。
WTP: http://download.eclipse.org/webtools/updates/
关于更多的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控制台,如下显示:Figure 14.1. 在Eclipse中开启Maven控制台
Maven控制台显示那些当在命令行运行Maven时出现在控制台的Maven输出。能看到Maven正在干什么,以及根据调试输出来诊断问题,都是很实用的。
在Maven中,我们使用archetype来创建项目。在Eclipse中,我们通过新建项目向导来创建项目。Eclipse中的新建项目向导为创建新项目提供了大量的模板。m2eclipse插件为这个向导增加如下的功能:
从SCM仓库签出一个Maven项目
使用Maven archetype创建一个Maven项目
创建一个Maven POM 文件
如 Figure 14.2, “使用m2eclipse向导来创建一个新项目” 所示,这三个选项对使用Maven的开发人员来说都很重要。让我们逐个看一下。
Figure 14.2. 使用m2eclipse向导来创建一个新项目
m2eclipse提供了直接从SCM仓库签出项目的能力。简单的输入项目的SCM信息,它就会为你签出项目至你所选择的位置,如Figure 14.3, “从Subversion签出一个新的项目”:
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项目
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项目的子项目,后者通常被认为是父项目。
Figure 14.5. 创建一个Maven模块
当创建一个新的Maven模块的时候你必须选择一个在Eclipse中存在的父项目。点击浏览按钮,会看到一个已存在的项目的列表,如Figure 14.6, “为一个新的Maven模块选择一个父项目”:
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”所示:
Figure 14.7. 创建一个新的POM
创建一个新的Maven POM大致就是选择一个项目,在m2eclipse提供的字段中输入Group Id,,Artifact Id,,Version,选择打包类型,以及提供一个名称。点击
按钮开始添加依赖。Figure 14.8. 为新的POM添加依赖
正如你能在Figure 14.8, “为新的POM添加依赖”看到的,POM中现在还没有依赖。点击
按钮以向中央Maven仓库查询依赖,如Figure 14.9, “向中央仓库查询依赖”所示: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选项的项目导入向导:
Figure 14.10. 导入一个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项目
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项目后的向导:
Figure 14.12. Materializing a Maven Project
注意在这个对话框中Maven artifacts是空的。这是因为还没有添加项目。为了添加一个项目,你需要点击右边的
按钮然后选择一个来自中央Maven仓库的依赖以添加。Figure 14.13, “选择一个构件以具体化”展示了如何添加一个项目:Figure 14.13. 选择一个构件以具体化
当输入查询的时候,候选的依赖将会被在本地Maven仓库找到。花几秒钟对本地Maven仓库索引之后,候选依赖列表就会显示。选择一个要添加的依赖然后点击
,这样它们就会被添加到列表中如Figure 14.14, “具体化Apache Camel”。Figure 14.14. 具体化Apache Camel
在添加一个依赖的时候,你有一个选项,让m2eclipse签出这个构件的所有项目。
m2eclipse修改了
和 菜单,以让你能够在Eclipse中运行Maven。Figure 14.15, “通过Run As..运行一个Eclipse构建”展示了一个m2eclipse项目的 菜单。从这个菜单你可以运行一些常用的生命周期过程如clean,install,或者package。你也可以载入运行配置对话框窗口,然后使用参数及更多的选项来配置一个Maven构建。Figure 14.15. 通过Run As..运行一个Eclipse构建
如果你需要用更多的选项来配置一个Maven构建,你可以选择
然后创建一个Maven构建。Figure 14.16, “配置一个Maven构建作为一个运行配置”展示了配置一个Maven构建的运行配置对话框。Figure 14.16. 配置一个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特性
注意在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依赖容器自动更新并包含了这个依赖。
Figure 14.18. 手动给项目的POM添加一个依赖
手动添加依赖效果不错但是它比第二种方式需要更多的工作。在手动给POM添加依赖元素的时候,Eclipse工作台右下角的进程反映了这一动作,如Figure 14.19, “更新Maven依赖”:
Figure 14.19. 更新Maven依赖
第二种添加依赖的方式容易得多,因为你不需要知道构件的除groupId
以外的信息。Figure 14.20, “搜索依赖”展示了这种功能:
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. 搜索构件和类
注意在Figure 14.21, “搜索构件和类”中在Eclipse
菜单下面可用的选项名为 和 。 选项允许你在Maven仓库中搜索POM,如Figure 14.22, “搜索一个POM”:Figure 14.22. 搜索一个POM
选择一个构件然后点击
,这个构件的POM在Eclipse被打开以备浏览或者编辑。当你需要快速看一下某个构件的POM的时候,该功能十分方便。FactoryBean
的很多类,如Figure 14.23, “在仓库中搜索类”:
Figure 14.23. 在仓库中搜索类
这是一个很能节省时间的特性,有了它,手工在Maven仓库中搜索构件中的类成为了过去。如果你需要使用一个特定的类,就打开Eclipse,至菜单
然后搜索类。m2eclipse会显示一个搜索结果构件的列表。Maven索引视图允许你手动的浏览远程仓库的POM并在Eclipse中打开它们。要查看这个视图,打开View → → ,在搜索框中键入单词“maven”,你应该能看到一个名为Maven索引的视图,如Figure 14.24, “打开Maven索引视图”:
Figure 14.24. 打开Maven索引视图
选择这个视图然后点击
。你将会看到如Figure 14.25, “Maven索引视图”的Maven索引视图。Figure 14.25. Maven索引视图
此外,Figure 14.26, “从索引视图定位一个POM”展示手动导航至Maven索引视图之后,定位一个 POM。
Figure 14.26. 从索引视图定位一个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。
Figure 14.27. idiom-core的POM编辑器的Overview标签页
Figure 14.27, “idiom-core的POM编辑器的Overview标签页”中展示的项目的artifactId
是idiom-core
。你会注意到项目idiom-core
的大部分字段是空的。POM编辑器中没有groupId
或者version
,也没有SCM信息。这是因为idiom-core
从一个名为idiom
的父项目中继承了大部分的信息。如果我们在POM编辑器中打开父项目的pom.xml
文件,我们会看到如Figure 14.28, “idiom父项目的POM编辑器的Overview标签页”的Overview标签页。
整个POM编辑器中各种各样的列表条目上的“打开文件夹”图标说明对应的条目在Eclipse workspace中存在,“jar”图标说明构件引用了Maven仓库。你可以双击这些条目,在POM编辑器中打对应的POM。这对模块,依赖,插件和其它对应于Maven构件的元素都是有效的。POM编辑器中一些部分中带下划线的字段代表了超链接,可以用来为对应的Maven构件打开POM编辑器。
Figure 14.28. idiom父项目的POM编辑器的Overview标签页
在这个父POM中,我们看到了groupId
和version
的定义,它还提供了idiom-core
项目所没有很多信息。POM编辑器会给你看你能够编辑的POM内容,它不会给你看任何继承来的值。如果你想在POM编辑器中看idiom-core
项目的有效POM,你可以使用POM编辑器右上角工具栏的“Show Effective POM”图标,该图标的样子是蓝色M字母上面有一个左括弧与等于标记。它会在POM编辑器中为项目idiom-code
载入有效POM如Figure 14.29, “idiom-core的有效POM”。
Figure 14.29. idiom-core的有效POM
这个有效POM归并了idiom-core
的POM和它祖先的POM(父,祖父,等等。),它其实就是使用了“mvn help:effective-pom”命令为idiom-core
编辑器显示有效值。由于POM编辑器显示了很多不同POM归并而来的组合视图,因此这个有效POM编辑器是只读的,你不能更新这个有效POM视图中的任何字段。
如果你正在观察Figure 14.27, “idiom-core的POM编辑器的Overview标签页”中的idiom-core
项目的POM编辑器,你还能够使用编辑器右上角工具栏上的“Open Parent POM”图标来导航至它的父项目的POM。
POM编辑器显示了很多来自POM的不同信息。最后一个标签页将pom.xml
显示为一个XML文档。在Figure 14.30, “POM编辑器的Dependencies标签页”中有一个依赖标签页,它暴露了而一个易用的接口以添加和编辑你项目的依赖,以及POM的dependencyManagement
部分。m2eclipse插件中的依赖管理屏幕也集成了构件搜索功能。你可以用搜索框来取得“Dependency Details”部分的字段信息。
如果你想知道关于某个构件更多的信息,可以使用“Dependency Details”部分的工具栏的“Open Web Page”图标来查看项目的web页面。
Figure 14.30. POM编辑器的Dependencies标签页
Figure 14.31, “POM编辑器的Build标签页”所示的build标签页能让你访问build元素的内容。从这个标签你能够自定义源代码目录,添加扩展,改变默认目标名称,以及添加资源目录。
Figure 14.31. POM编辑器的Build标签页
我们只是展示了POM编辑器功能的一个很小的子集。如果你对余下的标签页感兴趣,请下载并安装m2eclipse插件。
最新版本m2eclipse的POM编辑器提供了一些依赖工具。这些工具承诺要改变人们维护及监视项目传递性依赖的方式。Maven的主要吸引力之一是它能够管理项目的依赖。如果你正在编写一个依赖于Spring Framework的Hibrenate 3集成的应用程序,你所要做的仅仅是依赖来自中央Maven仓库的spring-hibernate3
构件。Maven会读取这个构件的POM然后添加所有必要的传递性依赖。虽然一开始这是一个吸引人们使用Maven的强大特性,但当一个项目有数十个依赖,每个依赖又有数十个传递性依赖的时候这就变得令人费解。
当你依赖于一个项目,这个项目有一个编写得很差的POM,它未能将依赖标记为可选,或者当你开始遇到传递性依赖之间的冲突,这个时候问题就出现了。如果你有一个需求要将类似于commons-logging
或servlet-api
的依赖排除,又或者你需要弄清楚为什么在某个特定的范围下一个特定的依赖显现了,通常你需要从命令行调用dependency:tree
和dependency:resolve
目标来追踪那些令人不愉快的传递性依赖。
这个时候m2eclipse的POM编辑器就便捷多了。如果你打开一个有很多依赖的项目,你可以打开Dependency Tree标签页并查看显示为两列的依赖如Figure 14.32, “POM编辑器的Dependency Tree标签页”。面板的左边显示树状的依赖。树的第一层包含了你项目的直接依赖,每个下一层依赖列出了依赖的依赖。左边的这一块是了解某个特定的依赖如何进入你项目的已解析依赖的很强大方式。面板的右边显示所有已解析的依赖。这是在所有冲突和范围已解决后的有效依赖的列表,也就是你项目将用来编译,测试和打包的有效依赖列表。
Figure 14.32. POM编辑器的Dependency Tree标签页
Dependency Tree标签页这一特性非常有价值,因为它能被用作一个侦测工具来找出某个特定的依赖是如何进入已解析的依赖列表的。编辑器中的搜索和过滤功能使得搜索和浏览项目的依赖变得十分容易。你可以使用编辑器工具栏的搜索框和“Dependency Hierarchy”及“Resolved Dependencies”部分的“排序”和“过滤”图标来查看依赖。Figure 14.33, “在依赖树中定位依赖”展示了当你点击“Resovled Dependencies”列表中的commons-logging的时候会发生什么。当“Dependencies Hierarchy”部分的过滤器被开启的时候,在已解析依赖上点击的时候,面板左边的依赖树会被过滤,以显示所有对已解析依赖起作用的节点。如果你正在试图去除一个已解析依赖,你可以使用这个工具来找出什么依赖(以及什么传递性依赖)对这个已解析的依赖起作用。换句话说,如果你要从你的依赖集合中去除类似于commons-logging
这样的依赖,那么Dependency Tree标签页就是你想要使用的工具。
Figure 14.33. 在依赖树中定位依赖
m2eclipse还能让你以图的形式查看你项目的依赖。Figure 14.34, “以图的形式查看项目的依赖”展示了idiom-core
的依赖。最顶上的方框就是idiom-core
项目,其它的依赖都在它的下面。直接依赖与顶层方框直接相连,传递性依赖则都最终连接这些直接依赖。你可以在图中选择一个节点,跟它相连的依赖会被标亮,或者你可以使用页面顶部的搜索框来寻找匹配的节点。
注意每个图节点上的“打开文件夹”图标说明这个构件存在与Eclipse workspace中,而“jar”图标说明这个节点的构件指向了Maven仓库。
Figure 14.34. 以图的形式查看项目的依赖
通过在编辑器中右击可以改变图的表现形式。你可以选择显示构件的id,group id,version,scope,或者卷起节点文本,显示图标。Figure 14.35, “依赖图的放射状布局”展示了和Figure 14.34, “以图的形式查看项目的依赖”一样的图,但是用了放射状布局。
Figure 14.35. 依赖图的放射状布局
对于使用Maven开发来说,调整Maven首选项和一些Maven参数是非常重要的,m2eclipse能让你通过Eclipse中的Maven首选项页面来调整一些选项。典型情况下当在命令行使用Maven的时候,这些首选项是可以在目录~/.m2
或者命令行选项中设置的。m2eclipse能让你在Eclipse IDE中访问一些最重要的选项。Figure 14.36, “Eclipse的Maven首选项”展示了在Eclipse中的Maven首选项页面:
Figure 14.36. Eclipse的Maven首选项
顶部的复选框提供的功能有:
在离线的状态下运行Maven,关闭从远程仓库进行下载的功能。
在Maven控制台中开启调试输出
从远程Maven仓库下载构件的源码jar文件
从远程Maven仓库下载构件的JavaDoc Jar文件
在启动的时候下载并更新本地的对远程仓库的索引
下一部分提供了一个弹出式菜单,让你选择当项目被引入以及项目的源码文件夹被更新的时候执行什么Maven目标。默认的目标名为process-resources
,它会拷贝并处理项目的资源文件至目标目录,以让项目可以随时打包。如果你需要运行一些自定义的目标以处理资源文件或者生成一些支持性配置,那么定制这个目标列表就非常有用。
如果你需要m2eclipse帮你选择一个目标,点击按钮
,会看到“Goals”对话框。左边的Figure 14.37, “Maven目标对话框”对话框展示了默认Maven生命周期中所有阶段列表的一个目标对话框。Figure 14.37. Maven目标对话框
当你第一次看到这个目标对话框的时候,你可能会被它罗列的这么多目标所吓到。事实上,确实有数百个Maven插件做各种各样的事情,从生成数据库,到执行集成测试,到运行静态分析,到使用XFire生成web service。目标对话框中,带有可选的目标的插件有超过200个,右边的对话框Figure 14.37, “Maven目标对话框”展示了一个Tomcat Maven插件的目标被标亮的“Goals”对话框。你可以通过在搜索框内输入文字来缩小可用目标的数量,当你输入文字的时候,m2eclipse会收缩可用目标的列表,当然,这些目标包含了搜索框内的关键字。
另外一个Maven选项页面是Maven安装配置页面如Figure 14.38, “Maven安装选项页面”:
Figure 14.38. Maven安装选项页面
这个页面能让你往Eclipse环境中添加其它的Maven安装。如果你想要让m2eclipse插件使用一个不同版本的Maven,你可以在这个页面配置多个Maven安装,这非常类似于在Eclipse中配置多个可运行的Java虚拟机。一个被称为Maven嵌入器的Maven的嵌入版本已经被指定了。这就是我们在Eclipse中运行Maven的版本。如果你有另外一个Maven安装,而且你想要用它来运行Maven而不是Maven嵌入器,你可以实时的通过点击
来添加另外的Maven。Figure 14.38, “Maven安装选项页面”展示了一个列出Maven嵌入器,Maven 2.0.9,和Maven 2.1-SNAPSHOT的配置页面。安装配置页面也允许你指定全局Maven settings文件的位置。如果你不在这个页面指定该文件的位置,Maven会使用位于所选Maven安装目录的conf/settings.xml
作为默认全局配置文件。你也可以自定义用户settings文件的位置,默认它位于~/.m2/settings.xml
,你还可以自定义你的本地Maven仓库位置,其默认值是~/.m2/repository
。
Eclipse选项中还能开启一个装饰器,它的名字是Maven版本装饰器。这个选项可以让你在Eclipse包浏览器中看到项目的当前版本,如Figure 14.39, “开启Maven版本装饰器”:
Figure 14.39. 开启Maven版本装饰器
要开启这个选项,只要选中Maven版本修饰器选项,如在Figure 14.39, “开启Maven版本装饰器”中标亮的。如果Maven版本修饰器没有开启,项目只会在包浏览器中列出它的名称和相对路径,如Figure 14.40, “没有Maven版本装饰器的包浏览器”:
Figure 14.40. 没有Maven版本装饰器的包浏览器
开启了Maven版本装饰器之后,项目的名称将会包括当前的项目版本,如Figure 14.41, “开启了Maven版本装饰器的包浏览器”:
Figure 14.41. 开启了Maven版本装饰器的包浏览器
这个特性十分有用,你能很方便的看到项目的版本而不再需要打开POM去找version元素。
m2eclipse不仅仅是一个为Eclipse添加Maven支持的简单插件,它集成得非常全面,从创建新项目到定位第三方依赖,难易度的降低都是数量级的。m2eclipse是对于一个通晓中央Maven仓库这一丰富语义资源的IDE的第一步尝试。随着越来越多的人开始使用m2eclipse,更多的项目将会发布Maven Archetype,更多的项目会看到往Maven仓库发布源码构件的价值。如果你曾经在没有一个能理解Maven层级结构关系的工具的情况下,尝试一起使用Eclipse和Maven,你就会知道支持嵌套项目的这一特性,对于Eclipse IDE和Maven的集成来说,是至关重要的。