在Spring启动应用程序

时间:2017-09-24 17:22:00

标签: java maven spring-boot machine-learning h2o

我正在编写一个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项目结构如下所示:

enter image description here

生成的Spring启动应用程序包中还包含如下所示的zip:

enter image description here

我不明白为什么它给我错误(它是一个IOexception)它找不到MOJO zip文件。

File DRF_model_python_1504558159175_1.zip cannot be found.

我认为解决方案可能是: 1.在Maven pom文件中添加一些内容,以便生成的jar知道从哪里获取模型。 要么 2.如果MojoModel.load方法接受文件的路径而不仅仅是文件名。但我认为这不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您需要更改在项目中加载MOJO zip文件的方式,而不是需要从资源中加载MOJO文件作为流。您可以按照此example查看如何将MOJO放入资源文件夹,然后调用addMOJOsFromJARResource以包含MOJO。

项目:https://github.com/h2oai/h2o-tutorials/tree/f67765bc6c68c2058d4b2786d1bbc627d3b70539/tutorials/hive_udf_template/hive_udf_mojo_template

  1. MOJO zip存储在src / main / resources / model
  2. 您需要将h2o-genmodel类引用到
  3. ```

     import hex.genmodel.MojoReaderBackendFactory;
     import static hex.genmodel.MojoReaderBackendFactory.CachingStrategy;
     import hex.genmodel.MojoReaderBackend;
     import hex.genmodel.ModelMojoReader;
    
    1. 此功能包括所有MOJO.zip(是的,您可以添加多个MOJO)到您的项目中
    2. ```

        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();
              }
          }
      

      ``` 这会奏效。