我正在编写一个Spring启动应用程序(java类),它调用了另一个java类中的H2o预测方法。
我已经独立测试了这个java类,我可以读取MOJO模型,如果它在调用java的地方,我可以进行预测。
使用Spring启动应用程序,这次我生成的maven项目编译jar无法读取该zip文件。 我使用Wrapper h2o提供的标准方式来读取MOJO zip文件。
EasyPredictModelWrapper model = new EasyPredictModelWrapper(MojoModel.load("DRF_model_python_1504558159175_1.zip"));
我的Maven项目结构如下所示:
生成的Spring启动应用程序包中还包含如下所示的zip:
我不明白为什么它给我错误(它是一个IOexception)它找不到MOJO zip文件。
File DRF_model_python_1504558159175_1.zip cannot be found.
我认为解决方案可能是: 1.在Maven pom文件中添加一些内容,以便生成的jar知道从哪里获取模型。 要么 2.如果MojoModel.load方法接受文件的路径而不仅仅是文件名。但我认为这不起作用。
有什么想法吗?
答案 0 :(得分:2)
您需要更改在项目中加载MOJO zip文件的方式,而不是需要从资源中加载MOJO文件作为流。您可以按照此example查看如何将MOJO放入资源文件夹,然后调用addMOJOsFromJARResource以包含MOJO。
```
import hex.genmodel.MojoReaderBackendFactory;
import static hex.genmodel.MojoReaderBackendFactory.CachingStrategy;
import hex.genmodel.MojoReaderBackend;
import hex.genmodel.ModelMojoReader;
```
public void addMOJOsFromJARResource() {
try {
String[] mojo_names = this.getMOJONames();
for (int i = 0; i < mojo_names.length; i++) {
MojoReaderBackend reader =
MojoReaderBackendFactory.createReaderBackend(
getClass().getResourceAsStream(
"/models/"+mojo_names[i]),
MojoReaderBackendFactory.CachingStrategy.MEMORY);
MojoModel model = ModelMojoReader.readFrom(reader);
this.addModel(model);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
``` 这会奏效。