如何在运行时使nutch插件依赖jar可用

时间:2015-01-28 11:50:17

标签: java plugins ant ivy nutch

我正在编写一个名为entity-extractor的nutch 1.7插件,它取决于Stanford Corenlp库。

Nutch管理与Ivy的依赖关系,所以在我的插件源文件夹中,我有以下ivy.xml:

<!-- ./src/plugins/entity-extractor.ivy.xml -->
<ivy-module version="1.0" xmlns:maven="http://ant.apache.org/ivy/maven">

  ...

  <dependencies>                                                                                                                                                                                             
    <dependency org="edu.stanford.nlp" name="stanford-corenlp" rev="3.4.1">                                                                                                                                  
      <artifact name="stanford-corenlp" />                                                                                                                                                                   
      <artifact name="stanford-corenlp" maven:classifier="models"/>                                                                                                                                          
    </dependency>                                                                                                                                                                                            
  </dependencies>                            
</ivy-module>

在我的plugin.xml中,我指定插件依赖于这些jar及其传递依赖:

<!-- ./src/plugins/entity-extractor/plugin.xml -->
<plugin>

  ...

  <runtime>
    <library name="entity-extractor.jar">
      <export name="*"/>
    </library>                                                                                                                                                                                             
    <library name="stanford-corenlp-3.4.1.jar"/>
    <library name="stanford-corenlp-3.4.1-models.jar"/>

    ...

  </runtime>
</plugin>

当我构建nutch时,这两个依赖项以及其他依赖项都会被复制到./runtime/local/plugins/my-plugin-name下的插件文件夹中。具体来说,该文件夹包含jar stanford-corenlp-3.4.1-models.jar,它不包含任何类,但只包含包含nlp模型的tgz文件。在我的代码中,我可以通过DefaultPaths类:

访问jar中模型的路径
// yields "edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz"
String modelPath = DefaultPaths.DEFAULT_NER_THREECLASS_MODEL;

当模型jar在我的类路径中时,我可以访问文件:

InputStream modelStream = ClassLoader.getSystemClassLoader().getSystemResourceAsStream(modelPath);

我的问题是,只有将以下内容放入(nutch-source-home-dir)/ivy/ivy.xml

中才能生效
<!-- ./ivy/ivy.xml -->
<dependency org="edu.stanford.nlp" name="stanford-corenlp" rev="3.4.1">
  <artifact name="stanford-corenlp" />
  <artifact name="stanford-corenlp" maven:classifier="models"/>
</dependency>

这并不是正确的方法,因为我已经在我的plugin.xml和我的插件源文件夹下的ivy.xml中指定了jar依赖项。在我的代码中,我可以看看SystemClassLoader知道的罐子:

ClassLoader cl = ClassLoader.getSystemClassLoader();

URL[] urls = ((URLClassLoader)cl).getURLs();

for(URL myurl: urls){
    System.out.println(myurl.getFile());
}

通过检查,当我在./ivy/ivy.xml中指定依赖项时,我可以使用我想要的jar,而当我不指定时,则不可用。如何告诉nutch在运行时使我的罐子可用,而不会弄乱./ivy/ivy.xml

0 个答案:

没有答案