我正在使用Eclipse 3.51,Maven 2.0.9,Java 1.4,以及带有WTP 2.0的Maven Eclipse插件2.7(不是m2Eclipse)。
我有一个扁平的多模块项目,设置如下(模块Parent表示父pom,模块A和B依赖于C)。
首次导入这四个模块将显示编译错误,因为我没有运行eclipse插件。在我的本地存储库为空的情况下,运行eclipse clean将解决我本地工作空间中的所有编译错误和依赖关系。
如果我要对模块B进行一些小的代码更改并再次运行eclipse插件,则编译错误将显示在模块A和B中。编译有关无法找到的类的错误。它就像模块C不再在A和B的类路径中看到。
我查看.classpath文件,它肯定在Eclipse工作区中查看正确的模块。
如果我删除maven存储库并再次执行eclipse清理,则修复有关未解析类的编译错误。此外,如果我运行eclpse clean命令并将useProjectReferences标志设置为false,然后使用true重新运行它,Eclipse将重建我的工作区,错误将消失。
怎么回事?
答案 0 :(得分:1)
首次导入这四个模块将显示编译错误,因为我没有运行eclipse插件。在我的本地存储库为空的情况下,运行eclipse clean将解决我本地工作空间中的所有编译错误和依赖关系。
到目前为止一切顺利。只有一个问题:通过eclipse clean,你不是指eclipse:clean
而是在Eclipse下清理,对吧?
如果我要对模块B进行一些小的代码更改并再次运行eclipse插件,则编译错误将显示在模块A和B中。编译有关无法找到的类的错误。它就像模块C不再在A和B的类路径中看到。
我不确定为什么你在一个小代码改变到模块B之后运行maven eclipse插件但是,假设你必须例如因为你添加了一个依赖项(提及你运行的目标会更有帮助但是没关系)。当使用带有多项目构建的maven eclipse插件时,默认情况下它将在Eclipse级别使用项目引用(即A和B依赖于C的编译类,而不是C JAR)。由于Maven和Eclipse共享相同的target/classes
文件夹,因此在Maven级别进行清理或编译会使Eclipse混淆。它不再看到已编译的类,也不会自己编译它们(因为Eclipse中没有发生更改)。在这种情况下,Eclipse清理或重建(即在Eclipse级别)应该可以解决问题。
我查看.classpath文件,它肯定在Eclipse工作区中查看正确的模块。
是的,那不是问题。问题来自于Eclipse和Maven共享编译类的相同文件夹。
如果我删除maven存储库并再次执行eclipse清理,则修复有关未解析类的编译错误。
如果你使用项目引用,你真的没有必要这样做,我不知道maven存储库与此有什么关系。在Eclipse下执行清理和/或重建所有项目应该可以解决问题。
另外,如果我运行eclpse clean命令并将useProjectReferences标志设置为false,然后使用true重新运行它,那么Eclipse将重建我的工作区并且错误将消失。
您是否正在使用项目参考?再次,下次,可能在您的问题中提供您的插件配置,这可能会有所帮助。无论如何,你不应该在构建之间触摸这个。决定是否要使用项目引用(我认为它更方便,如果没有它们,您需要mvn install
C来为A和B提供更改)并坚持使用此配置。在mvn
构建之后,Eclipse工作区的重建应该足够了。
PS:请注意,您可以配置maven eclipse插件以使用自定义buildOutputDirectory
,例如target/eclipse-classes
,但这有其他缺点(我没有这样做)。