DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案

背景:

马上跨年了,记得小时候元旦都不是事儿,怎么长大了长大了感觉越来越热闹了反而。各种饭局、各种party,有点hold不住。还是回来整理一下这一年的笔记比较舒服,比较有收获。看了看这个月竟然发文量还不足四篇,遂将Evernote中的一篇老文贴出来水一下,赶巧解决一下之前网友邮件中遇到的相关问题。

dcm4che开源项目:

dcm4che3是github上的开源项目,是java实现的DICOM开源库,采用Maven进行构建。整个工程在Windows文件系统下直接mvn install可以顺利成功。但是导入到Eclipse Mars版本中后出现如下错误:
这里写图片描述

解决方案:

官方参考资料

该问题出现的原因是m2e eclipse plugin for maven插件不支持pom.xml文件中的execution

maven依赖项的作用域

在定义项目的依赖项的时候,我们可以通过scope来指定该依赖项的作用范围。scope的取值有compile、runtime、test、provided、system和import。
compile:这是依赖项的默认作用范围,即当没有指定依赖项的scope时默认使用compile。compile范围内的依赖项在所有情况下都是有效的,包括运行、测试和编译时。
runtime:表示该依赖项只有在运行时才是需要的,在编译的时候不需要。这种类型的依赖项将在运行和test的类路径下可以访问。
test:表示该依赖项只对测试时有用,包括测试代码的编译和运行,对于正常的项目运行是没有影响的。
provided:表示该依赖项将由JDK或者运行容器在运行时提供,也就是说由Maven提供的该依赖项我们只有在编译和测试时才会用到,而在运行时将由JDK或者运行容器提供。
system:当scope为system时,表示该依赖项是我们自己提供的,不需要Maven到仓库里面去找。指定scope为system需要与另一个属性元素systemPath一起使用,它表示该依赖项在当前系统的位置,使用的是绝对路径。

【注意】:
参照上述方案,可以顺利解决eclipse导入dcm4che工程后提示的如下错误,
这里写图片描述
而且可以再eclipse中顺利执行dmc4che的maven编译,因为修改的XXXX/.metadata/.plugins/org.eclipse.m2e.core/lifecycle-mapping-metadata.xml文件其含义就是使得eclipse的maven插件m2e忽略其不能识别的execute以及goal等标签,然而在eclipse主界面中我们可以看到整个dcm4che工程中还存在着上百个错误,提示缺少相关的jar依赖包。
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第1张图片
但是在maven完成编译后我们可以看到各个目录下已经生成了相应的jar包,并且已经顺利安装到了本地maven仓库中,那么为何dcm4che下还有诸多工程提示缺少依赖jar包呢?
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第2张图片
仔细查看一下我们采用官方参考资料中的解决方案发现,我们忽略的execute以及goal对象仅仅解决了m2e控件的错误提示,然而忽略的这两个execute以及goal(注:其实maven的pom.xml中的execute以及goal就类似于VS中常见的编译后事件,也可以说是一种脚本,用户maven各个子模块编译完成后进行相关的依赖性配置。)恰恰是添加maven各模块依赖性的,因此会导致工程中出现缺少jar包的错误提示。
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第3张图片
为了验证这一说法,手动将相应的jar包添加到对应的工程中,发现错误提示减少了,如下图dcm4che-core工程中的除了pom.xml的错误都解决了。
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第4张图片
由此可以推断出,官方给出的解决方案仅仅是解决了m2e控件无法识别的pom.xml部分的错误提示,然而在eclipse工程中pom.xml除了启动maven编译时之外跟工程修改、编译、调试没有关系,因此我们主要的目的并非是解决pom.xml的错误提示,而主要应该解决dcm4che工程下各模块的依赖关系的错误提示。那么如何解决了?eclipse的m2e控件无法识别的pom.xml中的execution和goal标签恰恰是maven用来完成dcm4che工程各模块依赖性的?

最佳解决方案:

其实解决方案很简单,之所以eclipse中的dmc4che工程提示缺少jar包的错误,原因并非是dcm4che工程源码中的pom.xml本身编写有误,而是eclipse匹配的maven插件m2e不能顺利识别execution和goal相关字段。
当初选用eclipse的m2e来进行dcm4che工程的编译,其目的就是为了方便,因为m2e在导入maven工程时会自动进行编译。既然m2e控件有问题,那么我们是否可以先用maven工具编译,待编译完成后再用eclipse工具导入呢?

cd c:\dcm4che3-mvn\dcm4che-master
mvn install
mvn eclipse:eclipse

注:本地使用的maven工具版本为3.2.5
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第5张图片

上述命令行运行成功后,可以看到dcm4che-master各个工程模块下多了一个.project的eclipse工程文件,此时可以通过eclipse的Import直接导入。导入后仅有几个工程的pom.xml文件提示错误,即上文提到的m2e控件无法识别的execution以及goal标签,但是之前提到的dmc4che各模块缺少jar包的错误全部解决了,可以看到pom.xml中控制各模块依赖性的execution以及goal在mvn eclipse:eclipse时已经顺利执行了(maven工具本身是可以识别execution以及goal的),如下图所示:
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第6张图片

解决方案2:

目前我们已经确定了mvn已经顺利编译并生成了各个模块的jar包以及相关代码,之所以提示缺少jar包的错误是因为m2e无法执行配置各模块依赖性的execution,按照错误提示在Eclipse的Marketplace搜索并下载安装相关插件,同样可以解决依赖性问题。
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第7张图片

解决方案3:

在StackOverflow上还有一种简单的处理方案,虽然得票率不高,但是从简便性上来说应该是最靠谱的。
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第8张图片
Errors occurred during the build.
Errors running builder ‘Maven Project Builder’ on project ‘dcm4che-dict’.
No enum constant org.eclipse.m2e.core.lifecyclemapping.model.PluginExecutionAction.executor
Errors running builder ‘Maven Project Builder’ on project ‘dcm4che-js-dict’.
No enum constant org.eclipse.m2e.core.lifecyclemapping.model.PluginExecutionAction.executor
经过验证后,该方案依然无法实行。

安装完插件后,可以再eclipse中编译调试python脚本,另外在配置插件过程中可以利用其“Quick Auto-Config”来解决之前希望制作python绿色免安装包的目的。
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第9张图片
DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案_第10张图片




作者:[email protected]
时间:2015-12-31

你可能感兴趣的:(eclipse,maven,mvn,DICOM,dcm4che)