我正在编写一个名为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类:
// 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
?