zoukankan      html  css  js  c++  java
  • maven打包二进制文件

    用java做数据挖掘的时候,保存一个模型文件用java序列化成一个对象文件,在用maven打包的时候遇到些问题.

    一是做个记录,二是可以帮助大家少走些弯路.

    一.找不到文件

      maven打包路径问题,首先遇到的问题就是,打包后找不到模型文件,模型文件保存在maven工程里的resources

    目录中,路径是resource的相对路径,写单元测试的时候报FileNotFoundException

    原因是项目中部署中添加了

    <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>true</filtering>
    </resource>

    filtering为true,由于是war工程出,maven编译的时候会将resources目录下的文件拷贝到webapp/WEB-INF下的classes目录中,

    导致resources相对路径中找不到文件.

    解决方法:使用类加载器找文件位置

    LoadModel.class.getClassLoader().getResource("*.model").getPath();

     

     

    二.文件反序列化报错

      通过上一步找到了文件,但是在打包后,测试又报错

    可以看出文件是找到了,却报invaild stream header:EFBFBDEF错误,但是把原文件拷贝覆盖编译过的模型文件,测试是正确的这个错误原因是war工程里,

    通过第一步配置将resources目录文件拷贝到classes目录的时候maven会对文件进行过滤,更深成的原因好像是编译的时候会进行utf-8编码,导致文件无法

    正确反序列化,这个解决办法找到两种:

    1.在build中添加<nonFileredFileExtensions>将二进制文件,比如图片格式的文件,指定不要过滤

    <project>
      ...
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.1</version>
            <configuration>
              ...
              <nonFilteredFileExtensions>
                <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
                <nonFilteredFileExtension>swf</nonFilteredFileExtension>
              </nonFilteredFileExtensions>
              ...
            </configuration>
          </plugin>
        </plugins>
        ...
      </build>
      ...
    </project>

    可以看一下官方的说明: http://maven.apache.org/plugins/maven-resources-plugin/examples/binaries-filtering.html

     2.在resources拷贝的时候可以将图片类的二进制文件与配置文件区分开,因为我添加的是model后缀的二进制文件,我的配置如下:

    <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
            <exclude>**/*.model</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
            <include>**/*.model</include>
        </includes>
    </resource>

    这样可以使二进制文件不被maven过滤转码.

     

     

    三.读取不到jar包里的文件

    单元测试成功变green bar,项目打包上传到测试环境,结果还是读取不到模型文件,原因是文件打包后都在jar文件里,

    无法直接读取jar包里的文件类型数据.

    解决方法:通过类加载器读取文件.这个网上有很多说明.

    InputStream in=LoadModel.class.getClassLoader().getResourceAsStream("LRModelForAD.model");

     这个测试有效,另一种读取方式是class.getclass().getresources("")得到一个FileUrl,但是我测试却报空指针异常,

    以后有机会在验证.

     

    欢迎指正.

  • 相关阅读:
    Python 荣登 TIOBE 2020 年度编程语言
    火了!开源的Python抢票神器,过年回家就看这一波了!
    教你怎么用 Python 自动整理文件
    来自程序员的圣诞节浪漫-用Python画一棵带音乐的雪夜圣诞树
    用Python 绘制一个只属于你自己的世界地图
    Python黑科技:暴力破解,你的密码真的安全么?
    小白必读!十大被低估的Python自带库!
    MyEclipse提示MyEclipse Trial Expired(试用期过),破解方法
    转发和重定向的区别
    request内置对象
  • 原文地址:https://www.cnblogs.com/xmeo/p/6673091.html
Copyright © 2011-2022 走看看