【问题标题】:NoSuchMethodError when running UIMA Ruta script from UIMAFIT SimplePipeline从 UIMAFIT SimplePipeline 运行 UIMA Ruta 脚本时出现 NoSuchMethodError
【发布时间】:2014-03-04 01:29:40
【问题描述】:

我正在尝试使用以下代码从 UIMAFIT 简单管道运行现有的 UIMA Ruta 分析引擎:

File specFile = new File("MyEngine.xml");
XMLInputSource in = new XMLInputSource(specFile);
ResourceSpecifier specifier = UIMAFramework.getXMLParser().parseResourceSpecifier(in);
AnalysisEngineDescription aed = (AnalysisEngineDescription) specifier;
builder.add(aed); // Builder is an aggregateBuilder

运行时,它会解析来自引擎主脚本(Cleartk Stanford 工具)的导入,然后退出并出现以下异常:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.uima.ruta.type.RutaBasic.setLowMemoryProfile(Z)V
at org.apache.uima.ruta.RutaStream.initalizeBasics(RutaStream.java:173)
at org.apache.uima.ruta.engine.RutaEngine.initializeStream(RutaEngine.java:575)
at org.apache.uima.ruta.engine.RutaEngine.process(RutaEngine.java:432)
at org.apache.uima.analysis_component.JCasAnnotator_ImplBase.process(JCasAnnotator_ImplBase.java:48)
at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.callAnalysisComponentProcess(PrimitiveAnalysisEngine_impl.java:378)
at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.processAndOutputNewCASes(PrimitiveAnalysisEngine_impl.java:298)
at org.apache.uima.analysis_engine.asb.impl.ASB_impl$AggregateCasIterator.processUntilNextOutputCas(ASB_impl.java:568)
at org.apache.uima.analysis_engine.asb.impl.ASB_impl$AggregateCasIterator.<init>(ASB_impl.java:410)
at org.apache.uima.analysis_engine.asb.impl.ASB_impl.process(ASB_impl.java:343)
at org.apache.uima.analysis_engine.impl.AggregateAnalysisEngine_impl.processAndOutputNewCASes(AggregateAnalysisEngine_impl.java:265)
at org.apache.uima.analysis_engine.asb.impl.ASB_impl$AggregateCasIterator.processUntilNextOutputCas(ASB_impl.java:568)
at org.apache.uima.analysis_engine.asb.impl.ASB_impl$AggregateCasIterator.<init>(ASB_impl.java:410)
at org.apache.uima.analysis_engine.asb.impl.ASB_impl.process(ASB_impl.java:343)
at org.apache.uima.analysis_engine.impl.AggregateAnalysisEngine_impl.processAndOutputNewCASes(AggregateAnalysisEngine_impl.java:265)
at org.apache.uima.analysis_engine.impl.AnalysisEngineImplBase.process(AnalysisEngineImplBase.java:267)
at org.uimafit.pipeline.SimplePipeline.runPipeline(SimplePipeline.java:80)
at org.myproject.workflow.ParagraphAnnotationPipeline.main(ParagraphAnnotationPipeline.java:107)

引擎是使用 Ruta 2.2.0 的预发布版本创建的,并且管道使用 UIMAFIT 2.0.0 和使用 maven 导入的 Ruta-core 2.1.0 在 UIMA 2.5.0 中运行。

感谢您的帮助!

【问题讨论】:

  • 感谢您的提示。我在引擎 xml 描述符和 BasicEngine 描述符中都将 lowMemoryProfile 设置为 false,但这不起作用。我没有直接在 java 中尝试规则形式,但我不想那样做,因为我将有一个大型 Ruta 项目插入到管道中,其中包含各种导入。
  • 实际值并不重要,因为该方法根本不存在。当引擎尝试独立于其值设置值时会发生异常。

标签: uima ruta


【解决方案1】:

这个问题很可能是因为 JCas 类被覆盖了。 UIMA Ruta 提供了一些为播种、推理和附加分析引擎定义的类型的 JCas 类。其中之一(至少,但最重要)包含用于存储有关注释等信息的其他方法:RutaBasic。这些 JCas 类不得被覆盖。

README 中提到了应用 JCasGenPomFriendly 的用户:

If you use the uimaFIT JCasGenPomFriendly in Maven and want to use UIMA Ruta 
as a standalone annotator you have to exclude the generated UIMA Ruta basic 
type files from the build, e.g., by adding:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.0</version>
  <configuration>
     <excludes>
         <exclude>org/apache/uima/ruta/type/*.java</exclude>
     </excludes>
  </configuration>
</plugin> 

您能否检查一下您是否生成了 RutaBasic,以及该类是否包含例如方法 setLowMemoryProfile。

【讨论】:

  • 感谢您的回答。我不确定我知道我明白这一切。我将排除项添加到我的管道项目和 Ruta 项目的 pom 文件中,但仍然发生异常。如何检查我是否生成 Ruta basic?我检查了目标文件夹中的 RutaBasic.class,但找不到内存方法的匹配项。但也许这不是你的意思。
  • 如果您没有找到 setLowMemoryProfile 方法,那么这很好地表明该类是重新生成的。您是否可能在您的类型系统描述符之一中导入了 Ruta 类型系统描述符(BasicTypeSystem.xml 或 InternalTypeSystem),然后使用组件描述符编辑器生成了 JCas 类? RutaBasic 类通常不应该出现在项目的目标中,但应该使用 ruta-core 依赖的 RutaBasic 类。
  • 其实我是这样做的。在我的 Ruta 项目中,我为额外的注释器添加了一些 java 代码,为此我使用了额外的类型系统描述符和 JCasGen 来自动生成描述符文件。我宁愿不把它放到外部项目中,因为我只需要在 Ruta 上下文中使用这些注释器。我该如何解决这个问题?
  • 你至少需要删除RutaBasic.javaRutaBasic_Type.java这两个类。最好删除完整的源文件夹org.apache.uima.ruta.type
  • 做到了!我删除了完整的源文件夹,然后系统无法编译。我从 pom 文件中删除了排除项,并从我的自定义类型系统描述符中再次运行 JCasGen。然后我的脚本再次运行,我可以将它导入到我的管道中。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多