1

当我们用spoon分析Hadoop这种大项目的源码时,经常会出现“类型xxx已经定义”的问题,因为不同子项目中可能存在类名相同、包目录相同的Java类.

运行“java -cp xx spoon.Launcher -i ~/hadoop-0.23.3-src/ -p myspoon.CatchProcessor”时出现以下错误。

Exception in thread "main" spoon.compiler.ModelBuildingException: The type JobInProgress is already defined
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.reportProblem(JDTBasedSpoonCompiler.java:550)
    at spoon.support.compiler.jdt.TreeBuilderRequestor.acceptResult(TreeBuilderRequestor.java:37)
    at spoon.support.compiler.jdt.TreeBuilderCompiler.buildUnits(TreeBuilderCompiler.java:73)
    at spoon.support.compiler.jdt.JDTBatchCompiler.getUnits(JDTBatchCompiler.java:120)
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnits(JDTBasedSpoonCompiler.java:410)
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnitsAndModel(JDTBasedSpoonCompiler.java:372)
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildSources(JDTBasedSpoonCompiler.java:348)
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:119)
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:102)
    at spoon.Launcher.buildModel(Launcher.java:700)
    at spoon.Launcher.run(Launcher.java:651)
    at spoon.Launcher.run(Launcher.java:106)
    at spoon.Launcher.main(Launcher.java:99)

我发现同一个子项目“hadoop-mapreduce-project”中有两个 JobInProgress.java

./hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/JobInProgress.java
./hadoop-mapreduce-project/src/java/org/apache/hadoop/mapred/JobInProgress.java

那么如何解决这个问题??????我已经发现我们似乎无法同时移开其中一个来运行勺子分析,因为它会导致另一个“丢失文件”的问题

Exception in thread "main" spoon.compiler.ModelBuildingException: The import org.apache.hadoop.conf cannot be resolved at xxx

对问题有任何意见吗?谢谢。

4

1 回答 1

1

像 Hadoop 这样的项目定义了几个独立编译的子模块:那么你不能将整个源代码视为一个大项目。

Spoon 并非旨在支持带有子模块的 maven 项目,因此您必须独立地将每个子模块提交给 Spoon,但这样做必须尊重模块层次结构,更重要的是,您必须使用正确的类路径:例如,如果moduleA是依赖于 module的,那么分析的时候B别忘了传递。B.jarA

于 2017-04-10T07:36:33.890 回答